Невозможно автоматически подключить службу «App \ Service \ MatchCarAdService»: аргумент «$ templating» метода - PullRequest
0 голосов
/ 15 февраля 2019

Привет, я создаю сервис.Это код,

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']

Но я получаю эту ошибку,

Невозможно разрешить аргумент $ matchServiceof "App \ Controller \ Api \ SearchController ()": Невозможно автоматически подключить службу "App \ Service \ MatchCarAdService": аргумент "$ templating" метода "__construct ()" не имеет подсказки типа, вы должны явно указать его значение.

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Ответ от @M.Кебза решает вашу ситуацию.Но вы можете сделать это еще проще и надежнее.Просто используйте функции Symfony 3.3+.

A.Используйте Autowiring

services:
    _defaults:
        autowire: true

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

B.Используйте Autowiring + Autodiscovery - еще лучше!

services:
    _defaults:
        autowire: true

    App\:
        resource: ../src

Эта загрузка всех сервисов в App\ пространстве имен из каталога ../src в соответствии с соглашением PSR-4.

Вы можете увидеть больше примеров в Как выполнить рефакторинг для новых функций внедрения зависимостей в Symfony 3.3 post.

0 голосов
/ 15 февраля 2019

Прямо сейчас ваш конструктор имеет 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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...