Symfony2 twig渲染错误

时间:2016-02-10 15:23:40

标签: php symfony

嘿所有我想在我的控制器中渲染一个树枝模板,但我得到这个错误:

Error: Call to a member function has() on a non-object

我在网上跟踪了几个例子,根据这些我应该没事,不幸的是我猜我做错了。

我的控制器代码:

<?php

namespace Tomazi\SiteBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Tomazi\SiteBundle\Factories\FactoryHomePage;

class IndexController extends Controller
{
    public $home;

    public function __construct(
        FactoryHomePage $home
    ){
        $this->home = $home;
    }

    public function indexPageAction()
    {
        return $this->render('pages/home.html.twig', [
            'name' => 'Tomazi'
        ]);
    }
} 

所以我的twig文件src是app / Resources / view / home.html.twig

在这个文件中我有:

<h1>Hey {{ name }} </h1>

为什么我收到此错误消息?

更新1 好的,所以我的控制器被宣布为服务,这不允许我使用twig容器我相信....

然后我回去并将我的控制器配置为像这样的控制器:

<?php
namespace Tomazi\SiteBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class IndexController extends Controller
{
    public function indexPageAction()
    {
        return $this->render('pages/home.html.twig', array('name' => 'Tomazi'));
    }
} 

我当然也必须改变我的路由,所以它不期望服务而只是一个控制器。

经过这些更改,我能够渲染我的home.html.twig,但这并不满足我,因为我真的希望我的控制器成为一项服务,因为我想将我的工厂注入其中,为控制器准备所有数据响应,我喜欢THIN控制器方法...

要实际实现我的目标,我必须向我的Controller服务添加一个service_container参数,如下所示:

<!-- Controller -->
<service id="tomazi.sitebundle.controller.index"
         class="Tomazi\SiteBundle\Controller\IndexController">
    <argument type="service" id="tomazi.sitebundle.factory.index" />
    **<argument type="service" id="service_container" />**
</service>

现在我的控制器的最终版本如下所示:

<?php

namespace Tomazi\SiteBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Tomazi\SiteBundle\Factories\FactoryHomePage;

class IndexController extends Controller
{
    public $home;

    public $container;

    public function __construct(
        FactoryHomePage $factoryHomePage,
        ContainerInterface $containerInterface
    ){
        $this->home = $factoryHomePage;
        $this->container = $containerInterface;
    }

    public function indexPageAction()
    {
        return $this->render('pages/home.html.twig', array('name' => 'Tomazi'));
    }
} 

不确定这是否是最佳方法,但它对我有用。

2 个答案:

答案 0 :(得分:1)

OMG之所以无法工作,是因为我的控制器是一项服务.....:@,我改变了它,以便我的控制器是标准的,它可以工作.....但我希望我的控制器是一个服务.....所以我怎么能找到解决方法...?是否可以创建Twig容器作为服务并将其注入我的Controller服务?

答案 1 :(得分:0)

你可以尝试这段代码吗?

@Inject