【问题标题】:Fail to make Laravel 4's Validator class work outside the framework无法让 Laravel 4 的 Validator 类在框架外工作
【发布时间】:2013-05-07 16:26:13
【问题描述】:

我正在尝试在框架之外使用 Laravel'4 Eloquent,因为 Illuminate/Database 包已通过 composer 单独提供。

Eloquent 本身运行良好,但我在尝试实施验证规则时被阻止。

我首先尝试使用像 Ardent 这样的预构建库,然后使用我自己的代码,但结果是一样的,我得到了这个致命错误:

致命错误:在非对象上调用成员函数 make() vendor\illuminate\support\Illuminate\Support\Facades\Facade.php on 第 177 行

当我调用 Validator::make(); 时问题总是开始

$validator = Validator::make(
    $this->attributes,
    array('name' => 'required')
);

查看调试似乎调用了static::resolveFacadeInstance('validator');,但它只是返回null

我不熟悉外墙的工作原理,谁能指出我正确的方向?谢谢!

这是我的 composer.json:

{
    "require": {
        "illuminate/database": "~4.0",
        "illuminate/validation" : "~4.0",
        "laravelbook/ardent": "dev-master"
    },
    "config": {
        "preferred-install": "dist"
    },
    "minimum-stability": "dev"
}

【问题讨论】:

  • 是否使用 Composer 安装它?
  • 是的,正如我所说的 Eloquent 效果很好,我会将我的 composer.json 添加到问题中......
  • 如果你用"illuminate/validation": "4.0.*@dev"替换验证,用"illuminate/database": "4.0.*@dev"替换数据库怎么办?
  • 运行“composer update”并没有更新任何东西,所以我想我已经拥有了最新版本的库。无论如何,我认为问题不在于库,而在于 Laravel 的外观系统如何工作。我认为我应该在某个地方初始化验证器,但我不知道如何......
  • 我认为你的问题与这个问题有关:github.com/laravel/framework/issues/854

标签: php laravel laravel-4 eloquent


【解决方案1】:

对于可能需要更多信息的人,我将在此处报告 bencorlett (link) 在 laravel 的 github repo 上给我的答案:

// Store the factory instance somewhere, Maybe like:

class Validator {

    protected static $factory;

    public static function instance()
    {
        if ( ! static::$factory)
        {
            $translator = new Symfony\Component\Translation\Translator('en');
            static::$factory = new Illuminate\Validation\Factory($translator);
        }

        return static::$factory;
    }

    public static function __callStatic($method, $args)
    {
        $instance = static::instance();

        switch (count($args))
        {
            case 0:
                return $instance->$method();

            case 1:
                return $instance->$method($args[0]);

            case 2:
                return $instance->$method($args[0], $args[1]);

            case 3:
                return $instance->$method($args[0], $args[1], $args[2]);

            case 4:
                return $instance->$method($args[0], $args[1], $args[2], $args[3]);

            default:
                return call_user_func_array(array($instance, $method), $args);
        }
    }
}

$validator = Validator::make($data, $rules);

【讨论】:

    【解决方案2】:

    我已经在我正在进行的项目中使用它。不幸的是,没有关于如何在框架之外使用它的文档。关于如何在框架之外使用 Eloquent 的文档至少存在,但是很狡猾。

    所以首先,把它放在composer.json中:

    "illuminate/validation": "4.1.*",
    

    验证对象由工厂对象生成。这个工厂对象是外观映射回的对象。因此,不要使用外观,而是像这样获取该对象:

    $factory = new \Illuminate\Validation\Factory(new \Symfony\Component\Translation\Translator('en'));
    

    然后你可以make你的验证对象:

    $validator = $factory->make($inputArray, $rulesArray);
    

    到目前为止,在我发现的框架之外使用它有几个注意事项。

    首先是任何依赖于数据库的验证都会失败,因为它无法查询数据库。这可以通过为验证对象提供一个 Illuminate\Validation\DatabasePresenceVerifier 对象来解决,该对象包装了数据库管理器,您可以从设置 Eloquent 时创建的对象中获取该对象:

    $validator->setPresenceVerifier(new \Illuminate\Validation\DatabasePresenceVerifier($capsule->getDatabaseManager());
    

    另一个是没有设置默认验证消息。到目前为止,我只是通过使用 make 函数的第三个参数来指定每个字段的自定义规则来处理这个问题。

    【讨论】:

      猜你喜欢
      • 2017-08-26
      • 1970-01-01
      • 1970-01-01
      • 2014-12-21
      • 2014-09-21
      • 2013-12-01
      • 2014-07-26
      • 2012-12-29
      相关资源
      最近更新 更多