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

本文概述

  • 建立类
  • 写扩展名
  • 注册服务
  • 在模板上测试
有时由于复杂的设计模式, 或者由于对数据库的查询知识掌握的技能不足, 你不得不在视图中进行查询。直到Symfony 2成为问题为止, 因为你可以使用php从视图访问实体管理器, 但是随着Symfony 2中引入Twig的实现, 这变得越来越难。请记住, 这不是一个好习惯, 因为它不能与MVC工作流程一起完成。
【如何在Symfony 2和3中的模板上使用Twig执行原则查询】但是, 如果你很着急, 这将为你解决问题:
  • 创建一个包含树枝扩展名的类。
  • 写扩展名。
  • 在你的应用程序中注册扩展名。
  • 在模板上测试你的方法。
我们将在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>

玩得开心

    推荐阅读