如何在 laravel 之外正确实例化 Iluminate 类
Posted
技术标签:
【中文标题】如何在 laravel 之外正确实例化 Iluminate 类【英文标题】:How to correctly instantiate the Iluminate class outside of laravel 【发布时间】:2015-09-30 17:31:42 【问题描述】:我有 Eloquent 在 Laravel 之外工作,没有任何问题。现在我尝试通过以下方式使用 Validation 类:
<?php
namespace User;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Validation\Validator;
class User extends Model
private $rules = array(
'firstName' => 'required|min:2|max:50',
'lastName' => 'required|min:2|max:50',
);
public function validate($data)
$v = Validator::make($data, $this->rules);
return $v->passes();
执行该代码给我一个错误:
Call to undefined method Illuminate\Validation\Validator::make()
这是正确的,因为方法 make 不在类 Validator 上,而是在他的工厂中:
如何正确实例化验证库以使其正常工作?
顺便说一句,这是我的 composer.json:
"require":
"slim/slim": "^2.6",
"illuminate/database": "^5.1",
"illuminate/validation": "^5.1"
,
"autoload":
"classmap": [
"app/model"
]
【问题讨论】:
尝试使用这个use Validator
而不是use Illuminate\Validation\Validator
@NehalHasnayeen PHP 致命错误:在第 18 行的 /var/www/test/app/model/user.php 中找不到类“验证器”
【参考方案1】:
您的方法存在一些问题:
您试图通过调用Illuminate\Validation\Validator::make
方法创建一个新的Validator
实例,但您指出make()
方法存在于Illuminate\Validation\Factory
上,这完全是一个不同的类,所以你得到的错误是合理的。
您正尝试静态调用make()
方法::
,而实际上它并没有这样定义。
如果您查看Illuminate\Validation\ValidationServiceProvider
类中的registerValidationFactory()
方法,您就会了解验证器实例是如何创建的。因此,基于此,您可以执行以下操作:
namespace User;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Validation\Factory as ValidatorFactory;
use Symfony\Component\Translation\Translator;
class User extends Model
private $rules = array(
'firstName' => 'required|min:2|max:50',
'lastName' => 'required|min:2|max:50',
);
public function validate($data)
$factory = new ValidatorFactory(new Translator('en'));
$v = $factory->make($data, $rules);
return $v->passes();
【讨论】:
谢谢!,这很好用,我看到您实际上导入了翻译器,但是您如何格式化/翻译错误响应。我添加 var_dump($v->messages()->all());到验证函数,以便在出现故障时查看输出,但我得到一个字符串而不是翻译后的短语; array(1) [0]=> string(21) "validation.min.string" 你知道怎么解决吗?【参考方案2】:要让验证包在 Laravel 之外工作,你还需要翻译包。
所以首先创建一个翻译器的实例,然后用它来创建一个验证工厂。
工作示例
<?php
/*
Required composer packages:
illuminate/validation
illuminate/translation
*/
/*
Translation language files directory is the same as with Laravel
./lang/en/validation.php
*/
require_once 'vendor/autoload.php';
// You need to specify where the translation files is
$test_translation_path = __DIR__.'/lang';
$test_translation_locale = 'en';
// Set up data for the validator
$test_input_data = ['field' => 'value'];
$test_input_rules = ['field' => 'required'];
$translation_file_loader = new Illuminate\Translation\FileLoader(new Illuminate\Filesystem\Filesystem, $test_translation_path);
$translator = new Illuminate\Translation\Translator($translation_file_loader, $test_translation_locale);
$validation_factory = new Illuminate\Validation\Factory($translator);
$validator = $validation_factory->make($test_input_data, $test_input_rules);
if ($validator->fails())
die('Validation failed');
die('Validation passed!');
【讨论】:
这对于任何想要默认消息的人来说都是正确的答案。 这帮助我使用验证器在 laravel 或 lumen 之外创建了validationException!以上是关于如何在 laravel 之外正确实例化 Iluminate 类的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用父 App.vue 的情况下在 Laravel 中实例化 vue 3 应用程序?
如何正确实例化 didChangeDependencies 中的 bloc?
如何正确实例化 GoogleIdTokenVerifier / .setAudience() 做啥?