14

symfony2.3 を学習していますが、twig テンプレートでコントローラー名を取得しようとするとエラーが発生します。

コントローラ:

namespace Acme\AdminBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;

class DefaultController extends Controller
{
    public function indexAction($name)
    {
        return $this->render('AcmeAdminBundle:Default:index.html.twig', array('name' => $name));
    }
}

私のTWIGテンプレートでは:

{% extends '::base.html.twig' %}
{% block body %}
 {{ app.request.get('_template').get('controller') }}
 Hello {{ name }}!!!
{% endblock %}

出力:

Impossible to invoke a method ("get") on a NULL variable ("") in AcmeAdminBundle:Default:index.html.twig at line 3 

「デフォルト」として出力したい

私はsymfony 2.3を使用しています.symfony 2.1でも試しましたが、両方のバージョンで同じエラーが発生します.

4

7 に答える 7

31

この行を使用して、twig でコントローラー名を表示します。

{{ app.request.attributes.get("_controller") }}
于 2013-08-26T08:18:11.980 に答える
6

Symfony 3.x 以降、サービス リクエストは request_stack に置き換えられ、Twig 1.12 以降、Twig 拡張宣言が変更されました。

ダニの答えを修正します(https://stackoverflow.com/a/17544023/3665477):

1 -そのための TWIG 拡張機能を定義する必要があります。まだ定義していない場合は、フォルダー構造AppBundle\Twig\Extensionを作成します。

2 -このフォルダー内にファイルControllerActionExtension.phpを作成します。コードは次のとおりです。

<?php

namespace AppBundle\Twig\Extension;

use Symfony\Component\HttpFoundation\RequestStack;

class ControllerActionExtension extends \Twig_Extension
{
    /** @var RequestStack */
    protected $requestStack;

    public function __construct(RequestStack $requestStack)
    {
        $this->requestStack = $requestStack;
    }

    public function getFunctions()
    {
        return [
            new \Twig_SimpleFunction('getControllerName', [$this, 'getControllerName']),
            new \Twig_SimpleFunction('getActionName', [$this, 'getActionName'])
        ];
    }

    /**
     * Get current controller name
     *
     * @return string
    */
    public function getControllerName()
    {
        $request = $this->requestStack->getCurrentRequest();

        if (null !== $request) {
            $pattern = "#Controller\\\([a-zA-Z]*)Controller#";
            $matches = [];
            preg_match($pattern, $request->get('_controller'), $matches);

            return strtolower($matches[1]);
        }
    }

    /**
     * Get current action name
     *
     * @return string
    */
    public function getActionName()
    {
        $request = $this->requestStack->getCurrentRequest();

        if (null !== $request) {
            $pattern = "#::([a-zA-Z]*)Action#";
            $matches = [];
            preg_match($pattern, $request->get('_controller'), $matches);

            return $matches[1];
        }
    }

    public function getName()
    {
        return 'controller_action_twig_extension';
    }
}

3 -その後、TWIG が認識されるようにサービスを指定する必要があります。

app.twig.controller_action_extension:
    class: AppBundle\Twig\Extension\ControllerActionExtension
    arguments: [ '@request_stack' ]
    tags:
        - { name: twig.extension }

4 -キャッシュをクリアして、すべてが正常であることを確認します。

php bin/console cache:clear --no-warmup

5 -そして今、私が何も忘れていなければ、TWIG テンプレートでこれらの 2 つのメソッドにアクセスできるようになります: getControllerName()getActionName()

6 -例:

{{ getControllerName() }} コントローラーの {{ getActionName() }} アクションにいます。

これは次のように出力されます: デフォルト コントローラのインデックス アクションにいます。

以下を確認するためにも使用できます。

{% if getControllerName() == 'default' %}
Whatever
{% else %}
Blablabla
{% endif %}
于 2016-05-11T07:48:38.817 に答える
1

なぜこれが必要なのか、私にはよくわかりません。
パラメータをビューに送信することをお勧めします。

しかし、この方法が本当に必要な場合は、次の解決策があります。

あなたのエラーは2番目のget方法から来ています

request = app.request              // Request object
NULL    = request.get('_template') // Undefined attribute, default NULL
NULL.get('controller')             // Triggers error

リクエスト中にコントローラーを呼び出したい場合_controllerは、リクエスト属性のキーを介してアクセスできます

app.request.attribute.get('_controller')

戻ります

Acme\AdminBundle\Controller\DefaultController::indexAction

その後、必要な方法で解析できます。

これはコントローラーインスタンスを返さず、その名前と呼び出されたメソッドのみを返すことに注意してください

于 2013-06-21T12:19:05.700 に答える
0

コントローラを取得するには - {{ app.request.attributes.get('_controller') }} アクションを取得するには - {{ app.request.attributes.get('_template').get('name') }}

- http://forum.symfony-project.org/viewtopic.php?f=23&t=34083にあります

于 2013-09-26T16:00:19.633 に答える