Illuminate Validator在独立的非Laravel应用程序中


Illuminate Validator in stand-alone non-Laravel application

我正在使用Slim和带有Eloquent模型等的Illuminate数据库包构建API。我已经使用Capsule实例化了数据库处理程序,如README所示。然而,现在我想在不安装完整的Laravel套件的情况下在我的模型上使用验证功能,但我无法完全理解这个库的设计。

我该怎么做?为Laravel提供的文档似乎非常期待您开箱即用Laravel。

以下是当前版本的解决方案:Laravel 5.4。composer.json文件:

{ "name": "Validation standalone", "require": { "php": ">=5.6.4", "illuminate/validation": "5.4.*", "illuminate/translation": "5.4.*" } }

注意,我们还必须要求"照明/翻译":"5.4.*"。然后在您的php文件中:

use Illuminate'Validation;
use Illuminate'Filesystem;
use Illuminate'Translation;
include 'vendor/autoload.php';
$filesystem = new Filesystem'Filesystem();
$fileLoader = new Translation'FileLoader($filesystem, '');
$translator = new Translation'Translator($fileLoader, 'en_US');
$factory = new Validation'Factory($translator);
$messages = [
    'required' => 'The :attribute field is required.',
];
$dataToValidate = ['title' => 'Some title'];
$rules = [
    'title' => 'required',
    'body' => 'required'
];
$validator = $factory->make($dataToValidate, $rules, $messages);
if($validator->fails()){
    $errors = $validator->errors();
    foreach($errors->all() as $message){
        var_dump($message);
    }
}

在这里,我故意忽略了为验证提供的数据中的"body"字段,因此显示了验证错误。

截至2021年初,@vivanov的解决方案与Laravel 8包完美配合。

在这里,我添加了使用默认Laravel验证消息的功能,因为使用自己的验证消息太烦人了。

以下是您在@vinvanov解决方案中必须更改的内容。

  1. 更新composer.json
    "require": {
        "illuminate/validation": "^8.25",
        "illuminate/translation": "^8.25"
    },
  1. 将Laravel验证消息文件复制到您的project/laravel/en/validation文件夹中。

  2. 修改@ivanov的解决方案代码如下(仅反映更改)

$translationDir = dirname(__DIR__, 4) . '/project/laravel/en/validation';
$fileLoader = new Translation'FileLoader($filesystem, $translationDir);
$fileLoader->addNamespace('lang', $translationDir);
$fileLoader->load('en', 'validation', 'lang');
$validator = $factory->make($dataToValidate, $rules);

请参阅我的要点中包含更多注释的完整代码;

就是这样。你有默认的Laravel消息为你工作。

这是Laravel验证文档。

附言:Jeff的这篇博文也得到了赞扬。

PPS:这太棒了,尽管版本从5.6跳到了8.25,但软件包界面稳定且无缝工作。如此成熟和富有洞察力的开源态度和对开发人员的极大关心来自Taylor Otwell。只有当你在一个糟糕的PHP代码库中的现代PHP框架之外工作时,你才能体会到这一点的最大便利。

我不想建议这样做,但Laravel验证器可能不是你想要的。我建议查看Symfony或Zend Framework(2+)中的验证器类。它们作为独立的验证器工作得很好,事实上,我目前正在Laravel项目中使用ZF2表单类和验证器,因为Laravel表单和验证器类还没有达到标准。

这可能不是你想听到的答案,但从长远来看,这可能会给你带来一些痛苦。

我也在想同样的事情,一年后我发现delatbel的答案非常缺乏。我确实找到了下面的Gist,其中spekkionu有一个相当简单的设置来让你开始。(它在我的机器上工作??;P)它展示了如何为工厂等制作翻译器。当你用composer导入illuminate/validation时,它都包括在内。

希望有帮助:https://gist.github.com/spekkionu/e9103993138e666f9f63

最佳,

不幸的是,如果您计划使用Laravel的自定义验证规则,以前的解决方案都不会起作用。

你可以在我的要点中查看我的解决方案。

非常感谢@vivanov和@Valentine shi。

自定义规则正在调用全局trans()函数。这就是它在helpers.php中并通过Composer注册的原因
这个trans()函数也用于创建验证器工厂。

  1. 为全局函数添加自定义帮助程序php文件
//<project-path>/src/helpers.php
<?php
use Illuminate'Filesystem'Filesystem;
use Illuminate'Translation'FileLoader;
use Illuminate'Translation'Translator;
if (!function_exists('trans')) {
    function trans(string $key = null, array $replace = [], string $locale = null): Translator|array|string|null
    {
        $translationDir = dirname(__DIR__).'/lang';
        $fileLoader = new FileLoader(new Filesystem(), $translationDir);
        $fileLoader->addNamespace('lang', $translationDir);
        $fileLoader->load('en', 'validation', 'lang');
        $translator = new Translator($fileLoader, 'en');
        $translator->setLocale('en');
        $translator->setFallback('en');
        if (is_null($key)) {
            return $translator;
        }
        return $translator->get($key, $replace, $locale);
    }
}
  1. 在composer.json中注册
//<project-path>/composer.json
{
    "require": {
        "php": "^8.1",
        "illuminate/translation": "^10.9",
        "illuminate/validation": "^10.9",
    },
    "autoload": {
        "files": [
            "src/helpers.php"
        ]
    }
}
  1. 添加区域设置文件
//<project-path>/lang/en/validation.php
<?php
return [
    'accepted' => 'The :attribute must be accepted.',
    // ... rest of the validations
    // Copy it from Laravel. 
];
  1. 创建验证工厂并使用它
//<project-path>/scr/Validation/Validator.php
<?php
namespace <insert-your-namespace-here>;
use Illuminate'Validation'Factory;
class Validator
{
    protected Factory $validator;
    public function __construct()
    {
        $this->validator = new Factory(trans());
    }
}

我很确定你可以玩所需的版本。