【问题标题】:how to add twig-view in slimframework v4如何在苗条框架 v4 中添加 twig-view
【发布时间】:2019-12-19 14:42:13
【问题描述】:

我正在尝试在 slim v4 中添加 twig-view

在 slim v3 中,我们在容器中添加了 twig-view

$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 中添加这样的树枝

【问题讨论】:

    标签: php slim slim-4


    【解决方案1】:

    更新Twig-View 已达到稳定版本,文档已更新以解决 Slim 4 集成问题。
    如果您是仍在使用不稳定版本的 Twig-View,请考虑升级。

    首先,您需要将 Twig-View 包添加到您的项目中:

    composer require slim/twig-view
    

    并假设以下目录结构:

    composer.json
    cache/
    public/
      |--index.php
    templates/
      |--hello.twig
    vendor/
      |--autoload.php
    

    以下是两个工作示例:

    如果您使用容器(根据Slim 4 docs 是可选的),您可以将Tiwg 创建定义添加到容器中,并在需要时使用它。 (我在这个例子中使用php-di/php-di,但你可以使用任何 PSR 兼容的依赖容器。

    index.php,使用容器

    <?php
    
    use DI\Container;
    use Slim\Factory\AppFactory;
    use Slim\Views\Twig;
    use Slim\Views\TwigMiddleware;
    
    require  __DIR__ . '/../vendor/autoload.php';
    
    // Create Container
    $container = new Container();
    AppFactory::setContainer($container);
    
    // Set view in Container
    $container->set('view', function() {
        return Twig::create(__DIR__ . '/../templates',
            ['cache' => __DIR__ . '/../cache']);
    });
    
    // Create App
    $app = AppFactory::create();
    
    // Add Twig-View Middleware
    $app->add(TwigMiddleware::createFromContainer($app));
    
    // Example route
    $app->get('/hello/{name}', function ($request, $response, $args) {
        return $this->get('view')->render($response, 'hello.twig', [
            'name' => $args['name']
        ]);
    });
    
    // Run the app
    $app->run();
    

    您也可以跳过容器创建,但在这种情况下,您需要在尝试渲染模板之前创建 Twig 实例。

    index.php,没有容器

    <?php
    
    use Slim\Factory\AppFactory;
    use Slim\Views\Twig;
    use Slim\Views\TwigMiddleware;
    
    require __DIR__ . '/../vendor/autoload.php';
    
    // Create App
    $app = AppFactory::create();
    
    // Create Twig
    $twig = Twig::create(__DIR__ . '/../templates',
        ['cache' => __DIR__ . '/../cache']);
    
    // Add Twig-View Middleware
    $app->add(TwigMiddleware::create($app, $twig));
    
    // Example route
    // Please note how $view is created from the request
    $app->get('/hello/{name}', function ($request, $response, $args) {
        $view = Twig::fromRequest($request);
        return $view->render($response, 'hello.twig', [
            'name' => $args['name']
        ]);
    });
    
    // Run the app
    $app->run();
    

    hello.twig

    Hello {{ name }}
    

    现在尝试在浏览器中访问/hello/slim4,输出将是:

    你好 slim4

    【讨论】:

    • Slim 4 不是 Alpha。在撰写本文时,稳定版已于两周前发布。
    【解决方案2】:

    好吧!就我而言,我使用的是 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;
    });
    

    【讨论】:

    • 您好。我不确定这是一个附加问题的答案,还是只是一个问题。我命令它不要被审核队列删除,我选择了前者。如果您仍然想问您的问题,请在the edit history 中咨询。这部分最好作为一个新问题添加。
    【解决方案3】:

    SlimTwigView 处于 3.0.0 测试版(至少截至 2019 年 10 月 12 日),有些事情已经改变。我看过的几个在线教程,以及官方文档都不再起作用了。

    TwigMiddleware 不再将 $container 的实例作为参数,因此您必须先手动将 Twig 放在 Container 上,例如:

    $container->set('view', function() {
        // Of course put correct path to your views here
        return new Twig('../views', ['cache' => false]);
    });
    

    然后您可以使用类的新 createFromContainer 方法将 TwigMiddleware 添加到您的 Slim 应用程序中,如下所示:

    $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 当前网址 get_uri

    【讨论】:

    • 如果有人卡在这里没有得到TwigMiddleware,并且如果你安装了最新的Slim,你需要确保你正在安装"slim/twig-view": "3.0.0-beta"才能得到TwigMiddleware,那么对于我必须 new Twig('../views'new Twig(__DIR__ . '/../resources/views'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多