2011-01-20 15 views
8

Estoy tratando de crear un esqueleto simple de MVC y estoy atascado con las dependencias.Inyección de dependencia en MVC

Esto es lo que tengo ahora:

$config = new Config(); 
$database = new Database($config); 
$uri = new Uri('article/5'); 
$request = new Request($uri); 
$response = new Response; 
$router = new Router; 
$dispatcher = new Dispatcher($request, $response, $router); 

$dispatcher->dispatch(); // Routing, instantiate controller, execute action, send response 

La pregunta es: ¿cómo puede cualquier objeto conseguir el acceso a cualquier tipo de dependencia?

Algunos ejemplos:

  • controlador puede necesitar configuración para obtener las opciones de formato de salida.
  • Mapper puede necesitar una base de datos para realizar consultas.
  • Cualquier controlador/ayudante necesita acceso al registro.
  • Helper puede necesitar cualquier número de dependencias (por ejemplo: Uri_Helper necesita un enrutador).

La única posibilidad que se me ocurre es usar el Registro, pero esto viola la Ley de Demeter (pregunte lo que realmente necesita).

Respuesta

5

Usted escribe factories (artículo excellen). Esto podría ser totalmente aburrido (como el artículo menciona) por lo que podría usar un DI-framework como por ejemplo:

  • Symfony DIC: Ver la publicación de Juraj.
  • PD
  • Yadif
  • Drip (PHP 4): pero no ha sido actualizado desde hace tiempo.

También me gustaría señalar que el blog de Misko es muy interesante y tiene muchas buenas lecturas sobre cómo hacer las pruebas correctamente. Especialmente el guide to writing testable code es una lectura obligada.

P.S: Creo que debería escribir fábricas, porque PHP es un lenguaje de scripting y debe usar el menor código posible para hacer que su sitio sea rápido. Ese es el problema con algunos PHP frameworks.

Rasmus Ledorf (inventor PHP) 's cita:

Muchos marcos pueden parecer muy atractivo a primera vista, ya que parecen reducir aplicación web desarrollo a un par de triviales pasos que conducen a algunos generación de código y detección de esquema automático a menudo, pero estos mismos accesos directos son ser sus cuellos de botella también ya que logran esta simplicidad sacrificando flexibilidad y rendimiento. Nada va a construir su aplicación para usted, sin importar lo que promete. Usted tendrá que compilarlo usted mismo .En lugar de comenzar por la fijación de los errores de alguna marco exterior y refactorización todos los cosas que no se aplican a su entorno gastar su tiempo la construcción de un modelo delgado y reutilizable que encaja directamente sus necesidades. Al final creo que encontrará que su pequeña estructura de cosecha propia ha guardado tiempo y agrava y termina con un mejor producto.

1

Puede usar un contenedor de inyección de dependencia como Symfony DIC. Usted define los objetos, la configuración y el cableado dentro del contenedor, lo que a su vez se encarga de la creación de instancias.

Cuestiones relacionadas