Как добавить вид ветки в slimframework v4
Я пытаюсь добавить веточку-представление в Slim V4
В Slim v3 мы добавляем просмотр веток в контейнере
$container['view'] = function ($c) {
$view = new \Slim\Views\Twig('path/to/templates', [
'cache' => 'path/to/cache'
]);
// Instantiate and add Slim specific extension
$router = $c->get('router');
$uri = \Slim\Http\Uri::createFromEnvironment(new \Slim\Http\Environment($_SERVER));
$view->addExtension(new \Slim\Views\TwigExtension($router, $uri));
return $view;
};
но я не могу добавить такую веточку в Slim V4
1 ответ
Обратите внимание, что на момент написания этого ответа Twig-View еще не достиг стабильной версии, поэтому ваш код может сломаться в ближайшей функции.
Цитата из Slim 4 документа:
В Slim 4 используется необязательный контейнер зависимостей. Вам не нужно предоставлять контейнер зависимостей. Однако, если вы это сделаете, вы должны предоставить экземпляр контейнера в AppFactory перед созданием приложения.
Это запрос на перенос, который портирует Twig-View на Slim 4.
Как видно из примера, представленного в запросе на получение, вам необходимо создать контейнер, использовать его для создания TwigMiddleware, а затем добавить это промежуточное ПО в ваше приложение.
Предполагая следующую структуру каталогов:
composer.json
public
|--index.php
templates
|--hello.twig
vendor
|--autoload.php
Вот рабочий пример:
я использую php-di/php-di
в этом примере ( use DI\Container
линия), но вы можете использовать любой PSR-совместимый контейнер зависимостей.
index.php:
<?php
use Slim\Views\Twig;
use Slim\Views\TwigExtension;
use Slim\Views\TwigMiddleware;
use Slim\Factory\AppFactory;
use DI\Container;
require __DIR__ . '/../vendor/autoload.php';
$container = new Container();
AppFactory::setContainer($container);
$app = AppFactory::create();
$routeParser = $app->getRouteCollector()->getRouteParser();
$twig = new Twig(__DIR__ . '/../templates');
$twigMiddleware = new TwigMiddleware($twig, $container, $routeParser);
$app->add($twigMiddleware);
$app->get('/hello/{name}', function ($request, $response, $args) {
return $this->get('view')->render($response, 'hello.twig', [
'name' => $args['name']
]);
});
$app->run();
hello.twig:
Hello {{ name }}
Теперь попробуйте посетить /hello/slim4
в вашем браузере и вывод будет:
Привет slim4
SlimTwigView находится на бета-версии 3.0.0 (по крайней мере, по состоянию на 12 октября 2019 г.), и некоторые вещи изменились. Несколько онлайн-руководств, которые я видел, а также официальная документация больше не работают.
TwigMiddleware больше не принимает экземпляр контейнера $ в качестве аргумента, поэтому сначала необходимо вручную поместить Twig в контейнер, например:
$container->set('view', function() {
// Of course put correct path to your views here
return new Twig('../views', ['cache' => false]);
});
Затем вы можете добавить TwigMiddleware в свое Slim-приложение, используя новый метод createFromContainer класса, например:
$app->add(TwigMiddleware::createFromContainer($app));
// which is equivalent to:
// $app->add(TwigMiddleware::createFromContainer($app, 'view'));
На этом этапе вы можете визуализировать представление Twig следующим образом:
$app->get('/', function (Request $request, Response $response, $args) {
return $this->get('view')->render($response, 'home.twig');
});
При использовании промежуточного программного обеспечения для Slim теперь у вас есть доступ к дополнительным расширениям Twig:
url_for full_url_for is_current_url current_url get_uri
Хорошо! В моем случае я использовал Slim 4.0 и Twig ^2.5. Все, что я добавил в свой код, было
$container->set('view', function () use ($container) {
$view = new \Slim\Views\Twig(
__DIR__ .'/Templates'
, [ 'cache' => false ] //you can turn on caching by providing string path to cache or set to false
);
return $view;
});