如何从twig _Symfony3调用php函数

时间:2018-02-07 08:59:39

标签: php symfony twig

我想在twig中调用控制器的功能。我该怎么做

这是我的控制器

class ArticleController extends Controller
{
   /**
    * @Route("Article")
    */
   public function indexAction()
   {
       ....................... 
       return $this->render('MainBundle:Article:index.html.twig', array(
               'lastArticleCategoryData' => $lastArticleCategoryData
            ));
   }
   public function datajalali()
   {
       $articles = "sss";
       $v = new Verta(); //1396-02-02 15:32:08
       $v = Verta::now();

       return $v;
   }
}

我的树枝

{% if Article.datajalali %}
   {{ datajalali }}
{% endif %}

3 个答案:

答案 0 :(得分:3)

通常,您无法直接在twig中调用PHP函数。

但是,你可以写一个Twig扩展名

http://symfony.com/doc/current/templating/twig_extension.html

在你的情况下它应该看起来像这样

// src/Twig/AppExtension.php
namespace App\Twig;

use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;

class AppExtension extends AbstractExtension
{
    public function datajalali()
    {
        $articles = "sss";
        $v = new Verta(); //1396-02-02 15:32:08
        $v = Verta::now();

        return $v;
    }

}

话虽如此,我想你可以做点像

{{ render(controller(
    'AppBundle\\Controller\\ArticleController ::datajalali'
)) }}

但说实话,这对我来说似乎是不好的做法。我不完全确定它也能正常工作。

答案 1 :(得分:1)

尝试将datajalali发送到模板,如下所示:

    return $this->render('MainBundle:Article:index.html.twig', array(
           'lastArticleCategoryData' => $lastArticleCategoryData,
           'datajalali' => $this->datajalali(),
        ));

请参阅How to Embed Controllers in a Template

<强>更新

Andrew和Jonathan Jalouzot告诉你关于twig扩展,但这种方式对于symfony3和symfony4是不同的。在你的情况下它看起来像这样:

class AppExtension extends \Twig_Extension
{
    public function getFunctions()
    {
        return array(new \Twig_Function('datajalali', array($this, 'datajalali')));
    }

    public function datajalali()
    {
        // Your logic here
    }
}

并在模板中使用它:

{{ datajalali() }}

请参阅How to Write a custom Twig Extension

答案 2 :(得分:0)

您需要关注http://symfony.com/doc/current/templating/twig_extension.html

您需要创建扩展树枝。

namespace App\Twig;

use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;
use Verta;

class AppExtension extends AbstractExtension
{
    public function getFunctions()
    {
        return array(
            new TwigFunction('datajalali', array($this, 'datajalali')),
        );
    }

    public function datajalali()
    {
        $articles = "sss";
        $v = new Verta(); //1396-02-02 15:32:08
        $v = Verta::now();

        return $v;
    }
}

您需要在使用标记twig.extension例如

添加服务之后
//service.yml
App\Twig\AppExtension:
    tags: ['twig.extension']

你可以在你的树枝模板中使用

//twig
{{ datajalali() }}