Comment utiliser les énumérations dans Laravel ? L'article suivant vous présentera comment utiliser les énumérations dans Laravel. J'espère qu'il vous sera utile !
Je suis un grand fan des énumérations. Dernièrement, j'ai travaillé dans une entreprise utilisant C# où les énumérations sont largement utilisées, et j'ai l'habitude de pouvoir les trouver quand je ne les trouve pas, et ils me manquent.
Je les utilise pour tout ce qui a un ensemble limité d'options possibles, comme le jour de la semaine, le statut d'une commande ou, comme dans l'exemple ci-dessous, le type d'utilisateur.
L'utilisation des énumérations présente plusieurs avantages :
- Réduit les erreurs causées par la transposition ou la faute de frappe des nombres.
- Facilite la modification des valeurs à l'avenir.
- Rend le code plus facile à lire, ce qui signifie qu'il y a moins de risques que des bugs s'y infiltrent.
- Assurer la compatibilité ascendante Lorsque vous utilisez des énumérations, vous pouvez réduire considérablement le risque d'échec de votre code si quelqu'un modifie la valeur correspondant au nom du membre à l'avenir.
PHP lui-même ne prend pas en charge les énumérations, mais il est assez facile d'obtenir des effets équivalents en utilisant des constantes dans les classes. De plus, j'ai créé un package Laravel appelé laravel-enum. Il vous permet d'accéder à des fonctions d'assistance telles que la liste des clés et des valeurs, l'ajout de descriptions aux valeurs et la validation des requêtes qui attendent des valeurs d'énumération.
Ce guide décrit le processus d'installation d'un package Laravel, y compris des exemples d'utilisation et de bonnes pratiques.
Vous pouvez installer le package en exécutant la commande suivante dans le terminal via composer :
$ composer require bensampo/laravel-enum
Si vous utilisez une version de Laravel inférieure à 5.5, vous devez ajouter le fournisseur de services à config /app .php
.config/app.php
.
'BenSampo\Enum\EnumServiceProvider'
我们将为用户类型创建一个枚举在我们的示例应用程序中,用户可以属于以下三种用户类型之一:管理员、付费成员、成员。
包中包含用于创建枚举的生成器,因此可以运行以下命令来创建名为UserType的枚举该文件将在“app/Enums/UserType.php”中创建
php artisan make:enum UserType
你将在这个文件中看到一定数量的脚手架。在文件顶部附近,可能的选项列表被定义为常量。这些常量值存储在数据库中,因此我发现最好是使用整数,但是并没有限制一定要使用整数,只要每一个值都是唯一就可以了了。
本例中的选项看起来是这样的:
const Administrator = 0; const PaidMember = 1; const Member = 2;
现在我们有了一个带有一些可能性的枚举,并且可以开始使用它。在迁移 user 表时, 可以添加以下内容。
$table->tinyInteger('type')->unsigned()->default(UserType::Member);
因为 null 不是枚举的选项,我们需要为它设置默认值。在这个例子中,有必要去假设默认情况下的用户将成为标准成员。
确保文件的顶部包含此枚举的 use 语句。
use App\Enums\UserType;
由于我们现在的用户模型具有类型的属性,我们可以对它进行访问,并和 enum 值进行比较。这就是枚举真正的好处,也是我为什么如此喜欢他们。看一下下面的用法示例和可能替代的方法。
if ($user->type === UserType::PaidMember) { // 在这里只是做一些付费会员的事情. }
如果我们不使用枚举,可能会有类似以下的代码:
if ($user->type === 1) { // 这个1表示什么?? // ... } if ($user->type === 'PaidMember') { // 这他妈咋么又是字符串 ? // ... }
使用枚举的第一个例子是最容易读懂并且也是最不容易出错的例子。如果我偶然输入了 UserType::Paidember
(注意拼写错误),我会得到一个很好的错误提示,告诉我代码错误了(类中不存在这个常量值),而不是像前两个示例那样默默的失败。(只是判断不符合条件,你还需要根据当前的条件语句去具体的查看相关代码?)
在应用的某些界面,我们可能希望向用户显示他们所属的用户类型。如果只是简单的输出从数据库所获取的整型值,显然达不到我们想要的结果。相反,可使用每个枚举类所继承基类的 getDescription
方法。
在 blade 模板上的操作如下:
<p>{{ \App\Enums\UserType::getDescription($user->type) }}</p>
输出结果Administrator
(管理员),PaidMember
(付费会员) 、Member
(会员)中的一个。
有时候关键词名称是复合词(就像 PaidMember
),我们想要展示和键名不同的东西。我们可以像下面这样覆盖掉当前枚举的描述。 在 app/Enums/UserType.php
:
public static function getDescription(int $value): string { switch ($value) { case self::PaidMember: return 'Paid member'; break; default: return self::getKey($value); } }
现在当我们调用 getDescription
我们将获取到 Administrator
, Paid member
or Member
public function store(Request $request) { $this->validate($request, [ 'type' => ['required', new EnumValue(UserType::class)], ]); // 保存用户等等... }
use App\Enums\UserType; use BenSampo\Enum\Rules\EnumValue;
UserType::Paidember
(notez la faute d'orthographe), je reçois un joli message d'erreur me disant que le code est erroné (cette valeur constante n'existe pas dans la classe), au lieu de quelque chose comme Les deux premiers exemples échouent silencieusement. (Juste pour juger que les conditions ne sont pas remplies, vous devez quand même vérifier le code pertinent spécifiquement en fonction de l'instruction conditionnelle actuelle ?)🎜🎜🎜Afficher l'énumération🎜🎜🎜Dans certaines interfaces de l'application, nous pouvons souhaiter afficher aux utilisateurs le type d'utilisateur auquel ils appartiennent. Si nous produisons simplement la valeur entière obtenue à partir de la base de données, nous ne pouvons évidemment pas obtenir les résultats souhaités. Utilisez plutôt la méthode getDescription
de la classe de base dont hérite chaque classe d'énumération. 🎜🎜Les opérations sur le modèle de lame sont les suivantes : 🎜rrreee🎜Les résultats de sortie sont Administrateur
(administrateur), PaidMember
(membre payant), Membre code>(membre). 🎜🎜Parfois, le nom du mot-clé est un mot composé (comme <code>PaidMember
), et nous souhaitons afficher quelque chose de différent du nom de la clé. Nous pouvons écraser la description actuelle de l’énumération comme suit. Dans app/Enums/UserType.php
:🎜rrreee🎜Maintenant, lorsque nous appellerons getDescription
, nous obtiendrons Administrateur
, Membre payant
code> ou Membre
.🎜🎜🎜Méthode de vérification🎜🎜🎜Lors de la modification des valeurs d'énumération via la saisie de l'utilisateur, il est préférable de s'assurer que nous n'acceptons que des valeurs valides. Nous pouvons utiliser les règles de validation du package. 🎜当以表格展示枚举的时候,我经常把他们显示为 HTML select 元素。这样虽仍然可以被恶意修改,但是避免了将错误的值传递给服务器的情况。
继续我们的用户使用示例,让我们在用户控制器中处理修改的值:
public function store(Request $request) { $this->validate($request, [ 'type' => ['required', new EnumValue(UserType::class)], ]); // 保存用户等等... }
记住要同时包含枚举的 use 语句和 EnumValue
的规则。
use App\Enums\UserType; use BenSampo\Enum\Rules\EnumValue;
当然这并不是枚举所能完成的全部范围。但是它覆盖了90%的用例。
值得一看的列表 枚举类上的方法的完整列表 以查看您还能实现什么。
【相关推荐: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!