对成员函数的调用在null(呈现方法)Symfony上具有()

对成员函数的调用在null(呈现方法)Symfony上具有(),symfony,Symfony,我有两个包: 1) 带有类RememberController的UserBundle namespace UserBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RedirectResponse; use MailEventBu

我有两个包:

1) 带有类RememberController的UserBundle

namespace UserBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
use MailEventBundle\Controller\MailEventController;

class RememberController extends Controller
{
    public function rememberAction(Request $request)
        {
        if($request->get('email') != null){

            $params = 
            [
                'email' => $request->get('email'),
                'subject' => 'Remind password', 
                'template' => 'template/remember.html',
                'values' => array(
                    'password' => md5($request->get('email') . date("l dS of F Y h:i:s A"))
                    )
            ];

            $MailEventController = new MailEventController();

            $MailEventController->mailGenerator($params);

            return new Response(
                'Almost ok',
                Response::HTTP_OK
            );
        }
    }


}
如果我在这个类中调用render方法,一切都很好!但若我在MailEventController中调用render方法,我会错误地调用一个成员函数has(),并且调用$this->container并从MailEventController返回null

namespace MailEventBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class MailEventController extends Controller
{
    private function sendAction($message)
    {
        try {
            $this->get('mailer')->send($message);
            return true;
        } catch (\Swift_TransportException $e) {
            return $e;
        }
    }

    public function mailGenerator($params)
    {
       $message = \Swift_Message::newInstance()
            ->setSubject($params['subject'])
            ->setFrom('email@email.com')
            ->setTo($params['email'])
            ->setBody(
                $this->renderView( // error here
                    $params['template'],
                    $params['values']
                ),
                'text/html'
            );


       return $this->sendAction($message);

    }

}
2) MailEventController

namespace MailEventBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class MailEventController extends Controller
{
    private function sendAction($message)
    {
        try {
            $this->get('mailer')->send($message);
            return true;
        } catch (\Swift_TransportException $e) {
            return $e;
        }
    }

    public function mailGenerator($params)
    {
       $message = \Swift_Message::newInstance()
            ->setSubject($params['subject'])
            ->setFrom('email@email.com')
            ->setTo($params['email'])
            ->setBody(
                $this->renderView( // error here
                    $params['template'],
                    $params['values']
                ),
                'text/html'
            );


       return $this->sendAction($message);

    }

}

如何解决此问题?

$MailEventController=new MailEventController()这不是使用控制器的方式。你的MalEventController应该做什么?它扩展了基本的Symfony控制器,但它看起来不像是MVC框架意义上的实际控制器?看起来它应该是一个服务。在控制器必须返回响应的前提下,您应该使用DI服务来处理可重用逻辑,而不是控制器方法。你应该更深入地阅读文档。是的,这是一项服务,但我是以捆绑的形式编写的,而且该服务可以有一个呈现方法?是否有正确实施的示例?不,这不是正确实施的示例。真正混淆了控制器和其他服务的概念。请查看手册中的“服务”部分。话虽如此,我想你可以用$MailEventController->setContainer($this->container)作弊;但不要那样做。