![](/img/trans.png)
[英]How to separate folders for constraints and validators classes in symfony2?
[英]How to allow empty values in symfony2 validators
我想僅在值不為空時才對對象屬性應用驗證器,即。
現在標准的symfony行為:
class Entity
{
/**
* @ORM\Column(type="string", nullable=true)
* @Assert\Email()
*/
protected $email;
(...)
}
如果電子郵件為空,或者為空字符串,那么該對象不會通過驗證,是否有辦法告訴驗證者斷言為有效的空值,並僅在字段有數據時驗證?
PS我知道我可以編寫回調驗證器,但為每個字段寫回調只是為了擁有“allowEmpty”功能並不是那么好。
您必須在FormBuilder
類中為所有可選字段顯式設置'required' => false
。 這是一段描述字段類型選項的段落。
編輯。 獲得了不少投票。 默認情況下, 除 NotNull
和NotEmpty
外 , 所有驗證器都將null
值視為有效。 這兩個問題都沒有用在問題中。 問題隱含於如何關閉默認情況下打開的客戶端required
屬性。
設置required
選項不是解決方案:
另請注意,將required選項設置為true將不會導致應用服務器端驗證。 換句話說,如果用戶為該字段提交空白值(例如,使用舊瀏覽器或Web服務),則除非您使用Symfony的NotBlank或NotNull驗證約束,否則它將被接受為有效值。
http://symfony.com/doc/current/book/forms.html#field-type-options
對於我的自定義驗證器,我添加了一個
if (null == $value) {
return true;
}
到isValid()
方法。 但是,我不確定標准驗證器類的最佳方法是什么。
如果我理解正確,只有輸入值才需要服務器端驗證。 我正是在同一個場景中。 我想僅在提供URL時才驗證URL。 我遇到的最好方法是編寫自己的自定義驗證類。 您可以編寫通用的自定義驗證類。
我按照這個鏈接https://symfony-docs-chs.readthedocs.org/en/2.0/cookbook/validation/custom_constraint.html除了因為symfony的最新版本而進行的一些更改。 這是實施
ACME \\ BundleNameBundle \\驗證\\約束\\ cstmUrl
namespace Acme\BundleNameBundle\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Constraints\Url;
/**
* @Annotation
*/
class CstmUrl extends Url
{
public $message = 'The URL "%string%" is not valid';
}
ACME \\ BundleNameBundle \\驗證\\約束\\ cstmUrlValidator
namespace Acme\BundleNameBundle\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Constraints\Url;
use Symfony\Component\Validator\Constraints\UrlValidator;
class CstmUrlValidator extends UrlValidator
{
public function validate($value, Constraint $constraint)
{
if(!$value || empty($value))
return true;
parent::validate($value, $constraint);
}
}
Validtion.yml
Acme\BundleNameBundle\Entity\Student:
Url:
- Acme\BundleNameBundle\Validator\Constraints\CstmUrl: ~
在Controller內部綁定你通常會做的約束
'constraints'=> new CstmUrl(array("message"=>"Invalid url provided"))
我相信可以有其他更好的方法來做到這一點,但是現在我覺得這樣做很好。
以防萬一其他人遇到同樣的問題。 我更喜歡通過在我的Twig模板中添加以下屬性來親自解決它:
{{ form_row(form.<field>, {'required': false}) }}
這是我發現的技巧:
https://github.com/symfony/symfony/issues/5906
您需要編寫一個不執行任何操作的數據轉換器,然后將其添加到您的字段中。 之后,juste將第二個參數的submit()方法調用為false。
請注意,Symfony 2.3沒問題。
字段類型猜測處理這個。 http://symfony.com/doc/current/book/forms.html#field-type-guessing
這取決於你的表單聲明 :“當你省略add()方法的第二個參數時(或者如果你向它傳遞null),激活”猜測“。如果你傳遞一個options數組作為第三個參數(為dueDate完成)如上所述),這些選項適用於猜測字段。“
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.