本文概述
有时由于复杂的设计模式, 或者由于对数据库的查询知识掌握的技能不足, 你不得不在视图中进行查询。直到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>
玩得开心
评论前必须登录!
注册