У меня есть обычный класс php за пределами контроллера, поэтому он не использует автоматическую инъекцию контейнера. Мне нужно получить доступ к объекту ответа из этого класса, и я предполагаю, что я должен получить его из контейнера. Каков правильный способ доступа к нему? Просто передайте его как аргумент, чтобы внешний класс мог его использовать? Есть ли способ лучше ?Правильный способ доступа к контейнеру из класса не в тонком контроллере
ответ
Если вам нужно отправить подзапрос, Slim provides such functionality. Используйте его carefully, хотя, как и в некоторых ситуациях, его результат не очевиден.
<?php
class MySortOfOutsideClass
{
/**
* If you need to send a subrequest, you have to access application instance,
* so let's inject it here.
*/
public function __construct(\Slim\App $app)
{
$this->$app = $app;
}
/**
* Method that makes a subrequest, and returns the result of it.
*/
public function myMethod()
{
if ($subRequestIsRequired) {
return $this->app->subRequest('GET', '/hello');
}
}
}
Для этого вам необходимо использовать промежуточное ПО, потому что объект ответа неизменен, поэтому «изменение» не будет обновлять ответ, который будет использоваться тонким.
$app->add(function($request, $response, $next) {
if($shouldRedirect === true) {
return $response->withRedirect('myurl'); // do not execute next middleware/route and redirect
}
return $next($request, $response); // execute next middleware/ the route
});
Дополнительную информацию о промежуточном программном обеспечении have a look at this.
Спасибо, будет расследовать это. Быстрый вопрос: возможно ли инициировать процесс тонкого маршрута (который будет запускать промежуточное ПО) из «внешнего» файла, который не находится внутри контроллера? –
@RobertBrax Я не понимаю, вы запускаете выполнение с помощью '$ app-> run();' – jmattheis
Да, приложение работает нормально, но я хочу вызвать процесс запроса из файла класса, который не находится в контроллере. Представьте, что у меня есть файл «authRequired.php», который не находится в контроллере, но все же должен иметь возможность выполнять перенаправление изнутри. –
зачем вам нужен объект ответа – jmattheis
ли сделать редирект –