Хотя на вопрос уже есть принятый ответ, я хотел бы предложить подход с точки зрения тестируемости. Готовые фреймворки часто не проектируют свои контроллеры с учетом тестируемости, поэтому подобные вопросы возникают снова и снова.
Хорошо написанный, тестируемый контроллер должен принимать представление как зависимость, введенную с помощью метода __construct
контроллера. Однако я не знаю, позволяют ли контроллеры CodeIgniter использовать эту функцию.
В парадигме MVC Контроллер «объединяет» элементы Представления и Модели, поэтому, как и любая поведенческая зависимость, если эти объекты предоставляют какую-либо функциональность помимо «тупого» хранения данных, они должны быть внедрены в ваш контроллер при время создания экземпляров, чтобы их можно было смоделировать для целей тестирования. Итак, вы бы сделали что-то вроде следующего:
$view = new SmartyView;
$model = new UserModel;
$controller = new LoginController($view, $model);
Зачастую модель не предоставляет общедоступных методов "поведения" и выступает в качестве базового объекта хранения данных. Если это так, то по той же причине, по которой вам не нужно вводить структуру данных массива в контроллер для создания новых массивов, вы можете безопасно создавать новые экземпляры модели внутри вашего контроллера, не жертвуя тестируемостью:
class LoginController
{
protected $view;
public function __construct(ViewInterface $view)
{
$this->view = $view;
}
public function doLogin($user, $pass)
{
$userModel = new UserModel();
// do stuff with model to determine if user/pass was valid
}
}
$view = new SmartyView;
$controller = new LoginController($view);
Для обеспечения возможности тестирования рекомендуется избегать тесной связи ваших контроллеров с вашими представлениями и моделями. Вот почему вы должны избегать использования ключевого слова new
внутри кода вашего контроллера. Ваш контроллер - и любой другой объект, в этом отношении - должен ASK для его зависимостей, а не LOOK для них. Это приведет к более прозрачным API, более тестируемому коду, меньшему количеству хлопот отладки и сделает вас счастливее.