create symfony cmd admin fosuserbundle

create - fosuserbundle symfony 3



Crear un usuario administrador con FosUserBundle (1)

Intento crear un usuario administrador con FOsUserBundle desde las ventanas de comandos con el siguiente comando:

php app/console fos:user:create

En mi proyecto, el Usuario administrador extiende a otros usuarios con propiedad obligatoria. Entonces, cuando elijo mi nombre de usuario, mi correo y mi contraseña, me dice:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column ''latitude'' cannot be null

¿Cómo puedo establecer el valor "latitud" en mi AdminUser? También uso PUGXMultiUserBundle.


La única forma posible de llegar a eso es

1 - anula el comando cli de FOSUserBundle colocado en Command/CreateUserCommand.php
2 - anula el método de creación de usuario de FOSUserBundle colocado en Util/UserManipulator.php

// Command/CreateUserCommand.php protected function execute(InputInterface $input, OutputInterface $output) { $username = $input->getArgument(''username''); $email = $input->getArgument(''email''); $password = $input->getArgument(''password''); $inactive = $input->getOption(''inactive''); $superadmin = $input->getOption(''super-admin''); $latitude = $input->getOption(''latitude''); //this will be your own logic add $manipulator = $this->getContainer()->get(''fos_user.util.user_manipulator''); $manipulator->create($username, $password, $email, $latitude, !$inactive, $superadmin); $output->writeln(sprintf(''Created user <comment>%s</comment>'', $username)); }

y

// Util/UserManipulator.php public function create($username, $password, $email, $latitude, $active, $superadmin) { $user = $this->userManager->createUser(); $user->setUsername($username); $user->setEmail($email); $user->setPlainPassword($password); $user->setEnabled((Boolean) $active); $user->setSuperAdmin((Boolean) $superadmin); $user->setLatitude($latitude); $this->userManager->updateUser($user); return $user; }

Por supuesto, cuando digo "override" quiero decir ... "override": "P" Así que no tienes que modificar los archivos originales de FOSUserBundle (ya sabes, es peligroso por muchas razones), pero FOSUserBundle tus propios archivos haciendo que tu paquete sea extendido por FOSUserBundle

¿Te estás preguntando cómo hacer que FOSUserBundle amplíe tu paquete?

En el "archivo principal" de su paquete, es el que usa para registrar su paquete, simplemente agregue estas líneas

public function getParent() { return ''FOSUserBundle''; }

Luego, simplemente recree la estructura de árbol donde sus archivos de ovverride se convierten en el paquete original, en el directorio de Recursos / del paquete personalizado (la misma posición, el mismo nombre de archivo, las mismas anotaciones si las hay) y .... la magia puede comenzar :) ( esto es válido solo para visitas, ¡por favor, preste atención! )

¿Qué significa "anular"?

Anular significa que toma una función existente, la "sombrea" redefiniéndola en otro lugar (declare una función con el mismo nombre, sin importar cuántos parámetros acepte, sin importar el tipo de parámetros, ya que php no admite la sobrecarga de métodos [excepto si haces un "truco"] y luego puedes usarlo en lugar del original. Esta es una técnica común para agregar funcionalidades adicionales a una función o para cambiar la función en sí misma.
Digamos que tenemos dos clases, A y B con B que es una clase hija de A. Digamos también que A tiene un método llamado myMethod() .

En B podemos hacer algo como

public function myMethod() { parent::myMethod(); //add extra functionalities here }

de esa forma estamos agregando funcionalidades extra ya que estamos llamando al método principal ("original") y luego ejecutamos algunas funcionalidades adicionales

Mientras que si en B hacemos algo como

función pública myMethod () {// algún código aquí, pero no llamando al método padre}

estamos redefiniendo el comportamiento de myMethod()

¿Cómo Symfony2 me permite anular los métodos?

Como dije anteriormente en mi respuesta, debe hacer que su paquete sea un elemento secundario del paquete que contiene las funciones que está intentando anular (en ese caso, FOSUserBundle ). Una vez que lo haya hecho, use el directorio de Resources de su paquete para lograr lo que necesita. reproduce la "estructura de carpeta de árbol" del paquete original (es decir, los mismos nombres de las carpetas) hasta que llegues a la clase que contiene la función que necesitas anular.

Siga su ejemplo real: necesita anular la función execute() contenida en Command/CreateUserCommand.php . Tienes que crear, en tu carpeta de paquetes esa ruta:

PathTo/YourCostumBundle/Command/

y colocar dentro del archivo CreateUserCommand.php con el contenido que te muestro arriba.

Si no comprende dónde encuentro esa ruta, ¡consulte el código de FOSUserBundle y estará absolutamente claro!

¿Por qué es peligroso modificar el código de FOSUserBundle directamente?

Bueno, hay muchas respuestas, un punto crítico que puedo mostrarte. Elegir el principal (no ordenado por importancia):

  • ¿Qué sucede si necesita actualizar FOSUserBundle? Utilizarás el compositor y perderás todos los cambios que hayas hecho en el código FOSUserBundle
  • ¿Qué sucede si tiene más de un paquete en su proyecto que necesita usar FOSUserBundle? Tal vez el comportamiento personalizado tiene sentido para un paquete, pero no para el otro. La adaptación del comportamiento a nivel de paquete local le ayuda a mantener la lógica de FOSUserBundle intacta
  • ¿Qué sucede si está desarrollando un paquete que desea compartir con otro usuario? Debe forzarlos a "tomar" su propia versión personalizada de FOSUserBundle y advertirles sobre su actualización

Finalmente: sé perfectamente que su entidad no está en FOSUserBundle, pero puedo apostar que amplían la base de usuarios de FOSUserBundle, por lo que lo que dije anteriormente es aplicable a su caso.

Espero que ahora sea menos difuso :)

Documentación: http://symfony.com/doc/current/cookbook/bundles/inheritance.html#overriding-controllers