Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

I profili dei clienti: definizione del modello e registrazione

Scopriamo come aggiungere la profilazione dei clienti ad un e-commerce basato sul framework PHP Laravel: creazione del modello e registrazione sul sito Web
Scopriamo come aggiungere la profilazione dei clienti ad un e-commerce basato sul framework PHP Laravel: creazione del modello e registrazione sul sito Web
Link copiato negli appunti

In questo capitolo vedremo come aggiungere la profilazione dei clienti al nostro e-commerce. Creiamo quindi la tabella customers definendo dal terminale il file di migrazione e il modello associato.

php artisan make:model Customer --migration

Definizione del modello Customer

Il profilo del cliente dovrà avere il nome, il cognome, l'e-mail, la password e un flag che indicherà se l'utente ha confermato il suo account. Modifichiamo allora il file della migrazione come segue.

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateCustomersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('customers', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('firstname', 255);
            $table->string('lastname', 255);
            $table->string('email', 255);
            $table->string('password', 255);
            $table->tinyInteger('verified', false, true);
            $table->timestamps();
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('customers');
    }
}

Lanciamo la migrazione:

php artisan migrate

Ora possiamo definire il modello Customer di riferimento.

namespace App;
use Illuminate\Database\Eloquent\Model;
class Customer extends Model
{
    protected $table = 'customers';
    protected $primaryKey = 'id';
    public $incrementing = true;
    protected $fillable = ['firstname', 'lastname', 'email','password','verified'];
}

Abbiamo deciso di non usare il modello User predefinito di Laravel al fine di poter implementare da zero un meccanismo di autenticazione e verifica dell'account.

Come prima cosa dobbiamo modificare la durata di una sessione in Laravel cambiando il valore espresso in secondi della variabile di ambiente SESSION_LIFETIME presente nel file .env in questo modo:

SESSION_LIFETIME=43200

Il valore ora indica che il cookie di sessione avrà una durata complessiva di 30 giorni. Per applicare le modifiche, digitiamo dal terminale:

php artisan config:clear

Registrazione sul sito Web

Lo step successivo consiste nell'implementare la logica di registrazione sul sito con la verifica dell'indirizzo e-mail.

Per farlo dobbiamo attivare un gateway SMTP per l'invio delle e-mail. In questo caso useremo Mailtrap che ci fornisce già i parametri di configurazione da inserire nel file .env di Laravel.

MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=username
MAIL_PASSWORD=password
MAIL_ENCRYPTION=tls

Per applicare le modifiche, digitiamo dal terminale:

php artisan config:clear

Ora dobbiamo creare una classe di tipo Mailable che implementerà la logica dell'invio dell'e-mail con relativo template. Digitiamo dal terminale:

php artisan make:mail ConfirmationEmail

La classe dovrà accettare come unico parametro del costruttore l'URL completo per la verifica dell'indirizzo e-mail.

namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class ConfirmationEmail extends Mailable
{
    use Queueable, SerializesModels;
    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct( $url )
    {
        $this->confirmation_url = $url;
    }
    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return
            $this->from('phpecommerce@localhost')->
        subject('Confirm your e-mail address')->
        view('email.confirmation', [
            'confirmation_url' => $this->confirmation_url
        ]);
    }
}

Possiamo quindi creare il template Blade in resources/views/email:

<p>Dear customer,<br>
    click on the following link to confirm your e-mail address.</p>
<p><a href="{{ $confirmation_url }}">Confirm</a></p>

Poiché l'URL conterrà il token di verifica, dobbiamo creare la tabella dei token creando un nuovo modello e una nuova migrazione.

php artisan make:model Customer --migration

Definiamo il file di migrazione come segue:

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateVerificationTokensTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('verification_tokens', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->bigInteger('customer_id');
            $table->string('value', 255);
            $table->timestamps();
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('verification_tokens');
    }
}

Ciascun token è collegato al profilo cliente tramite il campo customer_id. Quindi definiamo il modello corrispondente:

namespace App;
use Illuminate\Database\Eloquent\Model;
class VerificationToken extends Model
{
    protected $table = 'verification_tokens';
    protected $primaryKey = 'id';
    public $incrementing = true;
    protected $fillable = ['customer_id', 'value'];
}

Lanciamo la migrazione:

php artisan migrate

Ora possiamo creare il metodo di registrazione nel nostro controller AJAX. Scegliamo AJAX per dare all'utente un feedback immediato.

namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Mail\ConfirmationEmail;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
use App\Customer;
use App\VerificationToken;
class AjaxController extends Controller
{
        public function registerCustomer(Request $request)
    {
        $messages = [
            'required' => 'Required field.',
            'email' => 'Invalid e-mail address.'
        ];
        $validator = Validator::make($request->all(), [
            'register_firstname' => 'required',
            'register_lastname' => 'required',
            'register_email' => 'required|email:rfc',
            'register_password' => 'required'
        ], $messages);
        if ($validator->fails()) {
            return response()->json($validator->messages());
        }
        $firstname = $request->get('register_firstname');
        $lastname = $request->get('register_lastname');
        $email = $request->get('register_email');
        $password = Hash::make($request->get('register_password'));
        $customer_data = compact('firstname', 'lastname', 'email', 'password');
        $customer = new Customer($customer_data);
        $customer->save();
        $confirmation_token = Str::random(60);
        $verification_token = new VerificationToken([
            'customer_id' => $customer->id,
            'value' => $confirmation_token
        ]);
        $verification_token->save();
        $confirmation_url = env('APP_URL') . '/confirm/' . $customer->id . '/' . $confirmation_token;
        Mail::to($email)->send(new ConfirmationEmail($confirmation_url));
        return response()->json(['success' => 'We sent you an e-mail with the instructions to activate your account.']);
    }
}

L'URL che viene inviato tramite e-mail se la validazione ha avuto successo è composto dall'ID del cliente e dal token di verifica. Ora il profilo utente viene salvato nel database ma non è ancora attivato. Affronteremo questo passaggio nella prossima lezione

Ti consigliamo anche