如何在 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() 方法::,而实际上它并没有这样定义。

您正在尝试像在 Laravel 应用程序环境中一样使用验证器,这将无法正常工作,因为您缺少 Laravel 用于允许如此简单的实例化验证器。

如果您查看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() 做啥?

如何正确实例化 os.FileMode

如何使用 dotnet spark 正确实例化 spark 会话?

Laravel 5.7:构建时目标不可实例化