Уважение \ Проверка пользовательских правил с помощью PDO? - PullRequest
1 голос
/ 16 октября 2019

Я изучаю 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, поэтому проверка базы данных является чем-то обязательным, и после поиска в Google в течение последних двух дней у меня нет под рукой решений.

Я также использую 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);

Любая помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 25 октября 2019

Используйте вашу пользовательскую модель для подсчета количества строк в пользовательской таблице, где есть попадание. Если это не точно 0, проверка возвращает ложь, если это точно 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;
        }
    }
0 голосов
/ 24 октября 2019
class EmailAvailable extends AbstractRule {

    /**
     * @param $input
     *
     * @return bool
     */
    public function validate ($sInput) {
        return User::where('user_email', $sInput)->count() === 0;
    }
}
...