Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

PHP OO Duda "teológica" sobre MVC

Estas en el tema de Duda "teológica" sobre MVC en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola a tod@s, hoy los vengo con una duda "teológica" sobre el patrón MVC jeje. Como bien sabemos la idea del MVC es entre otras ...
  #1 (permalink)  
Antiguo 07/09/2013, 12:40
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 19 años, 5 meses
Puntos: 43
Duda "teológica" sobre MVC

Hola a tod@s,
hoy los vengo con una duda "teológica" sobre el patrón MVC jeje. Como bien sabemos la idea del MVC es entre otras cosas separar la lógica de la vistas, etc, etc.
Revisando como funcionan la mayoría de los nuevos frameworks he notado que en los controladores hacen esto:
Código PHP:
Ver original
  1. $posts = DB::table('usuarios')->join('posts', 'usuarios.id', '=', 'posts.user_id')->get();

Yo siempre considere que en el controlador solo se hacen la lógica necesaria para devolver los datos del modelo a la vista. Como venia trabajando hasta ahora lo que yo haría es que en el modelo haya si un método "get()" que en el mismo este el join de la base de datos, y en el controlador solo pasar la vista el resultado de
Código PHP:
Ver original
  1. $post = $modelo->get();

En fin mi duda "existencial" es que si llamando con los ORM actuales en el controlador para devolver datos no se esta rompiendo el paradigma del MVC.

Espero que se haya entendido mi duda y desde ya muchas gracias!
  #2 (permalink)  
Antiguo 08/09/2013, 01:21
 
Fecha de Ingreso: junio-2013
Ubicación: Madrid
Mensajes: 73
Antigüedad: 10 años, 10 meses
Puntos: 27
Respuesta: Duda "teológica" sobre MVC

El ORM de Laravel (como otros ORMs), permite establecer relaciones entre modelos:

http://laravel.com/docs/eloquent#relationships


De tal manera que es posible en el controlador hacer simplemente esto (una vez definidas las relaciones entre modelos):

Código PHP:
Ver original
  1. $posts = Post::with('users')->get();
  2. $posts = Post::with('users', 'comments')->get();
  3. $posts = Post::with('users.country', 'comments')->get();

De todas formas, este sistema, si bien es cómodo y rápido, tiene una pega: no puedes testear sin acceder realmente a la base de datos. Por eso es recomendable trabajar con "repositorios" que proporcionen los datos, de manera que estos oculten el origen (ya sea base de datos, xml, o un simple array para testear).

Ejemplos en Laravel y Symfony:

http://culttt.com/2013/07/08/creatin...-repositories/

http://net.tutsplus.com/tutorials/ph...l-controllers/

http://symfony.com/doc/current/book/...sitory-classes
  #3 (permalink)  
Antiguo 12/09/2013, 04:44
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Duda "teológica" sobre MVC

El MVC no lo rompes pero como bien has notado algo no esta bien, independientemente del fw lo ideal es utilizar DI, un controller es una clase como cualquier otra y si esta tiene dependencias de alguna forma debes inyectarlas, el one-liner que muestras para mi es puro marketing, no utilizo Laravel pero si lo hiciera jamas me saltaría las dependencias de esa forma, simplemente inyectaría el Provider vía constructor.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #4 (permalink)  
Antiguo 12/09/2013, 12:06
 
Fecha de Ingreso: junio-2013
Ubicación: Madrid
Mensajes: 73
Antigüedad: 10 años, 10 meses
Puntos: 27
Respuesta: Duda "teológica" sobre MVC

Cita:
... simplemente inyectaría el Provider vía constructor
Ese mecanismo de inyectar el provider en el constructor está disponible en Laravel:

Por un lado, vinculamos una inteface con un repositorio
Código PHP:
Ver original
  1. App::bind(
  2.     'Repositories\PostRepositoryInterface',
  3.     'Repositories\RedisPostRepository'
  4. );

Y por otro, en el constructor del controlador simplemente tenemos algo así:

Código PHP:
Ver original
  1. use Repositories\PostRepositoryInterface as Post;
  2.  
  3. class PostsController extends BaseController {
  4.  
  5.     protected $post;
  6.  
  7.     public function __construct(Post $post)
  8.     {
  9.         $this->post = $post;
  10.     }
  11.  
  12.     public function index()
  13.     {
  14.         $posts = $this->post->all();
  15.  
  16.         return View::make('posts.index', ['posts' => $posts]);
  17.     }
  18.  
  19. }

De tal manera que si al controlador no le pasamos un Provider Laravel instancia el bind que tenga definido.

Supongo que en otros frameworks puede haber otros mecanismos parecidos. O puede que este sistema tampoco sea lo más recomendado. Todavía no lo he puesto en práctica

Etiquetas: controlador, mvc
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 2 personas




La zona horaria es GMT -6. Ahora son las 10:43.