Sto cercando un modo per utilizzare Symfony 2 Dependency Injection component con il nuovo PHP 5.4 traits.Symfony 2: dipendenza dipendenza e tratti
Per fare una lunga storia breve (non così breve, in realtà), il mio progetto ha disgiunto le classi di vista che hanno tutte un proprio costruttore specifico. Ogni View può utilizzare zero o più vista aiutanti, che sono definiti come tratti:
trait TranslatorHelper
{
/**
* @var Translator
*/
protected $translator;
/**
* @param Translator $translator
*/
protected function setTranslator(Translator $translator)
{
$this->translator = $translator;
}
/**
* @param string $text
* @return string
*/
public function translate($text)
{
return $this->translator->translate($text);
}
}
-
class UserEditView extends AbstractView
{
use TranslatorHelper;
public function __construct(User $user, UserEditForm $form)
{
// ...
}
}
Mi piacerebbe avere un metodo in mio controller, renderView()
, che esegue setter iniezione a base di tutti i tratti utilizzati dalla classe View, prima del rendering della vista:
class Controller
{
public function renderView(View $view)
{
// Check what traits are used by $view, and inject their dependencies
// {...}
// Then render the View
return $view->render();
}
}
Qualche idea su come fare questo con il 012 Componente?
Il problema principale è ovviamente che le viste non verranno create dal contenitore DI ma possono essere create ovunque nel flusso dell'applicazione. È solo prima di essere reso che le dipendenze devono essere iniettate.
Un'ultima nota: non sono legato al componente Symfony. Sarebbe apprezzato anche qualsiasi vantaggio su un altro contenitore DI.
È possibile provare DI con AOP: https://github.com/schmittjoh/JMSAopBundle/blob/master/Resources/doc/index.rst per iniettare automaticamente servizi mediante annotataione di proprietà e argomenti. – lisachenko
Il problema è che volevo mantenere generici gli helper di visualizzazione (come ad esempio 'TranslatorHelper'), quindi idealmente non dovrebbero contenere l'id specifico del progetto delle dipendenze nel contenitore. – Benjamin