使用 Yaml 的 Symfony 回调验证
Symfony Callback Validation with Yaml
使用 validation.yml 定义时未调用我的验证。
使用 php 或注释一切正常。
namespace AppBundle\Form;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
class LoginForm
{
private $login;
private $password;
public function __construct($login, $password)
{
$this->login = $login;
$this->password = $password;
}
public function validate(ExecutionContextInterface $context)
{
$context->buildViolation('Error')
->atPath('login')
->addViolation();
}
}
这是我的validation.yml
AppBundle\Form\LoginForm:
constraints:
- Callback: [validate]
这是我的控制器
class LoginController extends Controller
{
public function loginAction(Request $request)
{
if ($request->isMethod('POST')) {
$login = $request->request->get('loginform_login');
$password = $request->request->get('loginform_password');
$form = new LoginForm($login, $password);
$errors = $this->get('validator')->validate($form);
if (count($errors) > 0) {
return $this->render('login/error.html.twig');
}
return $this->render('login/ok.html.twig');
}
return $this->render('login/login.html.twig');
}
}
以上代码总是 returns 'ok',无论我输入哪个登录名或密码。
有什么线索吗?
根据我们在评论和提供的示例中的反复,与当前的食谱示例相比,一切看起来都不错。我们坚定地处于头脑风暴/"see what sticks" 领域。以下是一些剩余的想法:
您的 validation.yml
文件不会得到 parsed/loaded 吗?您可以尝试向文件添加一些其他 属性 级别的约束,只是为了将回调排除为异常值。
您可以尝试使用 lint:yaml
CLI 工具,但根据之前的经验,我预计任何格式错误的 YAML 都会引发更明确的解析错误。
极度不太可能(尤其是在最近的文档闪电战之后),但也许食谱示例不是最新的,并且配置行为已经以某种方式发生了变化。
启动 XDebug 并开始逐步执行验证过程。确保您确实点击了验证回调。如果没有,请尝试使用外部或静态回调方法,看看是否可以缓解问题。
除上述任何一项外,我会非常感兴趣地等待比我自己更明智的答案!
您需要将 validation.yml
文件放入包的 Resources/config
目录中。
从 Symfony 2.7 开始,Symfony 还将从 Resources/config/validation
目录加载文件。
As of Symfony 2.7, XML and Yaml constraint files located in the Resources/config/validation sub-directory of a bundle are loaded. Prior to 2.7, only Resources/config/validation.yml (or .xml) were loaded.
一些有效路径示例:
- src/AppBundle/Resources/config/validation.yml
- src/AppBundle/Resources/config/validation/foo.yml
使用 validation.yml 定义时未调用我的验证。 使用 php 或注释一切正常。
namespace AppBundle\Form;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
class LoginForm
{
private $login;
private $password;
public function __construct($login, $password)
{
$this->login = $login;
$this->password = $password;
}
public function validate(ExecutionContextInterface $context)
{
$context->buildViolation('Error')
->atPath('login')
->addViolation();
}
}
这是我的validation.yml
AppBundle\Form\LoginForm:
constraints:
- Callback: [validate]
这是我的控制器
class LoginController extends Controller
{
public function loginAction(Request $request)
{
if ($request->isMethod('POST')) {
$login = $request->request->get('loginform_login');
$password = $request->request->get('loginform_password');
$form = new LoginForm($login, $password);
$errors = $this->get('validator')->validate($form);
if (count($errors) > 0) {
return $this->render('login/error.html.twig');
}
return $this->render('login/ok.html.twig');
}
return $this->render('login/login.html.twig');
}
}
以上代码总是 returns 'ok',无论我输入哪个登录名或密码。 有什么线索吗?
根据我们在评论和提供的示例中的反复,与当前的食谱示例相比,一切看起来都不错。我们坚定地处于头脑风暴/"see what sticks" 领域。以下是一些剩余的想法:
您的
validation.yml
文件不会得到 parsed/loaded 吗?您可以尝试向文件添加一些其他 属性 级别的约束,只是为了将回调排除为异常值。您可以尝试使用
lint:yaml
CLI 工具,但根据之前的经验,我预计任何格式错误的 YAML 都会引发更明确的解析错误。极度不太可能(尤其是在最近的文档闪电战之后),但也许食谱示例不是最新的,并且配置行为已经以某种方式发生了变化。
启动 XDebug 并开始逐步执行验证过程。确保您确实点击了验证回调。如果没有,请尝试使用外部或静态回调方法,看看是否可以缓解问题。
除上述任何一项外,我会非常感兴趣地等待比我自己更明智的答案!
您需要将 validation.yml
文件放入包的 Resources/config
目录中。
从 Symfony 2.7 开始,Symfony 还将从 Resources/config/validation
目录加载文件。
As of Symfony 2.7, XML and Yaml constraint files located in the Resources/config/validation sub-directory of a bundle are loaded. Prior to 2.7, only Resources/config/validation.yml (or .xml) were loaded.
一些有效路径示例:
- src/AppBundle/Resources/config/validation.yml
- src/AppBundle/Resources/config/validation/foo.yml