Я работаю над своим проектом 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) для создания контроллеров и представлений, только с необходимыми
услуги, вместо использования фабрики.
Мой вопрос: могу ли я реализовать эту функциональность без фабрики моделей, используя контейнер внедрения зависимостей?
Я как бы застрял в этой задаче, и я действительно не знаю, возможно ли это как-то.
Спасибо.
Да, ты можешь.
Но это довольно странно. В основном вам нужно настроить службу как «общую»:
<?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);
Сделайте для немного более красивого кода 🙂
Других решений пока нет …