Estoy tratando de encontrar una forma de utilizar el Symfony 2 Dependency Injection component con el nuevo PHP 5.4 traits.Symfony 2: inyección de dependencia y rasgos
Para resumir una historia corta (no tan corta, en realidad), mi proyecto ha desacoplado clases de vista que tienen su propio constructor específico. Cada vista puede utilizar cero o más ayudantes de vista, que se definen como rasgos:
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)
{
// ...
}
}
Me gustaría tener un método en mi controlador, renderView()
, que realiza colocador inyección en base a todos los rasgos utilizados por la clase View, antes de renderizar la 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();
}
}
Cualquier idea sobre cómo hacer esto con el DependencyInjection
componente?
El problema principal es, obviamente, que las vistas no serán creadas por el contenedor DI, sino que se pueden crear en cualquier lugar del flujo de la aplicación. Es solo antes de que se procesen que las dependencias deben ser inyectadas.
Una última nota: no estoy vinculado al componente de Symfony. También se apreciaría cualquier ventaja en otro contenedor DI.
Puede intentar DI con AOP: https://github.com/schmittjoh/JMSAopBundle/blob/master/Resources/doc/index.rst para inyectar automáticamente servicios mediante anotación de propiedades y argumentos. – lisachenko
El problema es que quería mantener los helpers de visualización (como 'TranslatorHelper') genéricos, por lo que idealmente no deberían contener el id. Específico del proyecto de las dependencias en el contenedor. – Benjamin