我是symfony世界的新手。 我想在我的服务中使用render,但是我收到了这个错误
调用未定义的方法renderView
我知道renderView是
的捷径/**
* 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())
{
return $this->container->get('templating')->render($view, $parameters);
}
但我不知道我的服务中注射了什么。我甚至用php app/console container:debug
命令知道我可以看到我的所有服务都可用,但我不知道如何选择正确的
更新
我尝试添加
arguments: [@mailer,@templating]
但我得到了ServiceCircularReferenceException
更新
我用
更改了service.yml arguments: [@service_container]
甚至是我的服务
$email = $this->service_container->get('mailer');
$twig = $this->service_container->get('templating');
使用服务邮件(swift)和渲染。
我认为这不是最佳解决方案。我想只注入mailer
和templating
更新杰森的回答后 我正在使用Symfony 2.3
我的services.yml
services:
EmailService:
class: %EmailService.class%
arguments: [@mailer,@templating,%EmailService.adminEmail%]
我得到了这个ServiceCircularReferenceException
答案 0 :(得分:25)
你对renderView()
是正确的,它只是控制器的快捷方式。使用服务类并注入模板服务时,您所要做的就是将功能更改为render()
。而不是
return $this->renderView('Hello/index.html.twig', array('name' => $name));
你会用
return $this->render('Hello/index.html.twig', array('name' => $name));
奥利维亚的回复更新
如果您收到循环引用错误,唯一的方法就是注入整个容器。它不被认为是最佳实践,但有时无法避免。当我不得不诉诸于此时,我仍然在构造函数中设置我的类变量,这样我就可以直接注入它们。所以我会这样做:
use Symfony\Component\DependencyInjection\ContainerInterface;
class MyClass()
{
private $mailer;
private $templating;
public function __construct(ContainerInterface $container)
{
$this->mailer = $container->get('mailer');
$this->templating = $container->get('templating');
}
// rest of class will use these services as if injected directly
}
旁注,我刚刚在Symfony 2.5中测试了我自己的独立服务,并没有通过直接注入邮件和模板服务获得循环引用。
答案 1 :(得分:17)
使用构造函数依赖注入(使用Symfony 3.4测试):
class MyService
{
private $mailer;
private $templating;
public function __construct(\Swift_Mailer $mailer, \Twig_Environment $templating)
{
$this->mailer = $mailer;
$this->templating = $templating;
}
public function sendEmail()
{
$message = $this->templating->render('emails/registration.html.twig');
// ...
}
}
无需配置参数。
答案 2 :(得分:0)
这在Symfony +4.2上有效,假设您的应用程序的名称空间是App,而邮件程序的服务名为EmailService。
在您的服务课程上:
// ...
private $mailer;
private $templating;
public function __construct( \Swift_Mailer $mailer, \Twig\Environment $templating )
{
$this->mailer = $mailer;
$this->templating = $templating;
}
public function sendEmailRegistration()
{
$message = $this->templating->render('emails/registration.html.twig');
// ...
}
// ...
在您的services.yaml
services:
email_service:
class: App\Service\EmailService
arguments: ['@swiftmailer.mailer.default', '@twig']