2013-07-31 4 views
0

Как я могу поделиться объектом в представлениях в Symfony?Как сделать объект доступным в приложении symfony2 без повторения запроса?

Я реализовал класс Serializable в моей Entity, чтобы я мог хранить объект в сеансах. Однако, поскольку моя сущность содержит абстрактные методы, мне нужно будет реализовать сериализуемый метод в моем классе, я считаю, что это было бы моим последним средством.

До тех пор я хотел бы найти альтернативное решение, кроме хранения объекта во временной таблице в моей базе данных (это было бы точно так же, как ничего не делать, потому что мне нужно было бы вызвать базу данных на каждом контроллере который отображает вид)

Это мой сценарий:

у меня есть два файла: layout.html.twig и sidebar.html.twig

у меня есть метод внутри моего контроллера по умолчанию называется buildSidebar() выглядит следующим образом

public function buildSidebar($userId = 0) { 
    $projects = $this->getDoctrine()->getRepository('SuperBundle:Projects')->findBy(array('userId' => $userId), array('cratedDate' => DESC), 10); 
    return $this->render(
      'SuperBundle:sidebar.html.twig', 
      array('projects' => $projects) 
    ); 
} 

Тогда в моем layout.html.twig файле У меня есть следующий блок кода в строке 77:

{% render controller("SuperBundle:Default:buildSidebar", {'userId': 37}) %} 

и когда я проверить, что из, Symfony сгенерирует исключение, говоря:

function controller doesn't exist in SuperBundle::layout.html.twig in line 77

Я попытался встроить контроллер также следующим образом:

{{ render(controller("SuperBundle:Default:buildSidebar", {'userId': 37}) }} 

Этот метод бросает исключение unexpected name of value controller:

{{ render controller("SuperBundle:Default:buildSidebar", {'userId': 37}) }} 

Я также попытался это таким образом, и тот же результат function controller does not exist:

{% визуализации (контроллер ("суперрасслоения: По умолчанию: buildSidebar", { 'идентификатор пользователя ': 37})%}

Что мне не хватает? Я последовал за документацией Symfony к письму, и ничто из этого не помогло мне.

ответ

3

Да, вы можете получить доступ к сервису с помощью расширения веточки. http://symfony.com/doc/current/cookbook/templating/twig_extension.html

<?php 

namespace You\UserBundle\Twig; 

use Symfony\Component\Security\Core\SecurityContext; 


class YourExtension extends \Twig_Extension 
{ 

    protected $doctrine; 

    function __construct($doctrine) 
    { 
     $this->doctrine = $doctrine; 
    } 


    public function getUsers() 
    { 
     $em = $this->doctrine->getManager(); 
     $result = $em 
      ->getRepository('yourEntity')->findAll(); 
     return $result; 
    } 

    public function getFunctions() 
    { 
     return array(
      new \Twig_SimpleFunction('get_users', array($this, 'getUsers')) 
     ); 
    } 

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

} 

Или у вас есть возможность включить один контроллер на ваш взгляд веточку, как:

 {{ render(controller('YourUserBundle:YourController:youraction')) }} 

Источник: http://symfony.com/blog/new-in-symfony-2-2-the-new-fragment-sub-framework

+0

Нет проблем, мы все здесь, чтобы помочь друг другу :) –

+0

Оказывается, что веточка хранит жалобы на «функцию контроллера», не существует ... в моем template.html.twig Я пробовал свой путь, как предлагает документация по symfony, и пара других, которые я нашел на интернет. Я даже пытался заменить {{}} на {%%}, и он тоже не работал. – ILikeTacos

+0

Не могли бы вы проверить мой обновленный вопрос? Я не знаю, что я делаю неправильно. – ILikeTacos

Смежные вопросы