okaybueno/validation

Laravel应用的验证服务。

v2.0.0 2019-02-27 17:40 UTC

README

此包已停止维护,不会收到任何其他更新。如果您正在使用它,请考虑迁移到另一个解决方案 - 或者将其分叉并依赖于您自己的版本。

ValidationService

为Laravel 5.x提供验证服务的包。

Latest Version on Packagist Software License Quality Score Total Downloads

目标

关于在哪里执行数据验证有很多讨论:存储库?控制器?网关?服务?模型?每个都有其优点和缺点……我们个人发现将这种逻辑提取到可以注入到同一层或更高层的其他服务中的服务很有用。

因此,此包的目标是提供一个简单的验证服务,可以注入到其他服务中,尽管它默认使用Laravel验证类,但可以扩展以使用其他验证库。这是解决此问题的一种高度有偏见的解决方案。

安装

  1. 通过将其添加到您的 composer.json 或在项目文件夹中运行 composer require okaybueno/validation-service 来安装此包。
  2. 通过运行 php artisan vendor:publish --provider="OkayBueno\Validation\ValidationServiceProvider" 发布配置文件。
  3. 根据您的需求配置 config/validators.php 文件,指定验证器的基命名空间和目录。
  4. 准备好了!不需要任何服务提供者或其他东西 :)。

用法

您只需要创建一个包含不同验证方法的Validation接口,然后在新建的 ´src´ 目录中创建一个验证类,该类扩展主验证类(LaravelValidator)并实现前面的接口。听起来很奇怪,对吧?让我们用一个例子来看看……

示例

我个人喜欢将Laravel代码与app代码分开,所以通常在app文件夹中创建一个包含所有业务逻辑的文件夹,这些业务逻辑与框架紧密耦合:app/MyWebApp。在那个文件夹中,我喜欢根据这些文件的角色将它们分开到不同的文件夹中:模型?存储库?辅助工具?服务?验证器?等等……

再次强调——这完全是个人的品味——我喜欢将服务分成不同的责任区域:用户、认证、邮件等。因此,我喜欢将验证器分成不同的文件夹,这些文件夹包含不同的接口,以及包含实现的 src 文件夹。所以我的项目结构大多数时候看起来是这样的

+-- app
|   +-- MyApp
|       +-- Models
|       +-- Helpers
|       +-- Repositories
|       .
|       .
|       +-- Validation
|           +-- Auth
|           +-- Mailing
|           +-- Users
|               +-- UserValidatorInterface.php
|               +-- src
                    +-- UsersValidator.php

让我们看看我是如何实现UserValidatorInterface和UserValidator类的

<?php

namespace MyApp\Validators\Users;

interface UserValidatorInterface
{
    const EXISTS_BY_ID = 'existsById';
    const EXISTS_BY_EMAIL = 'existsByEmail';
    
    public function existsById();
    public function existsByEmail();
}
<?php

namespace MyApp\Validators\Users\src;

use OkayBueno\Validation\src\LaravelValidator;

class UserValidator extends LaravelValidator implements UserValidatorInterface
{   

    public function existsById()
    {
        return [
            'id'    => 'required|exists:users,id'
        ];
    }
    
    public function existsByEmail()
    {
        return [
            'email'    => 'required|exists:users,email'
        ];
    }
}

Voilà!包会做剩下的工作。现在您可以在应用程序的任何部分注入验证服务。我喜欢只在其他服务中使用它,如下所示……

<?php

namespace MyApp\Services\Frontend\Users\src;

use MyApp\Validators\Users\UsersValidatorInterface;

class UsersService implements UsersServicesInterface 
{

    protected $usersValidator;

    public function __construct(
        UsersValidatorInterface $usersValidatorInterface
    )
    {
        $this->usersValidator = $usersValidatorInterface;
    }
   
    
    public function findUserById( $userId )
    {
        $data = [
            'id' => $userId
        ]
        
        if ( $this->usersValidator->with( $data )->passes( UsersValidatorInterface::EXISTS_BY_ID ) )
        {
            // It passes the validation, so do whatever.. fetch user in $user and return it (for example).
            
            .
            .
            
            return $user;
        }
        
        // if we are at this point then the validation failed and this will return an array with the errors.
        return $this->usersValidator->errors();
    }
    
}

就是这样!记住:重要的是接口位于配置文件中指定的文件夹中,该接口的实现位于 src 文件夹下。

变更日志

v2.0.0
  • 新版本(破坏性)。现在验证器不再绑定到服务,而是存在于自己的文件夹中,并且在安装包时自动绑定。
v1.0.0
  • 第一个公开正式版本发布。

致谢

错误和贡献

  • 发现了一个bug?这是好事(也是坏事)。请使用Github上的问题报告功能告诉我。
  • 需要新功能或有一些有趣的贡献?太好了!请发起一个pull request。

许可证

MIT许可证(MIT)。请参阅许可证文件获取更多信息。