Hola, no me aclaro mucho con la diferencia entre tener un repositorio de la entidad o un manager. El manager es un servicio pero no entiendo cuándo utilizarlo o no. Creo que los dos son más o menos lo mismo, salvo la ventaja de que uno es un servicio y el otro no.
Un saludo
Respuestas
La diferencia entre estos dos conceptos se puede entender bien con un ejemplo sencillo. Imagina que en tu aplicación creas entidades para representar a los usuarios. ¿Cuándo utilizar una clase repositorio y cuándo un manager?
- El repositorio te serviría para buscar y persistir usuarios.
- El manager te serviría para gestionar usuarios (crear, borrar, cambiar contraseña, etc.) y para buscarlos (los mismos métodos que el repositorio).
Echa un vistazo por ejemplo al código del manager de usuarios del bundle FOSUserBundle. Como verás, este manager tiene muchos métodos que no tienen nada que ver con la persistencia. Por ejemplo, mira el código del método updatePassword()
:
abstract class UserManager implements UserManagerInterface, UserProviderInterface { // ... public function updatePassword(UserInterface $user) { if (0 !== strlen($password = $user->getPlainPassword())) { $encoder = $this->getEncoder($user); $user->setPassword($encoder->encodePassword($password, $user->getSalt())); $user->eraseCredentials(); } } }
Este método se encarga de cambiar la contraseña del usuario, una tarea muy habitual en las aplicaciones web. Como se trata de una acción que no tiene nada que ver con persistir información, sería muy raro incluirlo en una clase de tipo repositorio.
Por otra parte, en el mismo manager también puedes encontrarte con estos métodos:
abstract class UserManager implements UserManagerInterface, UserProviderInterface { // ... public function findUserByEmail($email) { return $this->findUserBy(array( 'emailCanonical' => $this->canonicalizeEmail($email) )); } public function findUserByUsername($username) { return $this->findUserBy(array( 'usernameCanonical' => $this->canonicalizeUsername($username) )); } }
Estos dos métodos de búsqueda de información se podrían haber definido en una clase de tipo repositorio. Sin embargo, como este bundle ha decidido que no quiere crear una clase repositorio, estos métodos también se definen en el manager.
En definitiva, un manager es mucho más útil para las aplicaciones web complejas ya que permiten incluir muchas más operaciones que las relacionadas con la persistencia de información.
@javiereguiluz
Ostras!! Gracias por explicarlo para lelos; es que, a veces lees cosas y vaya... es para gente más avanzada o acostumbrada a este tipo de programación. Para los que venimos del PHP simplista nos cuesta mucho.
Me ha quedado muy claro, muchísimas gracias.
@AlbertoVioque
Buenos días, por reutilizar este hilo...
Estoy haciendo mi primera aplicación seria con Symfony2, siendo novato en programación, y el caso es que yo el manager lo uso para todo prácticamente, incluso para acceder a la clase repositorio (clases repository personalizadas incluidas), de manera que si en un futuro necesito aumentar la funcionalidad de una determinada función que inicialmente sólo hace de puente hacia el repositorio, es en el manager donde la defino.
¿Está bien hacerlo de esta manera? Porque mi idea es en principio usarlo también para persistir y enviar a la base de datos.
Un saludo.
@hm_sergio
@hm_sergio lo estás haciendo perfectamente. Aunque tengas que escribir (y mantener) un poco más de código por usar los managers prácticamente para todo, a la larga seguramente te va a compensar. Tu aplicación será más fácil de mantener y el código más fácil de leer, gracias a los métodos de alto nivel que has definido en los managers.
@javiereguiluz
@javiereguiluz gracias por la aclaración. Seguiré haciéndolo así, ahora he empezado a llamar a managers desde dentro de otros managers. Esto viene muy bien explicado en el capítulo 16.6 y 16.7 del libro de symfony2 de esta web.
@hm_sergio