Maison  >  Article  >  cadre php  >  Tutoriel sur l'utilisation gracieuse de l'UUID dans Laravel 7

Tutoriel sur l'utilisation gracieuse de l'UUID dans Laravel 7

Guanhui
Guanhuiavant
2020-05-25 11:29:134021parcourir

Tutoriel sur l'utilisation gracieuse de l'UUID dans Laravel 7

Récemment, j'ai dû implémenter des identifiants uniques universels (UUID) dans Laravel 7 et j'ai rencontré quelques problèmes. J'espère que cet article aidera d'autres personnes qui font la même chose.

Raisons avancées d'utiliser les UUID

A) Ils suppriment l'identifiant numéroté de votre localisateur de ressources uniforme, afin que les utilisateurs ne puissent pas voir combien d'objets spécifiques votre application a créé. Par exemple :

https://myapp.com/api/users/5

contre :

https://myapp.com/api/users/0892b118-856e-4a15-af0c-66a3a4a28eed

B) Ils rendent les numéros d'identification beaucoup plus difficiles à deviner. C'est bon pour la sécurité, mais nous devrions probablement mettre en œuvre d'autres techniques pour nous en prémunir.

Implémentation des UUID comme clés primaires

Comment modifier la migration de la base de données

Tout d'abord, dans la base de données migration , vous souhaitez remplacer les champs d'ID à incrémentation automatique actuels par des UUID. Vous pouvez également suivre cette approche : conserver l'ID d'auto-incrémentation et utiliser l'UUID comme champ supplémentaire dans le tableau à utiliser lorsque l'URL est présentée à l'utilisateur (dans ce cas, vous cachez l'ID dans le modèle), mais c'est pas ce que nous pouvons faire ici. Voyons à quoi ressemble une table d'employés hypothétique.

public function up()
    {
        Schema::create('employees', function (Blueprint $table) {
            $table->uuid('id')->primary;
            $table->string('name');
            $table->string('email')->unique();
            $table->string('work_location')->nullable();
            $table->timestamps();
        });
    }

Ici, notez que nous avons remplacé normal id() par uuid() et en avons fait la clé primaire.

Faisons de cela un trait

Ensuite, nous pouvons implémenter un hook de cycle de vie Laravel pour garantir que lorsqu'une nouvelle instance de ce modèle est créée, un UUID lui est attribué. Nous pouvons écrire le code directement dans le modèle, mais si vous envisagez d'utiliser des UUID dans plusieurs modèles, je vous recommande d'utiliser Traits (j'ai appris cela dans cet article Dev, merci beaucoup à Dev). Les traits vous permettent essentiellement de créer des fonctionnalités et de les appeler via le mot-clé use pour les utiliser dans plusieurs modèles.

Pour créer un nouveau trait, créez un dossier AppHttpTraits (ce n'est qu'un de mes passe-temps, vous pouvez le mettre ailleurs) et créez un nouveau fichier pour le trait. Nous appellerons le fichier UsesUuid.php.

Voici le code spécifique du trait :

<?php
namespace App\Http\Traits;
use Illuminate\Support\Str;
trait UsesUuid
{
  protected static function bootUsesUuid() {
    static::creating(function ($model) {
      if (! $model->getKey()) {
        $model->{$model->getKeyName()} = (string) Str::uuid();
      }
    });
  }
  public function getIncrementing()
  {
      return false;
  }
  public function getKeyType()
  {
      return &#39;string&#39;;
  }
}

Utilisez IlluminateSupportStr pour générer facilement l'UUID. La méthode getIncrementing() indique à Laravel que la clé primaire du modèle ne s'incrémentera pas (car nous l'avons définie sur false), et la méthode getKeyType() indique à Laravel que la clé primaire du modèle est un type chaîne. La méthode bootUsesUuid() nous permet d'utiliser les puissants hooks de cycle de vie de Laravel. Vous pouvez venir ici pour plus de détails sur le festival d'Ouyang. Fondamentalement, notre code indique déjà à Laravel que lorsqu'une nouvelle instance de ce modèle est créée, définissez la clé primaire UUID pour celle-ci !

Nous pouvons désormais facilement implémenter cette fonctionnalité sur notre modèle en utilisant le mot-clé use.

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
...
class Employee extends Model
{
    ...
    use \App\Http\Traits\UsesUuid;
    ...
}

Référencer un UUID comme clé étrangère

Pour référencer un UUID sur une table comme clé étrangère, changez simplement le type du champ de clé étrangère sur la table . Comme suit...

 Schema::create(&#39;another_table&#39;, function(Blueprint $table) {
        $table->id();
        $table->unsignedBigInteger(&#39;employee_id&#39;);
        $table->string(&#39;some_field&#39;);
        $table->foreign(&#39;employee_id&#39;)
            ->references(&#39;id&#39;)
            ->on(&#39;shifts&#39;)
            ->onDelete(&#39;cascade&#39;);
    });

... Nous avons créé un type de données grand entier non signé lors du référencement de la clé étrangère Employee_id, et l'avons modifié comme suit :

 Schema::create(&#39;another_table&#39;, function(Blueprint $table) {
        $table->id();
        $table->uuid(&#39;employee_id&#39;);
        $table->string(&#39;some_field&#39;);
        $table->foreign(&#39;employee_id&#39;)
            ->references(&#39;id&#39;)
            ->on(&#39;shifts&#39;)
            ->onDelete(&#39;cascade&#39;);
    });

C'est aussi simple que cela ! Encore une chose...

UUID et relations polymorphes

Vous pouvez vous retrouver à faire référence à une relation polymorphe soit par vos propres actions, soit par le biais d'un package dont vous importez le modèle. Dans la migration, le tableau pourrait ressembler à ceci :

    public function up()
    {
        Schema::create(&#39;some_package_table&#39;, function (Blueprint $table) 
        {
            $table->bigIncrements(&#39;id&#39;);
            $table->morphs(&#39;model&#39;);
            ...
        }
    }

Ici, la méthode morphs() créera deux champs dans la base de données, model_id de type grand entier non signé et model_type de type chaîne. Le problème est que notre modèle utilise désormais les UUID au lieu d'incrémenter les ID entiers, cela vous donnera donc une erreur et dira quelque chose comme : :

Data truncated for column &#39;model_id&#39; at row 1

Nous avons maintenant besoin du champ model_id pour prendre en charge notre nouvel UUID, son type est CHAR (36). Ne vous inquiétez pas! Laravel rend cela très simple et vous n'avez pas besoin de le faire manuellement. Changez simplement vos migrations en :

    public function up()
    {
        Schema::create(&#39;some_package_table&#39;, function (Blueprint $table) 
        {
            $table->bigIncrements(&#39;id&#39;);
            $table->uuidMorphs(&#39;model&#39;);
            ...
        }
    }

Une autre raison d'aimer Laravel ! Bon codage !

Tutoriel recommandé : "Tutoriel Laravel"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer