zvermafia/larastate

一种方便地访问实体状态值及其本地化的方法。

v0.1.3 2020-10-01 13:21 UTC

This package is auto-updated.

Last update: 2024-08-29 05:43:14 UTC


README

Latest Version on Packagist Software License Build Status Coverage Status Quality Score Total Downloads

轻松访问实体状态值及其本地化。

按章节导航

简介

问题

当你有一个具有某些状态实体时,通常需要访问这些状态值及其本地化。让我们考虑以下情况

假设我们有一个具有角色状态的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后缀结尾,例如UserStatePageStateOrderState等等...
  • 常量名称应为大写,每个单词由下划线分隔。

假设我们想要为帖子实体设置一个状态类,那么我们的步骤如下

  1. 在app目录中创建一个States文件夹;
  2. 在app/States目录中创建一个PostState.php文件;
  3. 扩展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,
        ];
    }
  4. 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()实现。

  1. 获取状态值
  2. 获取带有地区的状态值
  3. 获取状态值中的一个地区

所有方法都以前缀get开头,并以一个案例名称结尾(ValuesValuesWithLocalesLocale)。在这些前缀和后缀之间,您应该以StudlyCase格式编写您的状态名称。

对于type状态,这些将是:

  1. getTypeValues()
  2. getTypeValuesWithLocales()
  3. 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'

替代方案

那么,为什么我要创建这个包,当已经有这样的包时?因为它们对我来说的简单任务来说有点复杂。

变更日志

有关最近更改的更多信息,请参阅变更日志

测试

$ composer test

贡献

有关详细信息,请参阅贡献指南行为准则

安全

如果您发现任何与安全相关的问题,请通过电子邮件mohirjon@gmail.com联系,而不是使用问题跟踪器。

致谢

许可

MIT许可(MIT)。有关更多信息,请参阅许可文件