无法自动装配服务“ App \ Service \ MatchCarAdService”:方法的参数“ $ templating”

时间:2019-02-15 01:46:37

标签: php symfony

您好,我正在创建服务。这是代码,

namespace App\Service;

use Symfony\Component\DependencyInjection\ContainerInterface;
use App\Entity\CarAd;

class MatchCarAdService {

    protected $mailer;
    protected $templating;


    public function __construct(ContainerInterface $container, \Swift_Mailer $mailer, $templating) {
        $this->container = $container;
        $this->mailer = $mailer;
        $this->templating = $templating;
    }

    public function sendMail() {
        $message = (new \Swift_Message('Hello Email'))
                ->setFrom('vimuths@yahoo.com')
                ->setTo('vimuths@yahoo.com')
                ->setBody(
                $this->templating->render(
                        // templates/emails/matching-cars.html.html.twig
                        'emails/matching-cars.html.html.twig', []
                ), 'text/html'
        );

    $this->mailer->send($message);

这是services.yml

MatchCarAdService:
            class: App\Service\MatchCarAdService
            arguments: ['@mailer','@templating']

但是我遇到这个错误,

  

无法解析参数$ matchService   “ App \ Controller \ Api \ SearchController()”:无法自动装配服务   “ App \ Service \ MatchCarAdService”:方法的参数“ $ templating”   “ __construct()”没有类型提示,您应该配置其值   明确地。

2 个答案:

答案 0 :(得分:2)

现在,您的构造函数具有3个参数,但是在参数中您仅放置了2个。

因此,有两种可能的解决方案:

配置您的Yaml

MatchCarAdService:
            class: App\Service\MatchCarAdService
            arguments: ['@container', '@mailer','@templating']

使用带有类型提示的自动接线 在那里,这取决于您的Symfony版本,但是将构造函数更改为

    public function __construct(ContainerInterface $container, \Swift_Mailer $mailer, Symfony\Component\Templating\EngineInterface; $teplating) {
        $this->container = $container;
        $this->mailer = $mailer;
        $this->templating = $templating;
    }

您可能必须composer require symfony/templating才能获得Symfony\Bundle\FrameworkBundle\Templating\EngineInterface服务。

还必须在framework下添加以下配置:

templating:
        enabled: true
        engines: ['twig']

答案 1 :(得分:1)

@M回答。 Kebza解决了您的情况。但是,您可以使其变得更加简单和防错。只需使用Symfony 3.3+功能即可。

A。使用自动装配

services:
    _defaults:
        autowire: true

    App\Service\MatchCarAdService: ~
    App\Service\CleaningService: ~
    App\Service\RentingService: ~

B。使用自动装配+自动发现-更好!

services:
    _defaults:
        autowire: true

    App\:
        resource: ../src

这会按照PSR-4约定从App\目录的../src名称空间中加载所有服务。

您可以在How to refactor to new Dependency Injection features in Symfony 3.3帖子中看到更多示例。