Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

FosUserBundle, ¿cómo funciona?

29 de septiembre de 2014

Hola, estoy viendo el código de FOSUserBundle para aprender cosas. Me entra la duda a la hora de ver sus entidades y el crear tu propia entidad User, de la manera que está, ¿cómo hacen para que no se te cree la tabla de su propia entidad?

Ya que estás diciendo en el bundle una y luego en tu bundle otra, que extiende de esa pero ¿cómo sabe Symfony, o quien sea, que no debe hacerlo, que sólo debe crear la tabla de tu entidad?

Saludos


Respuestas

#1

La respuesta es más sencilla de lo que puede parecer al principio. Fíjate en el posible código de tu clase propia User:

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 */
class User extends BaseUser
{

Esta clase solamente dice que hereda de BaseUser y configura un par de anotaciones. Al extender de una clase, sus comentarios no se heredan, por lo que sus anotaciones no se heredan.

En otras palabras, si usas la clase base que te proporciona el bundle, entonces el nombre de la tabla es el que indique la anotación @ORM\Table de esa clase. Si utilizas tu propia clase de usuario, se heredan todos los campos de la clase base pero a la vez, se usan tus anotaciones y por tanto, tu nombre de tabla.

Otra cosa muy distinta sería si tu clase User hereda de la otra a nivel de Doctrine (anotación @InheritanceType) y no sólo a nivel de PHP (palabra reservada extends).

@javiereguiluz

29 septiembre 2014, 17:55
#2

Hola Javier, si pero no lo pillo jaja, a ver yo estoy intentando hacer algo parecido, pero en mi caso me crea dos tablas, en el ejemplo de FOSUserBundle tiene la entidad de la que extiende BaseUser y esta la tuya User, pero al generar la base de datos solo te crea la tuya, la tabla que corresponde a BaseUser no.

Te pongo mi ejemplo, tengo un bundle NotificationBundle, este dispone de una interface NotificationInterface y una clase abstracta NotificationAbstract, la clase abstracta implementa la NotificationInterface, y luego tengo una entidad llamada Notification que extiende NotificationAbstract.

Ahora quiero tener un bundle y en ella crear mi propia clase que extienda de la entidad de mi bundle NotificationBundle, o sea, tengo mi bundle PruebasBundle y en el creo una entidad llamada MyNotification y esta extiende de NotificationBundle:Notification

Creo que es así como hacen en FOSUserBundle o FOSCommentBundle, pero a ellos no le genera dos tablas, y en mi caso me genera una Notification y otra MyNotification.

@AlbertoVioque

30 septiembre 2014, 12:00
#3

Vale no me había parado a ver lo que me decías de:

Otra cosa muy distinta sería si tu clase User hereda de la otra a nivel de Doctrine (anotación @InheritanceType) y no sólo a nivel de PHP (palabra reservada extends).

Poniendo esto type: mappedSuperclass en la clase Notification sólo crea la entidad que creo en el bundle de pruebas.

@AlbertoVioque

30 septiembre 2014, 13:50