1. Code
  2. PHP
  3. Yii

Cómo programar con Yii2: Integración de registro de usuario

Esta es la cuarta parte de una serie sobre Yii2. En la programando con Yii2: Primeros pasos, configuramos Yii2 localmente, construimos una aplicación Hello World, configuramos un servidor remoto y usamos Github para desplegar nuestro código. En la segunda parte, aprendimos sobre la implementación de Yii de su arquitectura Model View Controller y cómo construir páginas web y formularios que recopilen y validen datos. En la parte tres, aprendimos a trabajar con bases de datos y ActiveRecord. En este tutorial, le guiaremos a través de la integración de un popular complemento de registro de usuario.
Scroll to top
7 min read
This post is part of a series called How to Program With Yii2.
How to Program With Yii2: Working With the Database and Active Record
How to Program With Yii2: Localization With I18n

Spanish (Español) translation by Elías Nicolás (you can also view the original English article)

Final product imageFinal product imageFinal product image
What You'll Be Creating

Si te preguntas, "¿Qué es Yii?", Echa un vistazo a mi tutorial anterior: Introducción al Framework Yii, que revisa los beneficios de Yii e incluye una visión general de lo que es nuevo en Yii 2.0, lanzado el 12 de octubre de 2014.

Esta es la cuarta parte de una serie sobre Yii2. En la programando con Yii2: Primeros pasos, configuramos Yii2 localmente, construimos una aplicación Hello World, configuramos un servidor remoto y usamos Github para desplegar nuestro código. En la segunda parte, aprendimos sobre la implementación de Yii de su arquitectura Model View Controller y cómo construir páginas web y formularios que recopilen y validen datos. En la parte tres, aprendimos a trabajar con bases de datos y ActiveRecord. En este tutorial, le guiaremos a través de la integración de un popular complemento de registro de usuario.

Para estos ejemplos, continuaremos construyendo nuestra aplicación hola disponible en el repositorio Tuts+ para que pueda seguirlo.

Registro de usuario para su aplicación web

Casi cualquier aplicación web de cualquier utilidad requiere alguna forma de registro de usuario. Yii proporciona un par de maneras de acercarse al registro de usuarios, ambos relativamente sencillos. Esta es una de las cosas que me gusta sobre el uso de Yii sobre PHP— en momentos, puedo tener un marco de aplicaciones web completamente equipado listo para construir cosas interesantes.

Hay pocas razones para reconstruir la rueda y codificar la autenticación del usuario y sus muchos requisitos y características corolario desde cero, p. Envío de correos electrónicos y autenticación para la verificación de registro, recuperación de contraseñas, autenticación social de terceros, et al.

La plantilla de aplicación avanzada Yii2 proporciona un registro de usuario incorporado; Estamos utilizando este enfoque en la serie Construyendo su startup. Sin embargo, en esta serie, hemos estado construyendo sobre la plantilla de aplicación básica de Yii2. La plantilla de aplicación básica predeterminada incluye el inicio de sesión de usuario estatico, lo cual no es muy útil.

Yii2 Basic Application Template Static LoginYii2 Basic Application Template Static LoginYii2 Basic Application Template Static Login

Otro enfoque para el registro de usuarios es el uso de extensiones de terceros. Para este tutorial, te acompañaré con la extensión Yii2-User de Dmitry Erofeev. La documentación de Yii2-User está disponible aquí. Erofeev está construyendo otros complementos para Yii2 también.

Dektriums Yii2-User DocumentationDektriums Yii2-User DocumentationDektriums Yii2-User Documentation

Instalación de Yii2-User

Comencemos a instalar la extensión Yii2-User. Seguiremos las instrucciones de instalación.

Instalación de Yii2-User con Composer

Primero, tenemos que añadir Yii2-User a las extensiones requeridas en composer. Edite el archivo /composer.json para incluir Yii2-User:

1
    "require": {
2
        "php": ">=5.4.0",
3
        "yiisoft/yii2": "*",
4
        "yiisoft/yii2-bootstrap": "*",
5
        "yiisoft/yii2-swiftmailer": "*",
6
        "dektrium/yii2-user": "*"
7
    },

Entonces, cuando actualizamos el compositor, verás algo como esto:

1
Admins-MacBook-Pro-2:hello Jeff$ composer update
2
Loading composer repositories with package information
3
Updating dependencies (including require-dev)
4
  - Removing yiisoft/yii2-composer (2.0.0)                 
5
  - Installing yiisoft/yii2-composer (2.0.1)
6
    Downloading: 100%         
7
8
  ...
9
  
10
  - Installing dektrium/yii2-user (v0.8.2)
11
    Downloading: 100%         
12
13
Writing lock file
14
Generating autoload files

Actualizar la base de datos

A continuación, ejecutamos la migración de la base de datos para Yii2-User. Esto crea las tablas de base de datos que requiere la extensión. Éstos administrarán cuentas de usuario y credenciales.

1
hello Jeff$ php yii migrate/up --migrationPath=@vendor/dektrium/yii2-user/migrations
2
Yii Migration Tool (based on Yii v2.0.1)
3
4
Total 6 new migrations to be applied:
5
    m140209_132017_init
6
  m140403_174025_create_account_table
7
	m140504_113157_update_tables
8
	m140504_130429_create_token_table
9
	m140830_171933_fix_ip_field
10
	m140830_172703_change_account_table_name
11
12
Apply the above migrations? (yes|no) [no]:yes
13
*** applying m140209_132017_init
14
    > create table {{%user}} ... done (time: 0.010s)
15
    > create unique index user_unique_username on {{%user}} (username) ... done (time: 0.015s)
16
    > create unique index user_unique_email on {{%user}} (email) ... done (time: 0.012s)
17
    > create unique index user_confirmation on {{%user}} (id, confirmation_token) ... done (time: 0.011s)
18
    > create unique index user_recovery on {{%user}} (id, recovery_token) ... done (time: 0.010s)
19
    > create table {{%profile}} ... done (time: 0.007s)
20
    > add foreign key fk_user_profile: {{%profile}} (user_id) references {{%user}} (id) ... done (time: 0.010s)
21
*** applied m140209_132017_init (time: 0.078s)
22
23
*** applying m140403_174025_create_account_table
24
    > create table {{%account}} ... done (time: 0.008s)
25
    > create unique index account_unique on {{%account}} (provider,client_id) ... done (time: 0.010s)
26
    > add foreign key fk_user_account: {{%account}} (user_id) references {{%user}} (id) ... done (time: 0.009s)
27
*** applied m140403_174025_create_account_table (time: 0.027s)
28
29
*** applying m140504_113157_update_tables
30
    > drop index user_confirmation ... done (time: 0.007s)
31
    > drop index user_recovery ... done (time: 0.008s)
32
    > drop column confirmation_token from table {{%user}} ... done (time: 0.009s)
33
    > drop column confirmation_sent_at from table {{%user}} ... done (time: 0.009s)
34
    > drop column recovery_token from table {{%user}} ... done (time: 0.007s)
35
    > drop column recovery_sent_at from table {{%user}} ... done (time: 0.008s)
36
    > drop column logged_in_from from table {{%user}} ... done (time: 0.007s)
37
    > drop column logged_in_at from table {{%user}} ... done (time: 0.008s)
38
    > rename column registered_from in table {{%user}} to registration_ip ... done (time: 0.009s)
39
    > add column flags integer NOT NULL DEFAULT 0 to table {{%user}} ... done (time: 0.010s)
40
    > rename column properties in table {{%account}} to data ... done (time: 0.008s)
41
*** applied m140504_113157_update_tables (time: 0.090s)
42
43
*** applying m140504_130429_create_token_table
44
    > create table {{%token}} ... done (time: 0.006s)
45
    > create unique index token_unique on {{%token}} (user_id,code,type) ... done (time: 0.010s)
46
    > add foreign key fk_user_token: {{%token}} (user_id) references {{%user}} (id) ... done (time: 0.009s)
47
*** applied m140504_130429_create_token_table (time: 0.026s)
48
49
*** applying m140830_171933_fix_ip_field
50
    > alter column registration_ip in table {{%user}} to bigint ... done (time: 0.010s)
51
*** applied m140830_171933_fix_ip_field (time: 0.011s)
52
53
*** applying m140830_172703_change_account_table_name
54
    > rename table {{%account}} to {{%social_account}} ... done (time: 0.001s)
55
*** applied m140830_172703_change_account_table_name (time: 0.002s)
56
57
Migrated up successfully.

Actualizar el archivo de configuración

A continuación, necesitamos decirle a Yii que use el componente Yii2-User. En /config/web.php, reemplazamos el componente de usuario predeterminado ...

1
        'user' => [
2
            'identityClass' => 'app\models\User',
3
            'enableAutoLogin' => true,
4
        ],

... con el componente Yii2-User:

1
        'user' => [
2
            'class' => 'dektrium\user\Module',
3
            'enableUnconfirmedLogin' => true,
4
            'confirmWithin' => 21600,
5
            'cost' => 12,
6
            'admins' => ['admin']
7
        ],        

Activar el SwiftMailer

Dado que Yii2-User usa correo electrónico para enviar confirmaciones de registro y contraseñas olvidadas, es hora de activar nuestra configuración de SwiftMailer. En config / web.php, reemplace la configuración predeterminada de Mailer aquí...

1
        'mailer' => [
2
            'class' => 'yii\swiftmailer\Mailer',
3
            // send all mails to a file by default. You have to set

4
            // 'useFileTransport' to false and configure a transport

5
            // for the mailer to send real emails.

6
            'useFileTransport' => true,
7
        ],

... con esto—tendrás que incluir tus propias credenciales SMTP:

1
        'mailer' => [
2
                'class' => 'yii\swiftmailer\Mailer',
3
                'viewPath' => '@app/mailer',
4
                'useFileTransport' => false,
5
                'transport' => [
6
                    'class' => 'Swift_SmtpTransport',
7
                    'host' => 'your-host-domain e.g. smtp.gmail.com',
8
                    'username' => 'your-email-or-username',
9
                    'password' => 'your-password',
10
                    'port' => '587',
11
                    'encryption' => 'tls',
12
                                ],
13
            ],

Integración de Yii2-User

Ahora, necesitamos vincular nuestra barra de navegación a las rutas del controlador Yii2-User. En /views/layouts/main.php, actualizamos la definición de matriz de barra de navegación para el menú Bootstrap. Reemplazar la barra de navegación actual ...

1
echo Nav::widget([
2
                'options' => ['class' => 'navbar-nav navbar-right'],
3
                'items' => [
4
                    ['label' => 'Home', 'url' => ['/site/index']],
5
                    ['label' => 'Status', 'url' => ['/status/index']],
6
                    ['label' => 'About', 'url' => ['/site/about']],
7
                    ['label' => 'Contact', 'url' => ['/site/contact']],
8
                    Yii::$app->user->isGuest ?
9
                        ['label' => 'Login', 'url' => ['/site/login']] :
10
                        ['label' => 'Logout (' . Yii::$app->user->identity->username . ')',
11
                            'url' => ['/site/logout'],
12
                            'linkOptions' => ['data-method' => 'post']],
13
                ],
14
            ]);

... con la siguiente definición en array:

1
            $navItems=[
2
                ['label' => 'Home', 'url' => ['/site/index']],
3
                ['label' => 'Status', 'url' => ['/status/index']],
4
                ['label' => 'About', 'url' => ['/site/about']],
5
                ['label' => 'Contact', 'url' => ['/site/contact']]
6
              ];
7
              if (Yii::$app->user->isGuest) {
8
                array_push($navItems,['label' => 'Sign In', 'url' => ['/user/login']],['label' => 'Sign Up', 'url' => ['/user/register']]);
9
              } else {
10
                array_push($navItems,['label' => 'Logout (' . Yii::$app->user->identity->username . ')',
11
                    'url' => ['/site/logout'],
12
                    'linkOptions' => ['data-method' => 'post']]
13
                );
14
              }
15
            echo Nav::widget([
16
                'options' => ['class' => 'navbar-nav navbar-right'],
17
                'items' => $navItems,
18
            ]);

Vuelva a cargar la aplicación y haga clic en el enlace Sign Up en la barra de navegación. Debería ver algo como esto:

Yii2-User Sign Up PageYii2-User Sign Up PageYii2-User Sign Up Page

Al hacer clic en Sign Up, verá la notificación de confirmación. Esto nos indica que se ha enviado un correo electrónico al que debemos hacer clic para verificar nuestro registro.

Yii2-User Sign Up Confirmation NoticeYii2-User Sign Up Confirmation NoticeYii2-User Sign Up Confirmation Notice

Recibirás un correo electrónico como éste:

Yii2-User Confirmation EmailYii2-User Confirmation EmailYii2-User Confirmation Email

Haz clic en el enlace del correo electrónico y verás algo como esto:

Yii2-User Sign Up ConfirmationYii2-User Sign Up ConfirmationYii2-User Sign Up Confirmation

Observe el estado de inicio de sesión mantenido por Yii2 y el componente Yii2-User—que se muestra en la barra de navegación anterior. Haga clic en Logout y vaya a través de la página de inicio de sesión:

Yii2-User Sign In FormYii2-User Sign In FormYii2-User Sign In Form

Yii2-User también incluye recuperación de contraseña:

Yii2-User Forgot Your PasswordYii2-User Forgot Your PasswordYii2-User Forgot Your Password

Al igual que eso, tenemos un componente de autenticación de núcleo enormemente importante para nuestra aplicación.

Yii2-User también tiene una serie de características de configuración que puede explorar más por su cuenta, p. Autenticación social de terceros. Probablemente regresemos a ellos en un tutorial posterior.

¿Que sigue?

Espero que haya encontrado esto útil para su propia aplicación web Yii2. Si quieres saber cuándo llega el próximo tutorial de Yii2, sígueme @reifman en Twitter o visita mi página de instructor. Mi página de instructor incluirá todos los artículos de esta serie tan pronto como se publiquen.

Enlaces relacionados