Как добавить вид ветки в 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;
});
Другие вопросы по тегам