zvermafia / larastate
一种方便地访问实体状态值及其本地化的方法。
Requires
- php: ~7.2
- illuminate/support: ^6.0 || ^7.0 || ^8.0
Requires (Dev)
- phpunit/phpunit: >=8.0
- squizlabs/php_codesniffer: ^3.5
This package is auto-updated.
Last update: 2024-08-29 05:43:14 UTC
README
轻松访问实体状态值及其本地化。
按章节导航
简介
问题
当你有一个具有某些状态实体时,通常需要访问这些状态值及其本地化。让我们考虑以下情况
假设我们有一个具有角色状态的User实体。角色状态只能接受'member'、'moderator'和'administrator'值。
-
当你需要验证状态的可接受值时。因此,当我们尝试创建一个新用户时,我们需要验证角色状态值。但如果我们没有这些值的主要来源怎么办?我们通常可能这样做
/** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ // ... other validation rules 'role' => [ 'required', Rule::in(['member', 'moderator', 'administrator']), // 🙁 values are hardcoded ], ]; }
-
当你需要显示某个状态值的本地化时。例如,当你需要提供有关用户角色的信息时
<li>{{ $user->name }}</li> <li>{{ $user->email }}</li> <li>{{ trans("user.states.role.{$user->role}") }}</li>
🙁 本地化文件路径、文件名和区域键是硬编码的。
-
当你需要用区域显示这些值时。例如,在一个选择框中
@foreach (['member', 'moderator', 'administrator'] as $value) <option value="{{ $value }}">@lang("user.states.role.{$value}")</option> @endforeach
🙁 硬编码,硬编码,...
是的,当你将这些值硬编码到项目的不同地方时,更难更改(添加、删除、重命名)这些值。因为你没有使用这些值的主要来源。
解决方案
不幸的是,Laravel没有提供开箱即用的解决方案来解决这个问题。所以我创建了这个包。使用这个包,你将不会在上述部分遇到问题!让我们按正确的顺序解决这些问题。
首先,在app目录中创建一个States
文件夹,然后在该文件夹中创建一个UserState
类,它扩展了StateAbstract
抽象类。并在类中定义一个ROLE
常量,包含上述部分的值。你应该有如下内容
<?php // app/States/UserState.php namespace App\States\UserState; use Zvermafia\Larastate\Abstracts\StateAbstract; class UserState extends StateAbstract { /** @var array */ public const ROLE = [ 'member' => 'member', 'moderator' => 'moderator', 'administrator' => 'administrator', ]; }
-
当你需要验证状态的可接受值时
/** * Get the validation rules that apply to the request. * * @param \App\States\UserState $user_states * @return array */ public function rules(UserState $user_states) { return [ // ... other validation rules 'role' => [ 'required', Rule::in($user_states->getRoleValues()), // 🙂 values are not hardcoded! ], ]; }
-
当你需要显示某个状态值的本地化时。例如,当你需要提供有关用户角色的信息时
<li>{{ $user->name }}</li> <li>{{ $user->email }}</li> <li>{{ $user_states->getRoleLocale($user->role) }}</li>
🙂 从单一来源获取本地化文件路径、文件名和区域键!
-
当你需要用区域显示这些值时。例如,在一个选择框中
@foreach ($user_states->getRoleValuesWithLocales() as $value => $locale) <option value="{{ $value }}">{{ $locale }}</option> @endforeach
🙂 太好了!
安装
要安装此包,只需通过composer拉取即可,然后即可开始配置。
$ composer require zvermafia/larastate
配置
该包有一些关于结构状态类目录、命名这些类和命名常量的约定。但所有这些都可以通过扩展StateAbstract
抽象类来根据您的需求进行更改。所以如果您需要的话,请查看源代码。
- 默认情况下,您应将所有状态类放在
app/States
目录中。是的,通常没有该目录,因此您需要自己创建它。 - 您的状态类名称应以
State
后缀结尾,例如UserState
、PageState
、OrderState
等等... - 常量名称应为大写,每个单词由下划线分隔。
假设我们想要为帖子实体设置一个状态类,那么我们的步骤如下
- 在app目录中创建一个
States
文件夹; - 在app/States目录中创建一个
PostState.php
文件; - 扩展
StateAbstract
抽象类并定义常量,你应该有如下内容<?php namespace App\States; use Zvermafia\Larastate\Abstracts\StateAbstract; class PostState extends StateAbstract { /** @var array */ public const STATUS = [ 'draft' => 0, 'published' => 1, ]; /** @var array */ public const TYPE = [ 'info' => 0, 'blog' => 1, 'news' => 2, ]; }
- 在
resources/lang/en/entities
目录中创建本地化文件,文件名为实体名称,在我们的例子中将是post.php
。这是一个普通的Laravel本地化文件,但默认情况下,所有状态本地化应分组在数组的state
键中。因此,您应该有类似以下内容:<?php // resources/lang/en/entities/post.php return [ // here's other localization like attribute/property... 'state' => [ 'status' => [ App\States\PostState::STATUS['draft'] => 'Draft', App\States\PostState::STATUS['published'] => 'Published', ], 'type' => [ App\States\PostState::TYPE['info'] => 'Static page', App\States\PostState::TYPE['blog'] => 'Blog post', App\States\PostState::TYPE['news'] => 'News post', ], ], ];
用法
为了使用示例,我们将使用我们在上一节中创建的PostState
。
这里有三种情况,所有这些情况都通过PHP的魔术方法__call()
实现。
- 获取状态值
- 获取带有地区的状态值
- 获取状态值中的一个地区
所有方法都以前缀get
开头,并以一个案例名称结尾(Values
、ValuesWithLocales
或Locale
)。在这些前缀和后缀之间,您应该以StudlyCase
格式编写您的状态名称。
对于type
状态,这些将是:
getTypeValues()
getTypeValuesWithLocales()
getTypeLocale(1)
$post_states = new App\States\PostState(); $post_states->getTypeValues(); // [0, 1, 2] $post_states->getTypeValuesWithLocales(); // [0 => 'Static page', 1 => 'Blog post', 2 => 'News post'] $post_states->getTypeValues(); // 'Blog post'
替代方案
- BenSampo/laravel-enum
- artkonekt/enum-eloquent
- nasyrov/laravel-enums
- mad-web/laravel-enum
- spatie/laravel-enum
- cerbero90/laravel-enum
那么,为什么我要创建这个包,当已经有这样的包时?因为它们对我来说的简单任务来说有点复杂。
变更日志
有关最近更改的更多信息,请参阅变更日志。
测试
$ composer test
贡献
安全
如果您发现任何与安全相关的问题,请通过电子邮件mohirjon@gmail.com联系,而不是使用问题跟踪器。
致谢
许可
MIT许可(MIT)。有关更多信息,请参阅许可文件。