在另一个类中使用控制器类方法

时间:2013-10-19 06:11:32

标签: symfony

我想使用renderView() 在除了Controller之外的其他课程中。

class RegistrationFormHandler extends BaseRegistrationFormHandler  
{

    protected function onSuccess(UserInterface $user, $confirmation)
    {
            $messaggio = \Swift_Message::newInstance()
    ...
        ->setBody($this->renderView('AcmeMemberBundle:Default:firstemailtocustomer.txt.twig',array('user' => $user)));

显示

FatalErrorException: Error: Call to undefined method Acme\UserBundle\Form\Handler\RegistrationFormHandler::renderView() in 

但是如果你在控制器类中尝试相同的方法。

class DefaultController extends Controller
{

public function mainAction(){
    $messaggio = \Swift_Message::newInstance()
    ...
        ->setBody($this->renderView('AcmeMemberBundle:Default:firstemailtocustomer.txt.twig',array('user' => $user)));

效果很好。

我想我应该得到控制器类的实例。

我怎么能解决这个问题?


感谢蒂姆的回答。

我将此添加到services.xml

    <service id="acme.default.controller" class="Acme\MemberBundle\Controller\DefaultController" public="false">
        <argument>acme.controller.default.class</argument>
     </service>

并像这样使用

->setBody($this->forward('acme.controller.default.class')->renderView('AcmeMemberBundle:Default:firstemailtocustomer.txt.twig',array('user' => $user)));

但它说,

FatalErrorException: Error: Call to undefined method Acme\UserBundle\Form\Handler\RegistrationFormHandler::forward() in 

3 个答案:

答案 0 :(得分:2)

创建一个控制器,您可以use as a Service

# src/Acme/UserBundle/Resources/config/services.yml
parameters:
    # ...
    acme.controller.default.class: Acme\HelloBundle\Controller\UserController

services:
    acme.hello.controller:
        class:     "%acme.controller.default.class%"

然后致电:

$this->forward('acme.hello.controller:mainAction');

来自RegistrationFormHandler

答案 1 :(得分:2)

使用时

$this->renderView();

在控制器中,您正在使用

的快捷方式
$this->container->get('templating')->renderView();

因此,如果你只是在另一个类中注入symfony的模板serice,你可以从那里使用renderView。

在symfony文档中更详细地说:http://symfony.com/doc/current/book/templating.html

答案 2 :(得分:0)

你应该使用这个

$this->container->get('templating')->renderResponse('AcmeMemberBundle:Default:firstemailtocustomer.txt.twig',array('user' => $user))->getContent();