Соблюдать \ проверять настраиваемое правило с PDO?
Я изучаю 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 ответа
Используйте свою пользовательскую модель, чтобы подсчитать количество строк в пользовательской таблице, где есть попадание. Если не совсем 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;
}
}
class EmailAvailable extends AbstractRule {
/**
* @param $input
*
* @return bool
*/
public function validate ($sInput) {
return User::where('user_email', $sInput)->count() === 0;
}
}