Maison  >  Article  >  cadre php  >  Le modèle fournit l'UUID au monde extérieur tout en conservant l'ID.

Le modèle fournit l'UUID au monde extérieur tout en conservant l'ID.

步履不停
步履不停original
2019-07-03 14:54:222350parcourir

Le modèle fournit l'UUID au monde extérieur tout en conservant l'ID.

Dans certaines applications, ne pas exposer l'ID peut empêcher d'autres de connaître facilement le nombre de modèles dans votre base de données.

Note du traducteur : masquer l'identifiant peut également empêcher efficacement les utilisateurs de parcourir de manière malveillante le contenu du site Web.

Hé, imaginez que dans mon application Podcast, je définis un identifiant par défaut. Dans le modèle Podcast de Laravel, c'est un entier qui est automatiquement incrémenté de un à chaque fois qu'une ligne est insérée. Par conséquent, l'identifiant de le 47ème podcast du tableau est le 47. J'ai ensuite déclaré sur mon site Web : "Cette application Podcast contient des millions de podcasts, alors ne la manquez pas ! ", ce qui a été facilement démystifié en voyant le dernier identifiant du podcast :

https://podcast.app/podcasts/47

Masquer l'ID sans avoir à tout reconnecter dans l'application et espérer ne pas être vu à travers ? OK, il existe un moyen.

Configurer la base de données

Certaines bases de données peuvent être configurées pour définir un UUID comme clé primaire lors de l'insertion de nouvelles lignes. Vous devez vérifier cela sur le SGBDR que vous utilisez, car chaque implémentation de SGBDR est différente.

Vous pouvez également demander à l'application de définir l'UUID par défaut lors de la création de nouveaux enregistrements d'événements Eloqument à l'aide de , mais cela vous obligera à utiliser Eloqument dans tous les cas. Si vous insérez un enregistrement directement dans la base de données, vous risquez d'obtenir une erreur - c'est l'une des raisons pour lesquelles je préfère définir l'UUID automatique dans la base de données plutôt que dans l'application, cela ne devrait dépendre de rien car il s'agit du comportement de la base de données.

En résumé, vous devez configurer votre base de données avec Laravel comme ceci :

<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreatePodcastTable extends Migration
{
    /**
     * 运行数据库迁移
     *
     * @return void
     */
    public function up()
    {
        Schema::create(&#39;podcast&#39;, function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->uuid('uuid')->index();
            $table->string('filename');
            $table->string('path');
            $table->string('service');
            $table->string('format', 4);
            $table->unsginedTinyInteger('quality', 4);

            $table->timestamps();
            $table->timestamps();
            $table->softDeletes();
        });
    }
    /**
     * 回滚数据库迁移
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('podcast');
    }
}

Comme vous pouvez le voir, nous avons ajouté $table->uuid('uuid')->index() . Ce code indique à Laravel d'utiliser la colonne UUID (ou d'utiliser une colonne de chaîne si elle est prise en charge) et de créer un index sur cette colonne afin que les lignes puissent être rapidement récupérées par UUID, tout comme quelqu'un le ferait s'il visitait cette URL :

https://podcast.app/podcast/535c4cdf-70a0-4615-82f2-443e95c86aec

On pourrait affirmer qu'un autre index entraverait les opérations d'insertion, mais c'est un compromis.

Maintenant, le problème vient du contrôleur et du modèle.

Connectez le modèle à l'UUID

Vous n'avez rien à faire dans le modèle sauf deux choses : masquer l'ID de la sérialisation et autoriser le modèle à utiliser l'UUID pour le "routage d'URL " .

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Podcast extends Model
{
    /**
     * 数组中隐藏的属性
     *
     * @var array
     */
    protected $hidden = [
        &#39;id&#39;
    ];

    /**
     * 获取模型的路由键
     *
     * @return string
     */
    public function getRouteKeyName()
    {
        return &#39;uuid&#39;;
    }

    // ……其余的模型代码
}

Pour masquer l'ID, nous pouvons ajouter la colonne id au tableau des propriétés cachées. Lorsque le modèle est sérialisé, par exemple converti en tableau ou en chaîne JSON, l'ID ne sera pas affiché. Bien entendu, vous pouvez également accéder à l'ID de la propriété obtenue, tout comme une propriété ou une clé de tableau.

L'étape suivante consiste à dire à Laravel que lorsque l'URL contient l'UUID du modèle, récupérez le modèle via la colonne uuid. Cela permettra de rechercher le modèle en mettant en place un itinéraire tel que :

Route::get({podcast}, &#39;PodcastController@show&#39;);

puis de l'utiliser au sein de notre PodcastController classe.

/**
 * 通过 UUID 显示播客
 *
 * @param  \App\Podcast $podcast
 * @return \Illuminate\Http\Response
/* 
public function show(Podcast $podcast)
{
    return response()->view('response', [
        'podcast' => $podcast
    ]);
}

Vous pouvez également utiliser la méthode solveRouteBinding() dans le modèle si vous pouvez définir par programme comment récupérer le modèle par une valeur donnée. Vous pouvez même autoriser les administrateurs authentifiés à récupérer des enregistrements en fonction de leur ID ou UUID.

Ça y est, il n’y a plus rien à faire. Cette technologie permet également de définir l'UUID après la génération de l'application.

Pour plus d'articles techniques liés à Laravel, veuillez visiter la colonne Tutoriel Laravel pour apprendre !

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn