Aprende a instalar y configurar el ampliamente conocido FOSUserBundle en Symfony 4 para crear un sistema de roles de usuario.

Cómo instalar y configurar FOSUserBundle en Symfony 4

Con la introducción de Symfony 4, muchas cosas cambiaron, la mayoría para siempre. Sin embargo, cuando trabaja en una empresa en la que trabaja constantemente en las mismas cosas (lógica), lo pasará mal descubriendo cómo funcionan las cosas en nuevos marcos. Ese es el caso de Symfony 4, donde el sistema de usuario se volvió aún más fácil de implementar. Sin embargo, si está enamorado de la facilidad que ofrece FOSUserBundle, es posible que desee saber que todavía es posible implementarlo en Symfony 4.

En este artículo, le mostraremos cómo instalar el FOSUserBundle tradicional en su nuevo proyecto Symfony 4.

1. Cree una aplicación web tradicional

Para implementar FOSUserBundle en un proyecto basado en Symfony 4, deberá trabajar con la versión tradicional de la aplicación web de Symfony (versión que instala las dependencias necesarias para crear una aplicación web, por ejemplo, Doctrine, Twig, SwiftMailer, Monolog, etc.) Entonces, como primer paso, crea tu nuevo proyecto Symfony usando esta versión:

composer create-project symfony/website-skeleton project_name

Esto creará un proyecto que tiene un par de dependencias como se muestra en el siguiente archivo composer.json:

{
    "type": "project",
    "license": "proprietary",
    "require": {
        "php": "^7.1.3",
        "ext-iconv": "*",
        "sensio/framework-extra-bundle": "^5.1",
        "symfony/apache-pack": "^1.0",
        "symfony/asset": "^4.1",
        "symfony/console": "^4.1",
        "symfony/expression-language": "^4.1",
        "symfony/flex": "^1.0",
        "symfony/form": "^4.1",
        "symfony/framework-bundle": "^4.1",
        "symfony/lts": "^[email protected]",
        "symfony/monolog-bundle": "^3.1",
        "symfony/orm-pack": "*",
        "symfony/process": "^4.1",
        "symfony/security-bundle": "^4.1",
        "symfony/serializer-pack": "*",
        "symfony/swiftmailer-bundle": "^3.1",
        "symfony/twig-bundle": "^4.1",
        "symfony/validator": "^4.1",
        "symfony/web-link": "^4.1",
        "symfony/yaml": "^4.1"
    },
    "require-dev": {
        "symfony/debug-pack": "*",
        "symfony/dotenv": "^4.1",
        "symfony/maker-bundle": "^1.0",
        "symfony/profiler-pack": "*",
        "symfony/test-pack": "^1.0",
        "symfony/web-server-bundle": "^4.1"
    },
    "config": {
        "preferred-install": {
            "*": "dist"
        },
        "sort-packages": true
    },
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "App\\Tests\\": "tests/"
        }
    },
    "replace": {
        "symfony/polyfill-iconv": "*",
        "symfony/polyfill-php71": "*",
        "symfony/polyfill-php70": "*",
        "symfony/polyfill-php56": "*"
    },
    "scripts": {
        "auto-scripts": {
            "cache:clear": "symfony-cmd",
            "assets:install %PUBLIC_DIR%": "symfony-cmd"
        },
        "post-install-cmd": [
            "@auto-scripts"
        ],
        "post-update-cmd": [
            "@auto-scripts"
        ]
    },
    "conflict": {
        "symfony/symfony": "*"
    },
    "extra": {
        "symfony": {
            "allow-contrib": false
        }
    }
}

Prepare su proyecto y póngalo en funcionamiento, una vez que obtenga al menos la página de bienvenida:

Symfony 4 No Route Welcome Page

Una vez hecho esto, continúe con el siguiente paso.

2. Instale FOSUserBundle

Después de crear su proyecto, proceda a instalar FOSUserBundle con composer con el siguiente comando:

composer require friendsofsymfony/user-bundle "~2.0"

Esto comenzará con la instalación y no necesitará configurar nada en el kernel o algo así, sin embargo, encontrará un mensaje de error una vez que finalice el proceso:

El nodo hijo "db_driver" en la ruta "fos_user" debe estar configurado.

Ignore esto y continúe con el siguiente paso.

3. Crear clase de usuario

A continuación, deberá crear la entidad Usuario en su proyecto, el objeto de clase que maneja el objeto de usuario. Como estamos trabajando con FOSUserBundle, la clase tiene la siguiente estructura, así que asegúrese de crear el archivo en el /project/src/Entitydirectorio con el nombre User.php y el siguiente contenido:

<?php
// src/Entity/User.php

namespace App\Entity;

use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    public function __construct()
    {
        parent::__construct();
        // your own logic
    }
}

4. Actualizar el archivo de configuración de seguridad

Después de crear la entidad de usuario, debe cambiar la configuración de seguridad, estableciendo el codificador FOSUserBundle como predeterminado definiéndolo como el proveedor de seguridad.

Edite el archivo /project/config/packages/security.yaml y cambie su contenido con lo siguiente:

# config/packages/security.yaml
security:
    encoders:
        FOS\UserBundle\Model\UserInterface: bcrypt

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: ROLE_ADMIN

    # https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
    providers:
        fos_userbundle:
            id: fos_user.user_provider.username_email

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            pattern: ^/
            form_login:
                provider: fos_userbundle
                csrf_token_generator: security.csrf.token_manager

            logout:       true
            anonymous:    true

     # Una forma sencilla de controlar el acceso a grandes secciones de su sitio
     # Nota: Solo se utilizará el * primer * control de acceso que coincida
    access_control:
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin/, role: ROLE_ADMIN }

5. Cree el archivo de configuración de FOSUserBundle

Una vez que FOSUserBundle se ha definido como el proveedor de usuario predeterminado, debe definir su configuración. En Symfony 4, esto se puede hacer a través de un nuevo archivo yaml /project/config/packages/fos_user.yaml que tendrá la configuración predeterminada de este paquete:

# config/packages/fos_user.yaml
fos_user:
    db_driver: orm # other valid values are 'mongodb' and 'couchdb'
    firewall_name: main
    user_class: App\Entity\User
    from_email:
        address: "[email protected]"
        sender_name: "[email protected]"

6. Permita la creación de plantillas de PHP y Twig y habilite el enrutamiento

Como lo requiere FOSUserBundle, los motores de plantillas PHP y Twig deben estar habilitados, así que asegúrese de habilitarlo en el archivo /project/config/packages/framework.yaml:

framework:
    templating:
        engines: ['twig', 'php']

También debe habilitar las rutas FOSUserBundle, así que cree el archivo de rutas para FOSUserBundle con el archivo /project/config/routes/fos_user.yaml y agregue el siguiente contenido:

fos_user:
    resource: "@FOSUserBundle/Resources/config/routing/all.xml"

Esto registrará las rutas predeterminadas de FOSUserBundle como el inicio de sesión, cierre de sesión, registro, etc.

7. Actualice el esquema de su base de datos

Como último paso, solo necesitas actualizar el esquema de tu base de datos con el siguiente comando:

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

Esto creará la fos_usertabla en su base de datos y podrá registrar usuarios. Con este paso, finaliza la instalación y configuración de FOSUserBundle.

8. Pruebe el sistema de usuario

Como último paso, puede probar FOSUserBundle en su proyecto accediendo al proyecto web, por ejemplo en la ruta de registro http://yourproject/register, por ejemplo , donde encontrará el formulario de FOSUserBundle:

Register Page FOSUserBundle

Que te diviertas ❤️!


Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores