Архив рубрики: Zend Framework 2

Разработка приложения с помощью Zend Framework 2

1. Приложение необходимо разбивать на модули. Модуль включает в себя какую-то сущность и связанные с ней действия. Например, это может быть пользователь и контроллеры, отвечающие за вход/регистрацию, личный кабинет (настройки) и управление пользователями. Раньше я, разумеется, использовал модульность, но, как правило, модуль был достаточно весомым, он включал хоть и независимую (относительно) часть приложения, но все же там могли оказаться, например, и пользователи, и форум. Предложенная модель модулей в ZF2 предполагает соблюдения принципа единственной ответственности на более высоком уровне (по сравнения с классом или методом).

2. Событийная модель — очень мощная штука. Она помогает следовать принципу единственной ответственности на более низком уровне. Простой пример: при регистрации пользователя надо отправить ему письмо (может, и что-то еще). В этом случае вы сохраняете пользователя и генерируете событие, например, «регистрация». Все подписанные на это событие выполнят свое предназначение.

3. Dependency Injection — об этом много и давно говорится на просторах интернета. Я рассматриваю DI с точки зрения удобства модульного тестирования, когда любую зависимость можно легко подменить моком. Например, при тестировании класса, взаимодействующего с базой данных, вам не хочется делать реальные запросы, так как вы тестируете в данный момент вовсе не это.  С другой стороны DI делает код более гибким, когда изменить используемый алгоритм не составит труда — нужно лишь передать новый объект, который будет реализовывать тот же интерфейс. Например, для создания пароля вам захочется изменить алгоритм на более надежный.

Отдельный лейаут для модуля в Zend Framework 2

Эта заметка является вольным (и неполным) переводом поста Эвана Коури «Module-specific layouts in Zend Framework 2«.

Нужно заметить, что название данного поста не совсем корректно, так как в ZF2 не существует ничего отдельного (специального) для модуля. На деле же речь идет об основном пространстве имен контроллера, которое совпадает с названием модуля.

Поэтому есть очень простой способ переключить лейаут для контроллеров отдельного модуля:

<?php
namespace MyModule;

use Zend\ModuleManager\ModuleManager;

class Module
{
    public function init(ModuleManager $moduleManager)
    {
        $sharedEvents = $moduleManager->getEventManager()->getSharedManager();
        $sharedEvents->attach(__NAMESPACE__, 'dispatch', function($e) {
            // Это событие будет происходить только для контроллеров в MyModule
            $controller = $e->getTarget();
            $controller->layout('layout/alternativelayout');
        }, 100);
    }
}

Данное событие произойдет только при диспатче ActionController, который находится в пространстве имен MyModule, поэтому нет необходимости проверять, какой именно это модуль.