วิธีการบริการเป็นตัวแปรโกลบอลของทวิก

ในแอปพลิเคชัน symfony2 ของฉัน ฉันมีเมธอด getPorfolioUser ซึ่งส่งคืนตัวแปรผู้ใช้เฉพาะ

ฉันรอคอยที่จะสามารถโทรได้

{% ถ้าportfolio_user %}

ในกิ่งไม้ ฉันไม่เข้าใจว่าฉันสามารถตั้งค่านี้เป็นตัวแปรทั่วโลกได้อย่างไร เนื่องจากจากเอกสารที่ฉันรู้สึกว่าฉันสามารถตั้งค่าองค์ประกอบหรือบริการคงที่เท่านั้น แต่ไม่ใช่วิธีการของบริการ

ฉันจำเป็นต้องเขียนส่วนขยายหรือตัวช่วยสำหรับสิ่งนั้นหรือไม่ อะไรเป็นวิธีที่ง่ายกว่าในการทำเช่นนี้?

ขอบคุณ!


person Sébastien    schedule 04.03.2015    source แหล่งที่มา


คำตอบ (4)


คุณสามารถกำหนดบริการที่กำหนดเองของคุณเป็น twig globals variable ได้ดังนี้:

ใน config.yml

# Twig Configuration
twig:
    debug:            "%kernel.debug%"
    strict_variables: "%kernel.debug%"
    globals:
        myGlobaService: "@acme.demo_portfolio_service"  #The id of your service

ใช้มันเป็นไฟล์ Twig

{% if myGlobaService.portfolio_user() %}

หวังว่าความช่วยเหลือนี้

person Matteo    schedule 05.03.2015

แนวทางหนึ่งคือใช้ Listener เหตุการณ์ของ CONTROLLER ฉันชอบใช้ CONTROLLER แทน REQUEST เพราะจะทำให้แน่ใจได้ว่าผู้ฟังคำขอปกติทั้งหมดได้ทำสิ่งที่พวกเขาทำเสร็จแล้ว

use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class ProjectEventListener implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
    return array
    (
        KernelEvents::CONTROLLER => array(
            array('onControllerProject'),
        ),
    );
}
private $twig;
public function __construct($twig)
{
    $this->twig = $twig;
}
public function onControllerProject(FilterControllerEvent $event)
{
    // Generate your data
    $project = ...;

    // Twig global
    $this->twig->addGlobal('project',$project);    
}

# services.yml
cerad_project__project_event_listener:
    class: ...\ProjectEventListener
    tags:
        - { name: kernel.event_subscriber }
    arguments:
        - '@twig'

ผู้ฟังได้รับการบันทึกไว้ที่นี่: http://symfony.com/doc/current/cookbook/service_container/event_listener.html

อีกวิธีหนึ่งคือการหลีกเลี่ยงทวิกทั่วโลกโดยสิ้นเชิงและเพียงแค่ทำการเรียกส่วนขยายทวิก http://symfony.com/doc/current/cookbook/templating/twig_extension.html

ทั้งสองวิธีทำงานได้ดี

person Cerad    schedule 04.03.2015

เมื่อคุณดูที่นี่: http://symfony.com/doc/current/reference/twig_reference.html#app

คุณสามารถอ่านสิ่งนี้:

ตัวแปรแอปสามารถใช้ได้ทุกที่และให้สิทธิ์เข้าถึงออบเจ็กต์และค่าที่จำเป็นทั่วไปจำนวนมาก มันเป็นตัวอย่างของ GlobalVariables

GlobalVariables is Symfony\Bundle\FrameworkBundle\Templating\GlobalVariables

ฉันไม่เคยทำ แต่ฉันคิดว่าวิธีหนึ่งคือการข้ามชั้นเรียนนี้เพื่อสนองความต้องการพิเศษของคุณ

person BENARD Patrick    schedule 04.03.2015

ฉันก็ประสบปัญหานี้เช่นกัน และในที่สุดก็แก้ไขได้โดยทำสิ่งต่อไปนี้:

  1. ตั้งค่าชุดรวมของคุณ (เช่น MyVendor/MyBundle)

    $ app/console generate:bundle
    

  1. ในไดเร็กทอรีบันเดิลของคุณ ให้สร้างไฟล์คลาส MyService.php ในโฟลเดอร์ DependencyInjection

  1. ในไฟล์คลาสนี้ ให้สร้างฟังก์ชัน

    public function getExample(){
        return "it works!!!";
    }
    

  1. ใน app/config/services.yml ให้สร้างบริการใหม่ดังนี้:

    myvendor.mybundle.myservice
          class: MyVendor\MyBundle\DependencyInjection\MyService
    

  1. ใน app/config/config.yml ใต้ส่วนการกำหนดค่า twig

    twig:
        globals:
            mystuff: '@myvendor.mybundle.myservice'
    

  1. จากนั้นในเทมเพลตทวิกของคุณ คุณสามารถอ้างอิงตัวแปรได้ดังนี้:

     {{ mystuff.example }}
    

ข้อจำกัดความรับผิดชอบ

นี่เป็นเพียงวิธีที่ฉันได้มันไปทำงาน....

หวังว่านี่จะช่วยได้

person Craig Wayne    schedule 05.07.2016