我想为所有视图设置一些变量,这可能吗?
我想我需要做一些自举方法。
但是我想要实现的是,当我从函数返回一个数组时,它会加载模板。使用Symfony2的默认设置。
然后我想附加一些我将通过Javascript访问的变量。
例如,我总是希望有一个用户对象,所以我希望它出现在布局中,如
var user = {{user | json_encode()}}
然后可以在javascript中访问它。但是我不想在我创建的每个控制器中设置此变量,我想将其添加到所有控制器。我会在这里感谢一些帮助。我找到了捆绑php文件,但我不知道是否会帮助我。
答案 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>