个性化阅读
专注于IT技术分析

如何在Symfony 2和3中的模板上使用Twig执行原则查询

本文概述

有时由于复杂的设计模式, 或者由于对数据库的查询知识掌握的技能不足, 你不得不在视图中进行查询。直到Symfony 2成为问题为止, 因为你可以使用php从视图访问实体管理器, 但是随着Symfony 2中引入Twig的实现, 这变得越来越难。请记住, 这不是一个好习惯, 因为它不能与MVC工作流程一起完成。

但是, 如果你很着急, 这将为你解决问题:

  • 创建一个包含树枝扩展名的类。
  • 写扩展名。
  • 在你的应用程序中注册扩展名。
  • 在模板上测试你的方法。

我们将在TwigExtension中注入, 这将允许你使用功能或过滤器在php文件中进行查询, 并在Twig中返回它。在这种情况下, 我们将仅使用函数。如果你想知道如何创建树枝过滤器, 请在以下链接中阅读树枝的官方文档。

建立类

在项目的某个位置创建一个名为TwigExtensions.php的文件(你需要知道名称空间, 稍后我们将需要它)。在此示例中, 我们将在项目的/ src文件夹中创建一个名为Extensions的文件夹。因此, 在这种情况下, 名称空间将是ourcodeworld \ Extensions。了解要创建的要在services.yml文件中注册的类的名称空间很重要。

写扩展名

我们的TwigExtensions.php文件内容应该看起来像(并且类名也需要匹配[TwigExtensions]):

<?php
// Note that the namespace must match with
// your project !
namespace ourcodeworld\Extensions;

use Symfony\Bridge\Doctrine\RegistryInterface;

class TwigExtensions extends \Twig_Extension
{    
    public function getFunctions()
    {
        // Register the function in twig :
        // In your template you can use it as : {{find(123)}}
        return array(
            new \Twig_SimpleFunction('find', array($this, 'find')), );
    }
    
    protected $doctrine;
    // Retrieve doctrine from the constructor
    public function __construct(RegistryInterface $doctrine)
    {
        $this->doctrine = $doctrine;
    }

    public function find($id){
        $em = $this->doctrine->getManager();
        $myRepo = $em->getRepository('ourcodeworldarticlesBundle:Articles');
        ///

        return $myRepo->find($id);
    }
    
    public function getName()
    {
        return 'Twig myCustomName Extensions';
    }
}

在上一课中, 我们注册了一个名为find的方法, 该方法可以使用twig进行访问:

{# Find a register with id 2 #}

{{dump(find(2))}}

请注意, 你需要更改存储库的名称(更改find​​函数的工作方式), 然后就可以开始使用了。该函数的名称需要在twig中注册为一个函数, 因此你需要在该类的getFunctions方法的返回数组中注册它。该类的构造函数期望将学说作为参数(这将允许你在此类中执行查询), 它将在下一步中发送, 因此如果你不了解, 请不要担心。

注册服务

现在, 该类已存在, 你需要在项目的/ app / config路径中的services.yml文件中注册。如前所示, 该类期望将Doctrine作为第一个参数, 现在我们将使用yml来发送它。使用以下方法注册你的服务:

services:
    twig.extension:
        # Register the class (The namespace must match)
        class: ourcodeworld\Extensions\TwigExtensions
        # Inject doctrine as first parameter
        arguments: 
            doctrine : '@doctrine'
        tags:
          -  { name: twig.extension }

最后, 不要忘记清除项目的缓存。

在模板上测试

现在, 你将可以在模板上使用find方法。请注意, 这些方法是全局的, 可以从所有模板中访问。

<h1>Hello, the title of this article is {{find(123).title}}</h1>

玩得开心

赞(0)
未经允许不得转载:srcmini » 如何在Symfony 2和3中的模板上使用Twig执行原则查询

评论 抢沙发

评论前必须登录!