Этот вопрос не имеет прямого отношения к Symfony 2, но, поскольку я использую компоненты Symfony 2 и позже, скорее всего, буду использовать Symfony \ Component \ DependencyInjection \ Container в качестве DI-контейнера, он может иметь отношение.
В настоящее время я создаю небольшую библиотеку, используя компоненты из Symfony 2, например HttpFoundation, Validator, Yaml. Все мои доменные службы расширяют базовую службу AbstractService, обеспечивая только Doctrine \ ORM \ EntityManager и Symfony \ Component \ Validator \ Validator посредством Constructor-Injection, например:
abstract class AbstractService
{
protected $em;
protected $validator;
/**
* @param Doctrine\ORM\EntityManager $em
* @param Symfony\Component\Validator\Validator $validator
*/
public function __construct(EntityManager $em, Validator $validator)
{
$this->em = $em;
$this->validator = $validator;
}
}
Классу Service, расширяющему этот AbstractService, теперь может понадобиться добавить дополнительные компоненты, такие как Symfony \ Component \ HttpFoundation \ Session. По состоянию на это я делаю так:
class MyService extends AbstractService
{
/**
* @var Symfony\Component\HttpFoundation\Session
*/
protected $session;
/**
* @param Symfony\Component\HttpFoundation\Session $session
* @param Doctrine\ORM\EntityManager $em
* @param Symfony\Component\Validator\Validator $validator
*/
public function __construct(Session $session, EntityManager $em, Validator $validator)
{
parent::__construct($em, $validator);
$this->session = $session;
}
}
Есть ли более элегантный способ решить эту проблему без повторения аргументов конструктора родителя, например, вместо этого используя Setter-Injection for Session?
Насколько я понимаю, когда я использую Setter-Injection for Session, я должен добавить проверки перед доступом к нему в моих методах, независимо от того, введен ли он уже, чего я хочу избежать. С другой стороны, я не хочу «повторять» введение базовых компонентов, общих для всех служб.