TWIG шаблонында контроллер атауын алыңыз

Symfony2.3 үйреніп жатырмын, мен контроллер атауын екі шаблонда алуға тырысқанда қате аламын.

Бақылаушы:

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 

Шығарылымды «Әдепкі» ретінде қалаймын

Мен симфонийді қолданамын 2.3, мен симфонияның 2.1-де қолданамын, бірақ екі нұсқада бірдей қате пайда болады.

6
Мен контроллердің атауында кейбір сілтемелерді сыныпқа қосқым келеді.
қосылды автор Hardeep Pandya, көзі
Бірақ, бұл ақпарат сізге не үшін қажет?
қосылды автор j0k, көзі

7 жауаптар

бұл жолды контроллер атауын көрсету үшін пайдаланыңыз:

{{ app.request.attributes.get("_controller") }}
20
қосылды
Міне, бұл неге бұл қабылданбайды және ең көп дауыс берген жауап, оңай және кіріктірілген, бұл не?
қосылды автор Bonswouar, көзі
tnx !! Маршруттық атау үшін {{app.request.attributes.get («_ route»)}} .
қосылды автор Shay Altman, көзі

Көптеген айлар бұрын мен сіздермен бірдей проблема тудырдым, ал «googling» жұмыс кодын таптым және оны өз қажеттіліктеріме бейімдедім. Мінеки Біз:

1 - We need to define a TWIG extension for that. We create the folder structure Your\OwnBundle\Twig\Extension if you haven't defined yet.

2 - Inside this folder we create the file ControllerActionExtension.php which code is:

namespace Your\OwnBundle\Twig\Extension;

use Symfony\Component\HttpFoundation\Request;

/**
 * A TWIG Extension which allows to show Controller and Action name in a TWIG view.
 * 
 * The Controller/Action name will be shown in lowercase. For example: 'default' or 'index'
 * 
 */
class ControllerActionExtension extends \Twig_Extension
{
    /**
     * @var Request 
     */
    protected $request;

   /**
    * @var \Twig_Environment
    */
    protected $environment;

    public function setRequest(Request $request = null)
    {
        $this->request = $request;
    }

    public function initRuntime(\Twig_Environment $environment)
    {
        $this->environment = $environment;
    }

    public function getFunctions()
    {
        return array(
            'get_controller_name' => new \Twig_Function_Method($this, 'getControllerName'),
            'get_action_name' => new \Twig_Function_Method($this, 'getActionName'),
        );
    }

    /**
    * Get current controller name
    */
    public function getControllerName()
    {
        if(null !== $this->request)
        {
            $pattern = "#Controller\\\([a-zA-Z]*)Controller#";
            $matches = array();
            preg_match($pattern, $this->request->get('_controller'), $matches);

            return strtolower($matches[1]);
        }

    }

    /**
    * Get current action name
    */
    public function getActionName()
    {
        if(null !== $this->request)
        {
            $pattern = "#::([a-zA-Z]*)Action#";
            $matches = array();
            preg_match($pattern, $this->request->get('_controller'), $matches);

            return $matches[1];
        }
    }

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

3 - After that we need to specify the service for TWIG to be recognized:

services:
    your.own.twig.controller_action_extension:
        class: Your\OwnBundle\Twig\Extension\ControllerActionExtension
        calls:
            - [setRequest, ["@?request="]]
        tags:
            - { name: twig.extension }

4 - Cache clear to make sure everything is ok:

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

5 - And now, if I'm not forgetting anything, you will be able to access those 2 methods in a TWIG template: get_controller_name() and get_action_name()

6 - Examples:

You are in the {{ get_action_name() }} action of the {{ get_controller_name() }} controller.

This will output something like: You are in the index action of the default controller.

Сіз сондай-ақ тексеру үшін пайдалануға болады:

{% if get_controller_name() == 'default' %}
Whatever
{% else %}
Blablabla
{% endif %}

Және бұл бәрі !! Сізге көмектесті, жұбайым :)

Edit: Take care about the clearing cache. If you don't use --no-warmup parameter maybe you will realize that nothing is shown in your templates. That's because this TWIG Extension uses the Request to extract the Controller and Action names. If you "warm up" the cache, the Request is not the same as a browser request, and the methods can return '' or null

16
қосылды
Мен өзіңіздің шешіміңізді әрқашан пайдаланып, Сізде «sensio_distribution.webconfigurator» қызметіне жүгінген болсаңыз,
қосылды автор rkmax, көзі
Әрине, кеңейтім жұмыс істейді, бірақ мен жаңа функцияны қосуды талап етемін және осы функцияда Сұранысты пайдалану қажет
қосылды автор rkmax, көзі
Даниге рахмет, пайдалану ауқымына ие болған құжаттарды қолданамын (symfony 2.4 пайдаланамын). Мен мәселені синтетикалық қызметпен шешемін :)
қосылды автор rkmax, көзі
Сіз бұл қызмет ретінде жарияладыңыз ба? (Жауаптың 3-ші нүктесі)
қосылды автор Dani Sancas, көзі
Менің жауапым Symfony 2.3-ке арналған, өйткені 2.4 сұраныс көп жағдайда басқаша өңделеді: symfony.com/blog/new-in-symfony-2-4-the-request-stack Сізге көмектесетініне сенімдімін. Егер олай болмаса, қайтадан сұраңыз (немесе сіз өзіңіздің барлық кодты және қол жеткізгіңіз келген мақсатты көріп отыруыңызды сұраңыз)
қосылды автор Dani Sancas, көзі

Symfony 3.x болғандықтан, service request request_stack дегенмен ауыстырылады және Twig Extension мәлімдемесі Twig 1.12-тен кейін өзгерді.

Мен Данидің жауабын түзетемін ( https://stackoverflow.com/a/17544023/3665477 ):

1 - We need to define a TWIG extension for that. We create the folder structure AppBundle\Twig\Extension if you haven't defined yet.

2 - Inside this folder we create the file ControllerActionExtension.php which code is:

<?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 - After that we need to specify the service for TWIG to be recognized:

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

4 - Cache clear to make sure everything is ok:

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

5 - And now, if I'm not forgetting anything, you will be able to access those 2 methods in a TWIG template: getControllerName() and getActionName()

6 - Examples:

{{GetControllerName ()}} контроллерінің {{getActionName ()}} әрекетіндесіз.

Бұл келесідей нәрсе шығарады: әдепкі контроллердің индекс әрекеттеріндесіз.

Сіз сондай-ақ тексеру үшін пайдалануға болады:

{% if getControllerName() == 'default' %}
Whatever
{% else %}
Blablabla
{% endif %}
5
қосылды

Мен НЕГІЗДІҢ сізге қажет екенін көрмеймін Параметрлерді сіздің көрінісіңізге жақсы жіберуге болады.

Бірақ егер сізге шынымен мұқтаж болсаңыз, мұнда шешім бар:

Сіздің қателігіңіз екінші get әдісінен келеді

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

If you want to get the controller called during the request you can access it via the key _controller of the request attribute

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

Қайтарылады

Acme\AdminBundle\Controller\DefaultController::indexAction

Одан кейін оны қалаған жолмен бөлуге болады.

Назар аударыңыз, бұл контроллерлер данасын қайтармайды, тек оның атауы мен әдісі

1
қосылды
Сілтемедегі код дұрыс емес. Бірақ, жоқ, Twig айнымалы мәнінен контроллер класының қысқа атауын (- контроллер) ала алмайсыз. app айнымалысы Symfony \ Bundle \ FrameworkBundle \ Templating \ GlobalVariables данасы, ол оның контейнерін
қосылды автор Touki, көзі
Сұрағыңызға қызығушылық білдіргеніңізге рахмет, бірақ егер symfony ішіндегі ішкі функционалдылық болса, онда мен талдау стендісін пайдаланып, веб-торапта табылған сілтемесін қараңыз ostedesign.com/…
қосылды автор Hardeep Pandya, көзі

Бақылаушы:

{{ app.request.attributes.get('_template').get('controller') }}

Әрекет:

{{ app.request.attributes.get('_template').get('name') }}

enjoy;)

1
қосылды

Ол өзгеруі мүмкін. Контроллерде аннотацияларды пайдалансаңыз, мысалы: @Template («AcmeDemoBundle: Default: index») , Twig үлгісіндегі app.request.get ('_ template') -қа кіруге тырысады. «AcmeDemoBundle: әдепкі: индекс». Осылайша, сіз оған келесідей кіре аласыз:

{% set _template = app.request.get('_template')|split(':') %}
{% set controller = _template[1] %}
{% set bundle = _template[0] %}

If you're not using annotations then you can use the app.request.get('_template').get('_controller')

0
қосылды

Контроллерді алу үшін - {{app.request.attributes.get ('_ controller')}} Әрекетті алу үшін - {{app.request.attributes.get ('_ template'). Get ('name')}}

Found at - http://forum.symfony-project.org/viewtopic.php?f=23&t=34083

0
қосылды