是否使用PDO尊重\验证自定义规则?
我正在学习Slim Framework v4,并决定使用是否使用PDO尊重\验证自定义规则?,pdo,respect-validation,slim-4,Pdo,Respect Validation,Slim 4,我正在学习Slim Framework v4,并决定使用尊重\验证来验证输入的数据,但遇到了一个障碍,我不知道如何将PDO注入到我创建的自定义规则中 如果提供的数据存在(或者在其他情况下,如果输入正确),则根据数据库验证一些输入。在这个特定的例子中,我要验证用户登录的凭据。我的想法是: AuthController.php: v::with('app\\Validators\\'); $userValidation = v::notBlank()->email()->
尊重\验证
来验证输入的数据,但遇到了一个障碍,我不知道如何将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
}
}
但是我得到一个错误,函数app\Validators\EmailExists的参数太少::u construct(),传递了0个,预期正好是1个
,这在某种程度上是意料之中的,因为抽象规则
没有注入PDO,我的类扩展了它
那么,如何注入PDO接口,以便在自定义规则中使用它呢
你们是在用另一种方法来验证这类数据吗?请注意,我正在编写一个API,所以数据库验证在某种程度上是必须的,在谷歌搜索了过去两天之后,我手头没有解决方案
我还在使用PHP-DI
创建PDO接口。这是my 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);
任何帮助都将不胜感激。使用您的用户模型计算用户表中点击的行数。
class EmailAvailable extends AbstractRule {
/**
* @param $input
*
* @return bool
*/
public function validate ($sInput) {
return User::where('user_email', $sInput)->count() === 0;
}
}
如果不完全为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;
}
}
请不要只发布代码作为答案,而是解释代码的作用以及如何解决问题。带有解释的答案通常质量更高,更容易吸引选票。