好的,所以我想在DBAL连接上使用DI进行验证。我想出来是这样的:
约束
class UserExists extends Constraint
{
public $message = 'Podany login "%string%" jest już zajęty.';
public function validatedBy()
{
return 'validator.user.exists';
}
}
验证
public $conn;
public function validate($value, Constraint $constraint)
{
$sql = "SELECT count(1) AS liczba FROM uzytkownicy WHERE login= ? ";
$exists = $this->conn->fetchAssoc($sql, array($value)); //this->conn is NULL
if ($exists) {
$this->context->buildViolation($constraint->message)
->setParameter('%string%', $value)
->addViolation();
return false;
}
return true;
}
public function setConn(Connection $conn)
{
$this->conn = $conn;
}
提供商
class UserExistsProvider implements ServiceProviderInterface
{
public function register(Application $app)
{
$app['validator.user.exists'] = $app->share(function ($app) {
$validator = new UserExistsValidator();
$validator->setConn($app['db']);
return $validator;
});
}
public function boot(Application $app) {}
}
这就是我注册服务的方式:
$app->register(new UserExistsProvider());
$app->register(new Silex\Provider\ValidatorServiceProvider(array(
'validator.validator_service_ids' => array(
'validator.user.exists' => $app['validator.user.exists']
)
)));
所以当我在var_dump $ app ['validator.user.exists']中它有$ conn属性的正确初始值时,虽然在我的表单验证路径中我有这样的错误:
ConstraintValidatorFactory.php第46行中的ClassNotFoundException: 尝试从全局命名空间加载类“validator.user.exists”。 你忘记了“使用”声明吗?
我提到了$ conn属性,因为当我在约束中注释validatedBy()方法时,我可以初始化验证类,但$ conn属性为空。