У меня есть пример службы:
<?php
namespace AppBundle\Service;
use AppBundle\Entity\Article;
use CompanyName\Utils\ClassFromVendor;
class DecorateArticle
{
private $customDecorator;
private $article;
public function __construct(CustomDecorator $customDecorator)
{
$this->customDecorator = $customDecorator;
}
public function setNews(Article $article)
{
$this->article = $article;
}
public function decorate() : string
{
$text = strip_tags($this->article->getBody());
$text = $this->customDecorator->doIt($text);
$classFromVendor = new ClassFromVendor();
$text = $classFromVendor->doIt($text);
return $text;
}
}
//controller:
public function showToApiAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$news = $em->getRepository('AppBundle:News')->find($request->get('id'));
$decorateArticle = $this->get('AppBundle\Service\DecorateArticle');
$decorateArticle->setNews($news);
return $decorateArticle->decorate();
}
//services.yml:
AppBundle\Service\DecorateArticle:
arguments:
$decorateArticle: '@AppBundle\Service\DecorateArticle'
public: true
В этом коде все работает хорошо, но мой руководитель группы сказал мне, что он нарушает принцип SOLID.
Вот почему я сделал:
<?php
namespace AppBundle\Service;
use AppBundle\Entity\Article;
use CompanyName\Utils\ClassFromVendor;
class DecorateArticle
{
private $customDecorator;
private $classFromVendor;
private $article;
public function __construct(CustomDecorator $customDecorator, ClassFromVendor $classFromVendor)
{
$this->customDecorator = $customDecorator;
$this->classFromVendor = $classFromVendor;
}
public function setNews(Article $article)
{
$this->article = $article;
}
public function decorate() : string
{
$text = strip_tags($this->article->getBody());
$text = $this->customDecorator->doIt($text);
$text = $this->classFromVendor->doIt($text);
return $text;
}
}
//controller:
public function showToApiAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$news = $em->getRepository('AppBundle:News')->find($request->get('id'));
$decorateArticle = $this->get('AppBundle\Service\DecorateArticle');
$decorateArticle->setNews($news);
return $decorateArticle->decorate();
}
//services.yml:
AppBundle\Service\DecorateArticle:
arguments:
$decorateArticle: '@AppBundle\Service\DecorateArticle'
$classFromVendor: 'CompanyName\Utils\ClassFromVendor'
public: true
Но эта ошибка броска:
Ошибка типа: Аргумент 2, переданный в AppBundle\Service\DecorateArticle::__construct(), должен быть экземпляром CompanyName\Utils\ClassFromVendor или нулевым, заданная строка
Как внедрить класс поставщика в сервис?
Может быть, есть лучший способ сделать то, что я делаю? Я не уверен, что смогу использовать инъекции в services.yml и сеттеры (setNews) в одном классе.