Для полноты я собираюсь расширить отличный ответ, данный @jDolba
К сожалению, хотя это и заставило меня двигаться в правильном направлении, все же потребовалось немного экспериментов, чтобы все заработало.
По сути, как описано в документации по тонкому маршрутизатору.
Сигнатура обратного вызова маршрута определяется стратегией маршрута. По умолчанию Slim ожидает, что обратные вызовы маршрута будут принимать запрос, ответ и массив аргументов-заполнителей маршрута. Это называется стратегией RequestResponse. Однако вы можете изменить ожидаемую сигнатуру обратного вызова маршрута, просто используя другую стратегию. Например, Slim предлагает альтернативную стратегию под названием RequestResponseArgs, которая принимает запрос и ответ, а также каждый заполнитель маршрута в качестве отдельного аргумента. Вот пример использования этой альтернативной стратегии; просто замените зависимость foundHandler, предоставленную по умолчанию \Slim\Container
:
$c = new \Slim\Container();
$c['foundHandler'] = function() {
return new \Slim\Handlers\Strategies\RequestResponseArgs();
};
$app = new \Slim\App($c);
$app->get('/hello/{name}', function ($request, $response, $name) {
return $response->write($name);
});
Вы можете предоставить свою собственную стратегию маршрутизации, внедрив \Slim\Interfaces\InvocationStrategyInterface
.
однако для задачи по вставке некоторых стандартизированных данных в массив $args[]
класс \Slim\Handlers\Strategies\RequestResponse
по умолчанию делает все необходимое, исключая вставку данных.
Таким образом, я просто расширил этот класс:
<?php
namespace MyProject\Handlers\Strategies;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use \Slim\Handlers\Strategies\RequestResponse;
class SomeNewInvocationStrategy extends RequestResponse
{
/**
* Invoke a route callable.
*
* @param callable $callable The callable to invoke using the strategy.
* @param ServerRequestInterface $request The request object.
* @param ResponseInterface $response The response object.
* @param array $routeArguments The route's placholder arguments
*
* @return ResponseInterface|string The response from the callable.
*/
public function __invoke( callable $callable, ServerRequestInterface $request, ResponseInterface $response, array $routeArguments)
{
$routeArguments['test'] = 'testing testing 123';
return parent::__invoke( $callable, $request, $response, $routeArguments );
}
}
Мое объявление контейнера выглядит так:
<?php
use Slim\App;
return function (App $app) {
$container = $app->getContainer();
$container['foundHandler'] = function() {
return new MyProject\Handlers\Strategies\SomeNewInvocationStrategy();
};
}
Затем во всех действиях моего контроллера у меня есть доступ к $args['test']
. Кроме того, это можно передать прямо в любое представление Twig.
Это полезно для таких задач, как контроль доступа, когда я всегда хочу загружать роли пользователей перед обработкой запроса, но я уверен, что для этого будет много других вариантов использования.
Надеюсь, это кому-нибудь поможет.
person
DazBaldwin
schedule
09.08.2019