2012-02-23 2 views
1

У меня текущая ситуация:избежать параллельного наследования с сервисом локаторами

А имеет абстрактный класс, Controller, который имеет зависимости, которые вводятся во время выполнения с помощью службы локатора, Locator. Локатор сервиса правильно реализован - он не передается по всему приложению и потребляется только Controller, который является корневым объектом приложения.

Проблема, с которой я сталкиваюсь, заключается в том, как структурировать локатор (ы) службы, когда я наследую от Controller - я не обязательно хочу (и предпочел бы) не расширять базовый сервисный локатор Locator, но мне нужно дублируйте зависимости родительского класса.

Вот некоторые примеры кода, чтобы объяснить, что происходит:

// Controller.php 
namespace abstract; 

abstract class Controller { 
    public function __construct($locator) { 
     $this->template_handler = $locator->getTemplateHandler(); 
     $this->input_sanitizer = $locator->getInputSanitizer(); 
    } 
} 

-

// Controller.php 
class Controller extends abstract\Controller { 
    public function __construct($locator) { 
     $this->data_factory = $locator->getDataFactory(); 

     parent::__construct($locator); 
    } 
} 

-

// Locator.php 
namespace abstract; 

class Locator { 
    public function getTemplateHandler() { 
     return 1234; 
    } 

    public function getInputSanitizer() { 
     return 1234; 
    } 
} 

Так что я думаю, вопрос становится - как я определяю мой Locator класс? Должен ли я продлить abstract\Locator (создание параллельного дерева наследования), реализовать те же методы без расширения abstract\Locator (этот дублирующий код), или я делаю что-то другое, о чем я не думал?

+1

'namespace abstract;' недопустимый синтаксис – Vitamin

+2

Это очень верно. Я также забыл о своих требованиях, а 'Controller' не имеет других методов, кроме конструктора. Спасибо за проницательный совет. –

ответ

0

Вы должны использовать один локатор во всех контроллерах. Разумеется, если услуги не очень специфичны. В противном случае, какова была бы цель локатора службы, если бы вам нужно было сначала найти требуемый локатор?

Смежные вопросы