шаблоны проектирования — PHP MVC: делиться моделью между контроллером и представлением

Я работаю над своим проектом PHP (H) MVC, в котором я отделил представления от контроллеров — как в ответе Как модель должна быть структурирована в MVC?. Их отношения 1: 1, поэтому у них одинаковые «действия». Поэтому в bootstrap.php после их создания я вызываю:

// ... Controller and view are already instantiated.
call_user_func_array(array($controller, $actionName), $actionParameters);
call_user_func_array(array($view, $actionName), $actionParameters);

Скажем, контроллер и представление становятся для каждого из них моделью (объектом домена) в качестве параметра конструктора.
С помощью Auryn В контейнере внедрения зависимостей я пытаюсь разделить один и тот же экземпляр модели между контроллером и представлением, не создавая его заранее. Например. до создания экземпляра контроллера и представления в bootstrap.php.

В своем ответе Терешко описывает использование модели / сервиса фабрики. Но в качестве «записки» он говорит:

…Гораздо лучшая реализация будет иметь контейнер DI (например,
Auryn) для создания контроллеров и представлений, только с необходимыми
услуги, вместо использования фабрики.

Мой вопрос: могу ли я реализовать эту функциональность без фабрики моделей, используя контейнер внедрения зависимостей?
Я как бы застрял в этой задаче, и я действительно не знаю, возможно ли это как-то.
Спасибо.

0

Решение

Да, ты можешь.

Но это довольно странно. В основном вам нужно настроить службу как «общую»:

<?php
$injector->define('MailerService', [
':server' => 'fak.it',
':port' => '443',
]);
$injector->share('MailerService');

$controller = $injector->make('FooBarController');

Это предполагает, что ваш контроллер был определен примерно так:

<?php
class FooBarController
{
public function __construct(MailerService $service)
{
// ...
}
}

В этом аспекте автономный Symfony DI компонент немного проще в использовании, потому что вы можете поместить такую ​​конфигурацию в файл json или yaml.

Постскриптум Вы, вероятно, должны абстрагировать свой пользовательский ввод как своего рода Request объект ant передает это в ваш контроллер при каждом вызове метода.

Вроде как:

<?php
$request = new Request( .. something here maybe .. );
$controller->action($request);

Сделайте для немного более красивого кода 🙂

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]