Как получить доступ к routeParser slim4 с настройкой PHP -DI, ​​продемонстрированной в Slim-Skeleton? - PullRequest
1 голос
/ 07 января 2020

Я создал новое приложение на основе приложения Slim Skeleton команды Slim PHP команды. Внутри моих определений маршрутов я хочу иметь возможность доступа к анализатору маршрутов как , описанному в документации Slim4 . Так, например, я хотел бы иметь возможность редактировать файл приложения / маршрутов скелета. php файл примерно так:

    $app->get('/', function (Request $request, Response $response) {
        $routeParser = $app->getRouteCollector()->getRouteParser();  // this doesn't work
        $response->getBody()->write('Hello world! ' . $routeParser->urlFor('something'));
        return $response;
    });

Имеет смысл, что $app->getRouteCollector()->getRouteParser() не работает, потому что $app здесь не определено. Но я думаю, что вместо этого мы бы назвали $this->getRouteCollector()->getRouteParser();, но это дает ошибку: "Call to undefined method DI\\Container::getRouteCollector()".

Определенно кажется, что мое заблуждение связано с инъекцией зависимости, которая является новой для меня и не является естественной для меня. Честно говоря, я бы хотел определить переменную $ routeParser где-нибудь еще (внутри index. php?), Чтобы я мог получить к ней доступ в любом определении маршрута, не вызывая каждый раз $ app-> getRouteCollector () -> getRouteParser () , Но в данный момент я согласен на все, что сработало.

Ответы [ 2 ]

2 голосов
/ 07 января 2020

Вам не нужен экземпляр приложения. Вы можете использовать RouteContext, чтобы получить RouteParser:

$routeParser = \Slim\Routing\RouteContext::fromRequest($request)->getRouteParser();
1 голос
/ 07 января 2020

Тонкий скелет на самом деле демонстрирует пример того, чего вам нужно достичь. После создания экземпляра приложения в индексе. php, существует следующее назначение:

// Instantiate the app
AppFactory::setContainer($container);
$app = AppFactory::create();
$callableResolver = $app->getCallableResolver();

Вы можете сделать то же самое:

$routeParser = $app->getRouteCollector()->getRouteParser();

И если вам действительно нужно, чтобы этот экземпляр RouteParser был доступен внутри каждого обратного вызова маршрута, вы можете поместить его в контейнер зависимостей, например, так:

$container->set(Slim\Interfaces\RouteParserInterface::class, $routeParser);

Затем вы можете использовать функцию автоматического подключения PHP -DI для вставьте этот RouteParser в конструктор контроллера:

use Slim\Interfaces\RouteParserInterface;
class SampleController {
    public function __construct(RouteParserInterface $routeParser) {
        $this->routeParser = $routeParser;
        //...
    }
}

или если вам нужно вызвать $container->get() внутри любого из ваших обратных вызовов маршрута:

$app->get('/', function (Request $request, Response $response) {
    $routeParser = $this->get(Slim\Interfaces\RouteParserInterface::class);
    $response->getBody()->write('Hello world! ' . $routeParser->urlFor('something'));
    return $response;
});
...