【问题标题】:Respect\Validation custom Rule with PDO?使用 PDO 尊重\验证自定义规则?
【发布时间】:2019-10-25 16:58:12
【问题描述】:

我正在学习 Slim Framework v4 并决定使用 Respect\Validation 来验证输入的数据,但遇到了一个问题,我不知道如何将 PDO 注入到我创建的自定义规则中。

这个想法是如果提供的数据存在(或者在其他情况下,如果输入正确),则针对数据库验证一些输入。在这种特定情况下,我将验证用户的登录凭据。我的想法是:

AuthController.php:

    v::with('app\\Validators\\');
    $userValidation = v::notBlank()->email()->length(null, 255)->EmailExists()->setName('email');

EmailExists() 是我的自定义规则。

EmailExists.php:

namespace app\Validators;

use PDO;
use Respect\Validation\Rules\AbstractRule;

class EmailExists extends AbstractRule
{
    protected $pdo;

    public function __construct(PDO $pdo)
    {
        $this->pdo = $pdo;
    }

    public function validate($input, $id = null)
    {
    // a PDO query that checks if the email exists in database
    }
}

但我收到了 Too few arguments to function app\Validators\EmailExists::__construct(), 0 passed and exactly 1 expected 的错误,这是意料之中的,因为 AbstractRule 没有注入 PDO 并且我的类扩展了它。

那么如何注入 PDO 接口以便我可以在我的自定义规则中使用它呢?

你们是否使用另一种方法来验证此类数据?请注意,我正在编写一个 API,因此数据库验证在某种程度上是必须的,在过去两天谷歌搜索后,我手头没有解决方案。

我还在使用PHP-DI 创建 PDO 接口。这是我的 dependencies.php 文件:

declare(strict_types=1);

use DI\ContainerBuilder;
use Psr\Container\ContainerInterface;
use app\Handlers\SessionMiddleware;

return function (ContainerBuilder $containerBuilder) {
    $containerBuilder->addDefinitions([
        PDO::class => function (ContainerInterface $c) {
            $settings = $c->get('settings')['db'];

            $db = new PDO("mysql:host={$settings['host']};dbname={$settings['database']};charset={$settings['charset']},{$settings['username']},{$settings['password']}");
            $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8',time_zone='{$offset}'");
            $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

            return $db;
        },
        'session' => function(ContainerInterface $c) {
            return new SessionMiddleware;
        }
    ]);
};

和(部分)index.php:

declare(strict_types=1);

use DI\ContainerBuilder;
use Slim\Factory\AppFactory;

// Instantiate PHP-DI ContainerBuilder
$containerBuilder = new ContainerBuilder();

// Set up settings
$settings = require __DIR__ . '/../app/settings.php';
$settings($containerBuilder);

// Set up dependencies
$dependencies = require __DIR__ . '/../app/dependencies.php';
$dependencies($containerBuilder);

// Build PHP-DI Container instance
$container = $containerBuilder->build();

// Instantiate the app
AppFactory::setContainer($container);
$app = AppFactory::create();

// Register middleware
$middleware = require __DIR__ . '/../app/middleware.php';
$middleware($app);

// Register routes
$routes = require __DIR__ . '/../app/routes.php';
$routes($app);

// Add Routing Middleware
$app->addRoutingMiddleware();

// Run App & Emit Response
$response = $app->handle($request);
$responseEmitter = new ResponseEmitter();
$responseEmitter->emit($response);

任何帮助将不胜感激。

【问题讨论】:

    标签: pdo respect-validation slim-4


    【解决方案1】:

    使用您的用户模型来计算用户表中存在命中的行数。 如果不正好为 0,则检查返回 false,如果正好为 0,则检查通过。 因此,此时您不必包含 PDO。我用的是 Slim 3,效果很好。

    namespace app\Validators;
    
    use Respect\Validation\Rules\AbstractRule;
    
    class EmailAvailable extends AbstractRule {
    
            /**
             * @param $input
             *
             * @return bool
             */
            public function validate ($sInput) {
                return User::where('user_email', $sInput)->count() === 0;
            }
        }
    

    【讨论】:

      【解决方案2】:
      class EmailAvailable extends AbstractRule {
      
          /**
           * @param $input
           *
           * @return bool
           */
          public function validate ($sInput) {
              return User::where('user_email', $sInput)->count() === 0;
          }
      }
      

      【讨论】:

      • 请不要只发布代码作为答案,但要说明您的代码的作用以及它如何解决问题的问题。带有解释的答案通常质量更高,更有可能吸引投票。
      猜你喜欢
      • 1970-01-01
      • 2017-07-25
      • 2019-05-16
      • 2014-04-22
      • 2017-12-01
      • 2017-04-11
      • 2018-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多