Symfony2设置默认视图变量

时间:2013-12-10 15:38:48

标签: symfony

我想为所有视图设置一些变量,这可能吗?

我想我需要做一些自举方法。

但是我想要实现的是,当我从函数返回一个数组时,它会加载模板。使用Symfony2的默认设置。

然后我想附加一些我将通过Javascript访问的变量。

例如,我总是希望有一个用户对象,所以我希望它出现在布局中,如

var user = {{user | json_encode()}}

然后可以在javascript中访问它。但是我不想在我创建的每个控制器中设置此变量,我想将其添加到所有控制器。我会在这里感谢一些帮助。我找到了捆绑php文件,但我不知道是否会帮助我。

3 个答案:

答案 0 :(得分:3)

我认为您可以使用Twig Globals来获得此功能。 尝试在Namespace \ DefaultBundle \ NamespaceDefaultBundle.php中添加它:

class MyBundle extends Bundle
{
    public function boot()
    {
        $fooBar = 'foobar';
        $this->container->get('twig')->addGlobal('foo_bar', $fooBar);
    }
}

这样,var {{foo_bar}}将在您的所有树枝模板中可用。

答案 1 :(得分:1)

如果您不想在控制器中初始化,可以创建一个返回它的树枝函数。

这种方式称为“扩展Twig”:http://twig.sensiolabs.org/doc/advanced.html

Special Symfony2:http://symfony.com/doc/current/cookbook/templating/twig_extension.html

它将执行类似

的操作
var myJsvar = "{{ myfunction() }}";

答案 2 :(得分:0)

我确实到了某个地方,

我设法设置了这个抽象控制器,我把它放在我的默认控制器文件夹

<?php
namespace Namespace\DefaultBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\StreamedResponse;

class AbstractController extends Controller
{
    /**
     * Returns a rendered view.
     *
     * @param string $view       The view name
     * @param array  $parameters An array of parameters to pass to the view
     *
     * @return string The rendered view
     */
    public function renderView($view, array $parameters = array())
    {
        $parameters = array_merge_recursive($parameters, $this->getDefaultSettings());

        return parent::renderView($view, $parameters);
    }

    /**
     * Renders a view.
     *
     * @param string   $view       The view name
     * @param array    $parameters An array of parameters to pass to the view
     * @param Response $response   A response instance
     *
     * @return Response A Response instance
     */
    public function render($view, array $parameters = array(), Response $response = null)
    {
        $parameters = array_merge_recursive($parameters, $this->getDefaultSettings());

        return parent::render($view, $parameters, $response);
    }


    /**
     * Streams a view.
     *
     * @param string           $view       The view name
     * @param array            $parameters An array of parameters to pass to the view
     * @param StreamedResponse $response   A response instance
     *
     * @return StreamedResponse A StreamedResponse instance
     */
    public function stream($view, array $parameters = array(), StreamedResponse $response = null)
    {
        $parameters = array_merge_recursive($parameters, $this->getDefaultSettings());

        return parent::stream($view, $parameters, $response);
    }

    public function getDefaultSettings()
    {
        $settings = array();

        if ($this->getUser()) {
            # Just exports to an array
            $settings['user'] = $this->getUser()->export();
        }

        $settings['locales'] = array(
            array(
                'label' => 'English',
                'code' => 'en-us'
            ),
            array(
                'label' => 'Swedish',
                'code' => 'sv-se'
            )
        );

        return array(
            "settings" => $settings
        );
    }
}

然后我将这个AbstractController添加到我的实际控制器:

<?php

namespace Namespace\DefaultBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Response;
class DefaultController extends AbstractController
{
    /**
     * @Route("/", name="home")
     */
    public function indexAction()
    {

        return new Response($this->renderView("NamespaceDefaultBundle:Default:index.html.twig"));
    }
}

但是当我在docblock中执行@Template()时,这不起作用。因为它没有使用父类。所以它需要更多的工作,但它做了我想要的。

然后在layout.html.twig中我得到了以下内容:

<script type="text/javascript">
    var settings = {{ settings | json_encode() | raw }};
</script>