php 在独立的非Laravel应用程序中照亮Validator

iyr7buue  于 2023-05-05  发布在  PHP
关注(0)|答案(5)|浏览(173)

我正在使用Slim和Illuminate Database包以及Eloquent模型等构建一个API。我已经使用Capsule示例化了数据库处理程序,如README所示。然而,现在我想在不安装完整的Laravel套件的情况下在我的模型上使用验证功能,但我无法完全理解这个库的设计。
我该怎么做?看起来为Laravel提供的文档非常希望您开箱即用。

z0qdvdin

z0qdvdin1#

以下是当前版本的解决方案: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”字段,因此显示了一个验证错误。

wh6knrhe

wh6knrhe2#

至于2021年初,the solution from @vivanov here与Laravel 8包完美兼容。
这里我添加了使用默认Laravel验证消息的功能,因为使用自己的验证消息太烦人了。
下面是你必须在@vinvanov解决方案中更改的内容。
1.更新composer.json

"require": {
        "illuminate/validation": "^8.25",
        "illuminate/translation": "^8.25"
    },

1.将Laravel validation messages file复制到project/laravel/en/validation文件夹。
1.修改@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);

在我的gist中查看完整代码和更多注解;
这就是了。你已经有了为你工作的默认Laravel消息。
Laravel验证docs
PS:Credits也从Jeff转到this blog post
PPS:这是辉煌的,尽管版本从5.6跳到8.25的软件包接口是稳定的,无缝工作。如此成熟和有见地的开源态度和对开发者的极大关怀来自Taylor奥特韦尔。只有当你在现代PHP框架之外,在一个糟糕的PHP代码库中工作时,你才能体会到这一点的最大便利。

iih3973s

iih3973s3#

我不想建议这个,但Laravel验证器可能不是你想要的。我建议看看Symfony或Zend Framework(2+)中的验证器类。它们作为独立的验证器工作得很好,事实上,我目前正在Laravel项目中使用ZF2表单类和验证器,因为Laravel表单和验证器类还没有达到标准。
这可能不是你想听到的答案,但从长远来看,它可能会为你节省一些痛苦。

vlurs2pr

vlurs2pr4#

我也在想同样的问题,一年后,我发现德拉Babel的答案实在是太差了。我确实找到了下面的Gist,spekkionu有一个相当简单的设置让你开始。(它在我的机器上工作。?;P)它展示了如何为工厂制作翻译器等。当您使用composer导入illuminate/validation时,这些都包括在内。
希望有帮助:https://gist.github.com/spekkionu/e9103993138e666f9f63
最好

oyxsuwqo

oyxsuwqo5#

不幸的是,如果你打算使用Laravel的自定义验证规则,那么前面的解决方案都不起作用。
你可以在我的gist中查看我的解决方案。
非常感谢@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());
    }
}

我敢肯定你可以玩所需的版本。

相关问题