Introducción a Sylius User Bundle para Symfony - Primera parte

Blog image

Este post es parte de una serie de publicaciones de nuestro blog sobre paquetes básicos de Sylius/Symfony eCommerce Framework.

En Odiseo, estuvimos trabajando con Symfony Framework durante mucho tiempo. La base de la mayoría de nuestros muchos proyectos web se basa en Symfony. Nuestro equipo cree en el ecosistema y la comunidad de Symfony. Hicimos muchas herramientas open-source para trabajar con Symfony y utilizamos bibliotecas relevantes de la comunidad en nuestros proyectos.

En nuestro portfolio tenemos realizados muchos tipos de aplicaciones para todas las necesidades de nuestros clientes. Pero cuando se trata de crear un eCommerce utilizamos Sylius.

Sylius es uno de los frameworks de comercio electrónico de código abierto más utilizado hecho en Symfony. La más alta calidad de código, una sólida cultura de pruebas(testing), desarrollo dirigido por comportamiento(BDD: https://solidgeargroup.com/bdd-testing-y-behat?lang=es) incorporado y una flexibilidad excepcional lo convierten en la mejor solución para aplicaciones adaptadas a los requisitos de su negocio.

Además, Sylius, como Framework diseñado para desarrolladores, no se trata solo de vender productos. También tiene muchas otras características que usamos en casi todos los proyectos con Symfony. Para devolver nuestra experiencia a la comunidad de Symfony, creamos una serie de post que explican cómo trabajar con algunas de ellas.

Introducción a una de las características de Sylius: SyliusUserBundle

Los usuarios son una parte importante de casi cualquier proyecto que tenga algún nivel de seguridad o interacción del usuario. Symfony proporciona una interfaz útil para proteger su sistema, pero el resto depende de usted.

Sylius tiene un Componente y un Bundle que le proporcionan modelos, servicios y eventos para trabajar con los usuarios, incluidos inicio de sesión, registro, oauth y más. Veamos como trabajar con eso!!

Origen y motivación. ¿Por qué no FOSUserBundle?

Sí, solíamos usar FOSUserBundle. En realidad es un paquete muy bueno, pero no sigue la convención de Sylius. Comenzamos a sentir que trabajar con usuarios y clientes no se siente como todas las demás entidades en nuestros proyectos. Y, por supuesto, el equipo central de Sylius piensa lo mismo:

"Sylius se basa en convenciones sólidas, lo que significa que para todos los modelos de datos tienen la misma estructura de servicios, los nombres de eventos, clases y, en general, las cosas funcionan de la misma manera para todo, excepto el modelo de usuario de FOSUserBundle" - Sylius Blog

SyliusUserBundle es una muy buena opción para administrar usuarios y seguridad en el proyecto Symfony. Proporciona todas las funciones necesarias para tener una seguridad basada en los usuarios, además integra la configuración de SyliusResourceBundle para que los usuarios puedan administrarla fácilmente. Si desea obtener más información sobre el paquete de recursos, Sylius ya tiene una buena documentación en su sitio.

Instalación

Puede instalar este paquete con Composer. Teniendo instalado Composer globalmente ejecuta:

$ composer require sylius/user-bundle

Si no estas utilizando Symfony Flex, debe agregar los paquetes necesarios al Kernel, que son `SyliusUserBundle`,` SyliusMailerBundle` y si no está utilizando ningún otro paquete de Sylius, también deberá agregar `` SyliusResourceBundle`` y sus dependencias al Kernel siguiendo su documentación.

Configuración

Configuración básica del Bundle:

# config/packages/sylius_user.yaml
security:
    encoders:
        argon2i: argon2i

sylius_user:
    encoder: argon2i

jms_serializer:
    metadata:
        directories:
            sylius-user:
                namespace_prefix: "Sylius\\Component\\User"
                path: "@SyliusUserBundle/Resources/config/serializer"

Configure las extensiones de Doctrine que usa el Bundle.

# config/packages/stof_doctrine_extensions.yaml
stof_doctrine_extensions:
    orm:
        default:
            timestampable: true

Modelos

Usuario

Sylius Framework usa el concepto de "Clientes" y "Usuarios" por separado. Eso significa que podría tener un cliente (para otros proyectos podría ser Cliente, Proveedor, Estudiante, etc.) que contenga información personal. Y la entidad Usuario que representa a un usuario registrado que tiene todo lo relacionado con las preferencias de usuario de la aplicación y una asociación con Cliente (si es necesario).

OAuth

La entidad OAuth tiene todos los datos relacionados con la cuenta OAuth. Un usuario puede tener muchas cuentas OAuth. (¿Que es Oauth?)

División de usuarios en AdminUser, AppUser (ShopUser en Sylius).

Creamos 2 tipos de usuarios:

  • AdminUser: creado para habilitar cuentas de administrador que tienen acceso al panel de administración.

  • AppUser: diseñado para clientes que se han registrado en el sistema; tienen una cuenta con correo electrónico y contraseña. Pueden visitar y modificar su cuenta.

AdminUser

La entidad AdminUser simplemente extiende la entidad User.

namespace App\Entity;

use Sylius\Component\User\Model\User;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="app_admin_user")
 */
class AdminUser extends User
{
    public function __construct()
    {
        parent::__construct();
        $this->roles = ['ROLE_ADMIN'];
    }
}

Configurarlo con el User Type:


sylius_user:
    driver: doctrine/orm
    resources:
        admin:
            user:
                classes:
                    model: App\Entity\AdminUser
                    repository: Sylius\Bundle\UserBundle\Doctrine\ORM\UserRepository
                    form: Sylius\Bundle\UserBundle\Form\Type\UserType
                templates: 'admin/user' 

Para actualizar su esquema de base de datos, simplemente ejecute el siguiente comando:

$ php bin/console doctrine:schema:update --force

¿Cómo crear un AdminUser?

Crear un AdminUser es como cualquier otra entidad, tiene su propia Factory. Por defecto tendrá un rol de administración (ROLE_ADMIN) asignado como en el ejemplo anterior.

$admin = $this->container->get('sylius.factory.admin_user')->createNew();

$admin->setEmail('administrator@test.com');
$admin->setPlainPassword('pswd');

$this->container->get('sylius.repository.admin_user')->add($admin);

AppUser (or ShopUser)

Probablemente desee agregar algunos campos y funciones personalizadas a su entidad de usuario, así que creemos uno personalizado. Puede llamarlo FrontendUser, ShopUser, AppUser o simplemente User:

namespace App\Entity;

use Sylius\Component\User\Model\User as BaseUser;
use Sylius\Component\User\Model\UserOAuthInterface;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="app_user")
 */
class AppUser extends BaseUser
{
    /** @var string|null */
    protected $name;

    /** overrided method */
    public function setEmail(?string $email): void
    {
        parent::setEmail($email);
        $this->setUsername($email);
    }

    /**
     *  custom method
     * @return AppUserOAuth|UserOAuthInterface|null
     */
    public function getFacebook(): ?UserOAuthInterface
    {
        return $this->getOAuthAccount('facebook');
    }
}

Configurarlo con el User Type:

sylius_user:
    driver: doctrine/orm
    resources:
        # … admin_user configuration 
        app:
            user:
                classes:
                    model: App\Entity\AppUser
        oauth:
            user:
                classes:
                    model: Sylius\Component\User\Model\UserOAuth
                    interface: Sylius\Component\User\Model\UserOAuthInterface
                    controller: Sylius\Bundle\ResourceBundle\Controller\ResourceController
                    repository: Sylius\Bundle\UserBundle\Doctrine\ORM\UserRepository
                    form: Sylius\Bundle\UserBundle\Form\Type\UserType
                templates: 'admin/user' 

Actualice su esquema de base de datos nuevamente:

$ php bin/console doctrine:schema:update --force

¿Cómo crear un AppUser?

Podemos crear una entidad de Cliente o Guess(invitado) para recopilar datos sobre invitados no registrados del sistema (aquellos que han estado interactuando en el sitio y alguna manera nos han proporcionado su correo electrónico).

Suponiendo que ya tenemos una entidad Guess configurada como 'app.guess' (ya sea recuperada del repositorio o una recién creada) use un Factory para crear un nuevo usuario de aplicación, asigne la Guess existente y una contraseña a través del método 'setPlainPassword ()'.

$user = $this->container->get('sylius.factory.app_user')->createNew();

$customer = $this->container->get(app.repository.guess)->findOneBy(['email' => 'guess@test.com']);

/* and assign it to the AppUser */
$user->setGuess($customer);
$user->setPlainPassword('pswd');

$this->container->get('sylius.repository.app_user')->add($user);

Cambiar la contraseña del usuario de la entidad AppUser

La contraseña ya establecida de un AppUser se puede cambiar fácilmente mediante el método `` setPlainPassword () ``.

$user->getPassword(); // returns encrypted password - 'pswd'

$user->setPlainPassword('resu1');
// la contraseña ahora será 'resu1' y se cifrará mientras se guarda al usuario en la base de datos

¡Eso es todo! En la próxima publicación continuaremos y hablaremos sobre cómo configurar el user security access.

Compartir este Post:
Diego Adrián D'Amico
Me gusta el fútbol y la tecnología. Tengo 34 años, estoy casado, tengo un hijo y 2 perros.
Busco constantemente la manera de mejorar y progresar tanto a nivel personal como profesional

0 Comentarios

Deja tu comentario