говнокодю некоторый код
сервис
PHP:
class Debugger { private $display; private $handler; public function __construct($display, $handler) { $this->display = $display; $this->handler = $handler; } public function __invoke(Request $request, Response $response) { throw new ErrorException($text, 0, $code, $file, $line); }); set_exception_handler(function (Throwable $throwable) use ($request, $response) { new $this->handler, // не будет автовайринга, нужно сделать — container->get($this->handler) $request, $response, [ ‘code’ => $throwable->getCode(), ‘text’ => $throwable->getMessage(), ‘file’ => $throwable->getFile(), ‘line’ => $throwable->getLine(), ] ); }); } }провайдер
PHP:
class DebuggerProvider extends Provider { public function register() { $this->app->container->set(Debugger::class, function () { $debugger = $this->app->container->get(‘debugger’); return new Debugger( $debugger[‘display’], $debugger[‘handler’] // строка ‘DebuggerAction::class’ ); }); } public function boot(Request $request, Response $response) { $this->app->container->get(Debugger::class), $request, $response ); } }экшен
PHP:
class DebuggerAction extends Action { private $view; public function __construct(View $view) // не будет работать если экшен не вызван из контейнера { $this->view = $view; // хотелось бы так // $this->view = new View(); // не ну можно и так сделать } public function __invoke(Request $request, Response $response, $args) { $response->statusCode(404); // или $response->statusCode($args[‘code’]); } }как мне в сервисе стартануть $this->handler из контейнера, чтобы работал автовайринг?
есть мысль такая
PHP:
class DebuggerProvider extends Provider { public function register() { $this->app->container->set(Debugger::class, function () { $debugger = $this->app->container->get(‘debugger’); return new Debugger( $debugger[‘display’], $this->app->container->get($debugger[‘handler’]) // создали экземпляр, поместив его в контейнер ); }); } public function boot(Request $request, Response $response) { $this->app->container->get(Debugger::class), $request, $response ); } } class Debugger { private $display; private $handler; public function __construct($display, $handler) { $this->display = $display; $this->handler = $handler; // тут уже экземпляр экшена из контейнера, в нём будет работать автовайринг } public function __invoke(Request $request, Response $response) { throw new ErrorException($text, 0, $code, $file, $line); }); set_exception_handler(function (Throwable $throwable) use ($request, $response) { $this->handler, // вызвали экземпляр экшена, new не нужно делать, отработает магия $request, $response, [ ‘code’ => $throwable->getCode(), ‘text’ => $throwable->getMessage(), ‘file’ => $throwable->getFile(), ‘line’ => $throwable->getLine(), ] ); }); } } class DebuggerAction extends Action { private $view; public function __construct(View $view) // будет работать — экшен вызван из контейнера { $this->view = $view; } public function __invoke(Request $request, Response $response, $args) { $response->statusCode(404); // или $response->statusCode($args[‘code’]); } }Но что мне не нравится, если в провайдере собирать сервис, передавая в конструктор экземпляр экшена — это то, что если ошибки нет в приложухе, то в контейнере постоянно висит как бы лишний экземпляр этого экшена, это нормально?
p.s. если я прокину резольвер (не понимаю сути резольвера, он использует контейнер, так не проще ли использовать везде контейнер, позволив контейнеру автовайрить самого себя) в сервис с параметрами вместе при сборке, то нарушится как бы общая логика сервиса — если его взять отдельно, то тогда нужно чтобы и там был резольвер))) поэтому сервис собирается без передачи в конструктор — резольвера (фактически контейнера)
Похожие записи:
- Тестирование операций CRUD с некоторыми особыми случаями с использованием Cucumber
- Небольшая библиотека для SFML для упрощения выполнения программы
- Игра движения на основе плитки в Java 2D
- А можно ли вообще сделать выброс из register_shutdown_function?
- Более быстрая, индексированная, эвристическая структура данных двусвязного списка в Java: реализация