我正在使用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解决方案中必须更改的内容。
- 更新
composer.json
"require": {
"illuminate/validation": "^8.25",
"illuminate/translation": "^8.25"
},
将Laravel验证消息文件复制到您的
project/laravel/en/validation
文件夹中。修改@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()
函数也用于创建验证器工厂。
- 为全局函数添加自定义帮助程序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);
}
}
- 在composer.json中注册
//<project-path>/composer.json
{
"require": {
"php": "^8.1",
"illuminate/translation": "^10.9",
"illuminate/validation": "^10.9",
},
"autoload": {
"files": [
"src/helpers.php"
]
}
}
- 添加区域设置文件
//<project-path>/lang/en/validation.php
<?php
return [
'accepted' => 'The :attribute must be accepted.',
// ... rest of the validations
// Copy it from Laravel.
];
- 创建验证工厂并使用它
//<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());
}
}
我很确定你可以玩所需的版本。