2016-05-04 3 views
0

меня есть интерфейсLaravel 4 - инъекция зависимости на основе конфигурации?

interface RecordsService { 
    public function getRecords(); 
} 

и две реализации:

public class ApiRecordsService implements RecordsService { 
    public function getRecords() { 
    //get records from api 
    } 
} 


public class DbRecordsService implements RecordsService { 
    public function getRecords() { 
    //get records from db 
    } 
} 

Теперь в моем контроллере я DI, как это:

class RecordsController { 
    private $recordsService; 

    public function __construct(RecordsService $recordsService) { 
    $this->recordsService= $recordsService; 
    } 
} 

И я связываю это так:

App::bind('RecordsService', 'ApiRecordsService'); 

Теперь мой вопрос, можно ли это реализовать более динамично, в зависимости от конфигурации, что-то вроде этого:

switch(Config::get('config.records_source')){ 
    case 'db': 
    App::bind('RecordsService', 'DbRecordsService'); 
    break; 
    case 'api': 
    App::bind('RecordsService', 'ApiRecordsService'); 
    break; 
} 

и что более важно, это хорошая практика?

ответ

1

Вы можете использовать для что annonymous функции так:

App::bind('RecordsService', function() { 
    switch(Config::get('config.records_source')){ 
     case 'db': 
      return new DbRecordsService; 
     case 'api': 
      return new ApiRecordsService; 
    } 
}); 
Смежные вопросы