Creaci贸n de usuarios

11/17

Lectura

Nuevas pantallas de administrador: creaci贸n de usuarios

En la clase anterior vimos c贸mo armar el mecanismo para la creaci贸n de empresas y notamos que un punto necesario era la asociaci贸n de usuarios a esas empresas.

Es momento de dotar al administrador de la posibilidad de crear dichos usuarios.

Para ahorrarnos algo de trabajo usemos algo m谩s de la magia de Symfony:

php bin/console make:crud

Con este simple comando generaremos:

  1. Un nuevo tipo de formulario
  2. Un nuevo controlador
  3. Una serie de templates para las operaciones b谩sicas (Create, Read, Update, Delete).

Una vez finalizada su ejecuci贸n, si te diriges a [http://homestead.test/user](http://homestead.test/user) te encontrar谩s con algo similar a:

No es muy vistoso, es cierto, pero es funcional.

Lo primero que notar谩s es que se est谩 mostrando la contrase帽a (encriptada, claro)鈥 algo que no deber铆a suceder.

Abre el archivo templates/user/index.htmly elimina las l铆neas que hacen referencia a esta propiedad.

Al recargar la p谩gina te encontrar谩s con:

El tema de que est谩 en ingl茅s es f谩cil de solucionar, 驴cierto?

Pasemos a lo importante: 驴funciona la creaci贸n de un nuevo usuario?

Probemos siguiendo el enlace Create new:

隆PUM! 驴Qu茅 ha pasado?

Nada grave realmente, solo se trata de un peque帽o problema de conversi贸n: f铆jate que los roles del usuario son un string, pero no cualquier string: son un string json.

Dir铆gete un momento al archivo templates/user/new.html.

No hay demasiado ah铆 dentro, 驴cierto? Es un poco de decoraci贸n para un:

{{ include('user/_form.html.twig') }}

Con lo cual, la respuesta debe estar en el archivotemplates/user/_form.html.

Este template tampoco aporta demasiado鈥 se limita a hacer un render del form.

驴Y entonces? 驴D贸nde est谩 el problema?

Vayamos a ver el m茅todoUserController::newque es el que genera esta pantalla.

Ah铆 puedes ver que se est谩 utilizando el formularioApp\Form\UserType.

Nada sospechoso, 驴cierto?

El problema surge de la configuraci贸n por defecto del widget utilizado para mostrar este arreglo ($roles) como un campo de selecci贸n no-m煤ltiple, cuando, al menos en teor铆a, un usuario podr铆a tener m谩s de un rol asignado.

La forma de corregirlo es tocar ligeramente la configuraci贸n del formulario:

En el archivo src/Form/UserType.php cambia

->add('roles')

por:

->add('roles', ChoiceType::class,
   [
       'choices' => [
           'Administrador' => 'ROLE_ADMIN',
           'Empresa' => 'ROLE_COMPANY',
           'Postulante' => 'ROLE_APPLICANT',
       ],
       'multiple' => true,
       'expanded' => true,
   ]
)

Y obtendr谩s una preciosa visualizaci贸n como:

隆Genial! Lo que falta ahora es almacenar la contrase帽a en forma encriptada.

Para ello usaremos un servicio de Symfony: el UserPasswordEncoder.

Lo primero que debemos hacer es declarar que lo haremos agregando al comienzo de nuestro script:

use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;

Y luego cambiaremos la definici贸n del m茅todo new por:

/**
* @Route("/new", name="user_new", methods={"GET","POST"})
*/
public function new(Request $request, UserPasswordEncoderInterface $encoder): Response
{
   ...

   if ($form->isSubmitted() && $form->isValid()) {
       $entityManager = $this->getDoctrine()->getManager();
       $user->setPassword($encoder->encodePassword($user, $user->getPassword()));
       $entityManager->persist($user);
       $entityManager->flush();

       return $this->redirectToRoute('user_index');
   }
   ...
}

隆Perfecto! Ahora s铆 podemos crear nuevos usuarios que podr谩n ingresar a la aplicaci贸n 馃槂

Lo que nos queda por hacer es asegurarnos de que solo los administradores puedan usar estas funcionalidades.

Nada del otro mundo, basta con un annotation bien colocado y asunto resuelto:

@IsGranted("ROLE_ADMIN")

Antes del comienzo de la definici贸n de la clase ser谩 suficiente 馃槂

Perfecto, ahora tenemos mecanismos para generar:

  1. Nuevas empresas
  2. Nuevos usuarios

Faltan algunos detalles del usuario administrador, es cierto, pero鈥 驴qu茅 tal si nos ocupamos un rato de nuestros usuarios?

Acomp谩帽ame a la pr贸xima clase a explorar la vista de la empresa.

Aportes 4

Preguntas 0

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Reg铆strate o inicia sesi贸n para participar.

Para poder usar ChoiceType hay que a帽adir la clase en el UserType.php

use Symfony\Component\Form\Extension\Core\Type\ChoiceType;

Y para usar IsGranted:

use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;

Siento que de esta forma me queda algo m谩s por comprender. Hasta el momento he podido solucionar complementando con otros recursos.

Listo el CRUD de User, vamos por m谩s 鈥

Faltan temas por explicarse pero por ahora todo bien, b谩sicamente el make:crud te crea las vistas y las funcionalidades para hacer el crud, solo debes especificar cu谩l es la clase a la que le va a hacer el CRUD (El Entity) en este caso es a User