Как использовать внедрение зависимостей в Zend Framework?

В настоящее время я пытаюсь изучить Zend Framework и поэтому купил книгу «Zend Framework в действии».

В главе 3 представлены базовая модель и контроллер, а также модульные тесты для них обоих. Базовый контроллер выглядит следующим образом:

class IndexController extends Zend_Controller_Action 
{
    public function indexAction()
    {
        $this->view->title = 'Welcome';
        $placesFinder = new Places();
        $this->view->places = $placesFinder->fetchLatest();
    }
}

Places - это класс модели, который выбирает последние места из базы данных. Что меня здесь беспокоит: как мне проверить IndexController в изоляции ? Поскольку ссылка на класс Places является «жестко закодированной», я не могу вставить любые заглушки или макеты в IndexController .

То, что я хотел бы иметь, выглядит примерно так:

class IndexController extends Zend_Controller_Action 
{
    private $placesFinder;

    // Here I can inject anything: mock, stub, the real instance
    public function setPlacesFinder($places)
    {
        $this->placesFinder = $places;
    }

    public function indexAction()
    {
        $this->view->title = 'Welcome';
        $this->view->places = $this->placesFinder->fetchLatest();
    }
}

Первый пример кода, который я разместил, определенно НЕ подходит для модульного тестирования, так как IndexController нельзя протестировать изолированно. Второй намного лучше. Теперь мне просто нужен какой-то способ внедрить экземпляры модели в объекты контроллера.

Я знаю, что Zend Framework сам по себе не имеет компонента для внедрения зависимостей. Но есть несколько хороших фреймворков для PHP, могут ли они использоваться вместе с Zend Framework? Или есть какой-то другой способ сделать это в Zend Framework?

16
задан Max 5 September 2010 в 07:19
поделиться