【问题标题】:Laravel Eloquent Database Validators Not Working In Slim 3Laravel Eloquent 数据库验证器在 Slim 3 中不工作
【发布时间】:2018-02-15 08:25:09
【问题描述】:

我正在使用 Slim 3 进行开发。我决定将 Eloquent 作为 ORM,并希望在中间件中使用 Illuminate 验证器来验证来自我的控制器的信息。

不需要使用数据库进行验证的验证规则效果很好,但我在使用数据库验证器时遇到了问题。

我没有收到任何错误,只是没有通过。

据我了解,我应该创建验证器工厂,然后调用 make 函数。示例:

$v = $this->validatorFactory
       ->make($toCheck, $this->rules[$route], $this->messages);

if ($v->fails()) {....}

因为它适用于所有不需要数据库的路线,所以我不会在这里详细介绍。我认为问题在于我如何将 PressenceValidator 添加到我的工厂。

我就是这样做的。

private function initiateValidatorFactory($dbConnectionSettings)
{
    $validatorFactory = new ValidatorFactory(
        new Translator(new FileLoader(new Filesystem(), "en"), "en"),
        null);

    $sqlConfig = $dbConnectionSettings['mysql'];

    $dsn = 'mysql:host=' . $sqlConfig['host'] . ';port=' . $sqlConfig['port'] . ';dbname=' . $sqlConfig['database'];
    $connection = new Connection(
        new \PDO($dsn, $sqlConfig['username'], $sqlConfig['password']),
        $sqlConfig['database'],
        $sqlConfig['prefix']
    );
//        var_dump($connection->select('SELECT * FROM platform;'));
//        die();

    $resolver = new ConnectionResolver(['mysql' =>  $connection]);

//        var_dump($resolver->hasConnection('mysql'));
//        die();

//        var_dump($resolver->connection('mysql'));
//        die();

    $verifier = new DatabasePresenceVerifier($resolver);
//        $verifier->setConnection('mysql');

    $validatorFactory->setPresenceVerifier($verifier);

    $this->validatorFactory = $validatorFactory;
}

我想指出,这个被注释掉的原始 SQL 查询在那时有效。这就是为什么我认为 Connection 类没有问题。

请注意我是如何创建几乎是虚拟的 FileLoader,但我认为我的用例不需要它(或者我可能不确定)。

所有被注释掉的检查看起来都不错。

我尝试使用谷歌搜索,发现人们提到了一些关于“启动 eloquent”的内容。我试图在我的代码中找到可以做到这一点的地方,但没有成功。

最后一件事是我缺少的是我如何编写我的规则。示例规则是这样的:

'platformid' => 'exists:mysql.platform,platformid'

PS 不要问为什么我们在“platform”表中有“platformid”列=)。

我正在使用照明/验证 5.5 和照明/数据库 5.5。

感谢您的宝贵时间以及您可以提前提供的任何帮助。

【问题讨论】:

    标签: php laravel laravel-5 eloquent slim


    【解决方案1】:

    不知怎的,我想通了。它很老套,但我想我现在可以忍受了。我不太明白为什么这种方法有效,但确实有效。

    所以我有这样的数据库服务提供商:

    $capsule = new Manager();
    
        ////////CONFIGURE MYSQL\\\\\\\
        $sqlConfig = $pimple['settings']['db']['mysql'];
        $capsule->addConnection([
            'driver'    => $sqlConfig['driver'],
            'host'      => $sqlConfig['host'],
            'database'  => $sqlConfig['database'],
            'username'  => $sqlConfig['username'],
            'password'  => $sqlConfig['password'],
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ], $this->connectionName);
    ....
    ....
    $pimple['db'] = function ($c) use ($capsule) {
            return $capsule;
        };
    

    我在 dependencies.php 中调用它

    然后当我来到路线时,我会这样做:

    $container = $app->getContainer();
    $validatorMiddleware = new \....\Middleware\BaseMiddleware($container->get('db'));
    

    我把我的中间件初始化改成了这个

    private function initiateValidatorFactory($dbConnectionSettings)
    {
        $validatorFactory = new ValidatorFactory(
            new Translator(new FileLoader(new Filesystem(), "en"), "en"),
            null);
    
        $resolver = new ConnectionResolver(['mysql' =>  $dbConnectionSettings->getConnection('mysql')]);
    
        $verifier = new DatabasePresenceVerifier($resolver);
    
        $validatorFactory->setPresenceVerifier($verifier);
    
        $this->validatorFactory = $validatorFactory;
    }
    

    请注意我的变量如何不再有意义,但您会弄清楚如何使它变得更好。 (包括我)。最重要的是这以某种方式起作用。我知道这是hacky。如果您想发布不包含黑客攻击的答案,请执行 =)。

    【讨论】:

      猜你喜欢
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-10
      相关资源
      最近更新 更多