A free and open-source book on ZF3 for beginners


4.23. Тонкие контроллеры, толстые модели, простые представления

При разработке сайта с использованием паттерна «модель-представление-контроллер», существует риск непонимания роли контроллеров, представлений и моделей. Это приводит к созданию огромных контроллеров и маленьких моделей, что в свою очередь делает крайне сложным тестировать и поддерживать ваше приложение. Целью этой главы является ознакомить вас с тем, какой код можно размещать в классе контроллера, какой - в шаблоне представления, а какой - в классе модели.

4.23.1. Тонкие контроллеры

Смысл термина "тонкий контроллер" в том, что, как правило, в ваших классах контроллера вы размещаете только код, который:

Классу контроллера не следует:

Ниже, в качестве примера "тонкого" контроллера представлен класс CurrencyConverterController. Контроллер имеет метод действия "convert", который конвертирует определенное количество денег из евро (EUR) в доллары (USD). Пользователь передает количество денег через GET-переменную "amount".

class CurrencyConverterController extends AbstractActionController 
{  
    // Модель конвертера валюты
    private $currencyConverter;

    // Конструктор. Его цель - "внедрение" зависимостей.
    public function __construct($currencyConverter)
    {
        $this->currencyConverter = $currencyConverter;
    }

    // Действие "convert" отображает количество конвертированных денег
    public function convertAction() 
    {  
        // Получаем кол-во денег от GET
        $amount = (float)$this->params()->fromQuery('amount', -1);
    
        // Проверяем входящие данные
        if($amount<0) {
            // Money amount is missing
            $this->getResponse()->setStatusCode(404);
            return;
        }
 
        // Передаем данные модели CurrencyConverter
        $convertedAmount = $this->currencyConverter->convertEURtoUSD($amount);	
		
        return new ViewModel([
           'amount'=>$amount,
           'convertedAmount'=>$convertedAmount
        ]);
    }
}

Метод действия контроллера, представленный выше, делает следующее:

4.23.2. Толстые модели

Так как вам нужно оставлять ваши контроллерами настолько тонкими, насколько это возможно, большинство бизнес-логики вашего приложения следует размещать в классах моделей. В грамотно написанном приложении «модель-представление-контроллер», модели получаются огромными. Класс модели может содержать код, который:

В классе модели не рекомендуется:

Если вы будете следовать этим принципам, вы заметите, что ваши модели легко тестируются, потому что у них есть четко идентифицируемые ввод и вывод данных. Вы можете написать юнит-тест, передающий некие данные на вход модели, извлекающий выходные данные и подтверждающий, что данные корректны.

Если вы не уверены в том, располагать определенный код в контроллере или модели, спросите себя: является ли это важной бизнес-логикой, которую нужно тщательно протестировать? Если ответ "да", вам следует расположить код в модели.

4.23.3. Простые шаблоны представления

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

Шаблону представления не рекомендуется:

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


Top