《PHP實戰(zhàn):Symfony數(shù)據(jù)校驗方法實例分析》要點:
本文介紹了PHP實戰(zhàn):Symfony數(shù)據(jù)校驗方法實例分析,希望對您有用。如果有疑問,可以聯(lián)系我們。
PHP應(yīng)用本文實例講述了Symfony數(shù)據(jù)校驗辦法.分享給大家供大家參考.具體分析如下:
PHP應(yīng)用校驗在web應(yīng)用程序中是一個常見的任務(wù).數(shù)據(jù)輸入到表單需要被校驗.數(shù)據(jù)在被寫入數(shù)據(jù)庫之前或者傳入一個webservice時也需要被校驗.
PHP應(yīng)用Symfony2 配備了一個Validator 組件,它讓校驗工作變得簡單易懂.該組件是基于JSR303 Bean校驗規(guī)范.一個Java規(guī)范用在PHP中.
PHP應(yīng)用基本驗證
PHP應(yīng)用理解校驗的最好辦法是看它的表現(xiàn).首先,假設(shè)你已經(jīng)創(chuàng)建了一個用于你應(yīng)用程序某個地方的PHP對象.
PHP應(yīng)用class Author
{
??? public $name;
}
PHP應(yīng)用到現(xiàn)在為止,它只是個服務(wù)于你應(yīng)用程序的某些目的的普通的類.而校驗的目的就是要告訴你對象的數(shù)據(jù)是否合法.為了這個目的,你需要配置一個對象必須遵守規(guī)則或者約束列表來讓自己的數(shù)據(jù)合法.這些規(guī)則可以被描述成多種不同的格式的(比如,YAML,XML,類聲明或者PHP).比如,我們保證屬性$name不能為空,來添加下面的規(guī)則:
PHP應(yīng)用YAML格式:
PHP應(yīng)用class Author
{
?? /**
??? * @Assert\NotBlank()
??? */
??? public $name;
}
PHP應(yīng)用XML格式:
PHP應(yīng)用??? <class name="Acme\BlogBundle\Entity\Author">
??????? <property name="name">
??????????? <constraint name="NotBlank" />
??????? </property>
??? </class>
</constraint-mapping>
PHP應(yīng)用PHP代碼格式:
PHP應(yīng)用use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints\NotBlank;
PHP應(yīng)用class Author
{
?? public $name;
??
?? public static function loadValidatorMetadata(ClassMetadata $metadata)
?? {
?????? $metadata->addPropertyConstraint('name', new NotBlank());
?? }
}
PHP應(yīng)用Protected和private屬性以及getter辦法也都可以被校驗.
PHP應(yīng)用使用validator服務(wù):
PHP應(yīng)用接下來,使用validator服務(wù)的validate辦法來真正的校驗Author對象. validator的工作很簡單:讀取一個類的約束規(guī)則來校驗一個對象的數(shù)據(jù)是否符合這些規(guī)則約束.如果校驗失敗,一個錯誤數(shù)組將被返回.現(xiàn)在我們在一個controller中來執(zhí)行它:
PHP應(yīng)用public function indexAction()
{
?? $author = new Author();
?? //... 對$auother對象做些什么
??
?? $validator = $this->get('validator');
?? $errors = $validator->validate($author);
PHP應(yīng)用?? if(count($errors) >0){
???? return new Response(print_r($errors, true));
?? }else{
???? return new Response('The author is valid! Yes!');
?? }
}
PHP應(yīng)用如果$name 屬性為空,你將看到下面的錯誤信息:
PHP應(yīng)用Acme\BlogBundle\Author.name:
???? This value should not be blank
PHP應(yīng)用如果你為$name屬性插入一個值,那么你會獲得快樂的成功信息.
PHP應(yīng)用大多數(shù)時候,你不需要直接跟validator服務(wù)交流或者根本不需要擔(dān)心打印出錯誤來.
PHP應(yīng)用大多數(shù)情況下,你將在處理提交表單數(shù)據(jù)時間接使用校驗.
PHP應(yīng)用你也可以傳遞一個錯誤信息集合到一個模版:
PHP應(yīng)用在模版中,你可以根據(jù)需要精確的輸出錯誤列表:
PHP應(yīng)用Twig格式:
PHP應(yīng)用校驗和表單
PHP應(yīng)用validator服務(wù)可以被用于任何時候校驗任何對象. 事實上,你將經(jīng)常在處理表單時間接使用validator.Symfony的表單類庫間接使用validator服務(wù)來在數(shù)據(jù)被提交和綁定后校驗底層對象.對象違反約束信息將被轉(zhuǎn)化到FieldError對象,該對象可以很容易的被展示在你的表單中.在一個controller中的傳統(tǒng)表單提交流程如下:
PHP應(yīng)用public function updateAction(Request $request)
{
??? $author = new Acme\BlogBundle\Entity\Author();
??? $form = $this->createForm(new AuthorType(),$author);
PHP應(yīng)用??? if($request->getMethod() =='POST'){
?????? $form->bindRequest($request);
?
?????? if($form->isvalid()){
????????? //對$author做一些操作
????????? return $this->redirect($this->generateUrl('...'));
?????? }
???? }
PHP應(yīng)用???? return $this->render('BlogBundle:Author:form.html.twig',array(
???????? 'form' => $form->createView(),
???? ));
}
PHP應(yīng)用配置:
PHP應(yīng)用Symfony2 的validator默認(rèn)情況下是可用的.但是如果你使用了生命辦法來指定你的約束,那么你需要顯式的開啟聲明功能:
PHP應(yīng)用YAML格式:
PHP應(yīng)用約束規(guī)則
PHP應(yīng)用Validator是設(shè)計了用來依照約束規(guī)則校驗對象的.為了校驗一個對象,只需要映射一個或者多個約束到它要校驗的類然后把它傳遞給validator服務(wù)即可.
PHP應(yīng)用本質(zhì)上,一個約束就是一個簡單的PHP對象,它可以生成一個決斷語句. 在現(xiàn)實生活中,一個約束可以是"蛋糕不能烤焦了" 這樣的規(guī)則約束.在Symfony2中,約束都差不多:他們決斷某個條件是否成立.給定一個值,約束會告訴你這個值是否遵守了你的約束規(guī)則.
PHP應(yīng)用Symfony2 支持的約束規(guī)則
PHP應(yīng)用首先是基礎(chǔ)約束規(guī)則:使用他們來決斷非?;镜氖?比如你對象屬性的值或者辦法的返回值.
PHP應(yīng)用NotBlank,Blank,NotNull,Null,True,False,Type
PHP應(yīng)用 字符串約束:Email,MinLength,MaxLength,Url,Regex,Ip等
數(shù)字約束:Max,Min
日期約束:Date,DateTime和Time
集合約束:Choice,Collection,UniqueEntity,Language,Locale和Country等.
文件約束:File,Image
其它約束:Callback,All,Valid
PHP應(yīng)用你也可以創(chuàng)建自己的自定義約束.
PHP應(yīng)用約束配置:
PHP應(yīng)用一些約束,比如NotBlank,很簡單,但是其它的比如Choice約束,有許多配置項需要設(shè)置.假設(shè)Author類有另外一個屬性,gener可以被設(shè)置為”male"或者"female":
PHP應(yīng)用YAML格式:
PHP應(yīng)用class Author
{
?? /**
??? * @Assert\Choice(
??? *???? choices = {"male","female"},
??? *???? message = "Choose a valid gender."
??? * )
??? */
??? public $gender;
}
PHP應(yīng)用XML格式:
PHP應(yīng)用??? <class name="Acme\BlogBundle\Entity\Author">
??????? <property name="gender">
??????????? <constraint name="Choice">
??????????????? <option name="choices">
??????????????????? <value>male</value>
??????????????????? <value>female</value>
??????????????? </option>
??????????????? <option name="message">Choose a valid gender.</option>
??????????? </constraint>
??????? </property>
??? </class>
</constraint-mapping>
PHP應(yīng)用PHP代碼格式:
PHP應(yīng)用class Author
{
??? public $gender;
PHP應(yīng)用??? public static function loadValidatorMetadata(ClassMetadata $metadata)
??? {
??????? $metadata->addPropertyConstraint('gender', new Choice(array(
??????????? 'choices' => array('male', 'female'),
??????????? 'message' => 'Choose a valid gender.',
??????? )));
??? }
}
PHP應(yīng)用一個約束的選項通常都是通過一個數(shù)組來傳遞的.有些約束也允許你傳遞一個值."default"在數(shù)組中是可選的.在Choice約束時,choices選項就可以通過這種方式指定.
PHP應(yīng)用YAML格式:
PHP應(yīng)用class Author
{
??? /**
???? * @Assert\Choice({"male", "female"})
???? */
??? protected $gender;
}
PHP應(yīng)用XML格式:
PHP應(yīng)用??? <class name="Acme\BlogBundle\Entity\Author">
??????? <property name="gender">
??????????? <constraint name="Choice">
??????????????? <value>male</value>
??????????????? <value>female</value>
??????????? </constraint>
??????? </property>
??? </class>
</constraint-mapping>
PHP應(yīng)用PHP格式:
PHP應(yīng)用class Author
{
??? protected $gender;
PHP應(yīng)用??? public static function loadValidatorMetadata(ClassMetadata $metadata)
??? {
??????? $metadata->addPropertyConstraint('gender', new Choice(array('male', 'female')));
??? }
}
PHP應(yīng)用約束目標(biāo)
PHP應(yīng)用約束可以被用于一個類的屬性或者一個公共的getter辦法.屬性約束最常用也最簡單,而公共的getter辦法約束則允許你指定一個復(fù)雜的約束規(guī)則.
PHP應(yīng)用屬性約束:
PHP應(yīng)用校驗類的屬性石一個最常規(guī)的校驗技術(shù).Symfony2允許你校驗private,protected或者public屬性.下面代碼顯示如何配置Author對象的$firstName屬性至少有3個字符:
PHP應(yīng)用YAML格式:
PHP應(yīng)用class Author
{
??? /**
???? * @Assert\NotBlank()
???? * @Assert\MinLength(3)
???? */
??? private $firstName;
}
PHP應(yīng)用XML格式:
PHP應(yīng)用PHP代碼格式:
PHP應(yīng)用class Author
{
??? private $firstName;
PHP應(yīng)用??? public static function loadValidatorMetadata(ClassMetadata $metadata)
??? {
??????? $metadata->addPropertyConstraint('firstName', new NotBlank());
??????? $metadata->addPropertyConstraint('firstName', new MinLength(3));
??? }
}
PHP應(yīng)用Getters
PHP應(yīng)用約束也可以應(yīng)用于一個方法的返回值.Symfony2 允許你添加一個約束到任何"get"或者 "is"開頭的public方法.該技術(shù)的好處是允許你動態(tài)的校驗?zāi)愕膶ο?比如,假設(shè)你想確認(rèn)密碼字段不匹配用戶的first name(因為平安原因).你可以通過創(chuàng)建一個idPasswordLegal 方法,然后決斷這個方法必須返回true:
PHP應(yīng)用YAML格式:
PHP應(yīng)用class Author
{
??? /**
???? * @Assert\True(message = "The password cannot match your first name")
???? */
??? public function isPasswordLegal()
??? {
??????? // return true or false
??? }
}
PHP應(yīng)用XML格式:
PHP應(yīng)用PHP代碼格式:
PHP應(yīng)用class Author
{
??? public static function loadValidatorMetadata(ClassMetadata $metadata)
??? {
??????? $metadata->addGetterConstraint('passwordLegal', new True(array(
??????????? 'message' => 'The password cannot match your first name',
??????? )));
??? }
}
PHP應(yīng)用現(xiàn)在我們創(chuàng)建一個isPasswordLegal()辦法,并且包含你需要邏輯:
PHP應(yīng)用類:
PHP應(yīng)用一些約束應(yīng)用到整個類被校驗上面.比如,Callback約束是一個通用約束,它可以應(yīng)用到類自身.當(dāng)類被校驗時,被約束描述的辦法只是被執(zhí)行這樣每一個可以提供更個性化的校驗.
PHP應(yīng)用校驗分組
PHP應(yīng)用到目前為止,你已經(jīng)能夠添加約束到類并詢問是否該類傳入所有定義的約束規(guī)則.一些情況下,你只需要使用該類的其中某些規(guī)則來校驗一個對象.要做到這些,你可以組織每一個約束到一個或者多個校驗組中,然后應(yīng)用使用其中一組校驗.比如,假設(shè)你有一個User類,它會在用戶注冊和用戶更新他們的聯(lián)系信息時使用.
PHP應(yīng)用YAML格式:
PHP應(yīng)用類聲明格式:
PHP應(yīng)用use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Validator\Constraints as Assert;
PHP應(yīng)用class User implements UserInterface
{
??? /**
??? * @Assert\Email(groups={"registration"})
??? */
??? private $email;
PHP應(yīng)用??? /**
??? * @Assert\NotBlank(groups={"registration"})
??? * @Assert\MinLength(limit=7, groups={"registration"})
??? */
??? private $password;
PHP應(yīng)用??? /**
??? * @Assert\MinLength(2)
??? */
??? private $city;
}
PHP應(yīng)用XML格式:
PHP應(yīng)用PHP代碼格式:
PHP應(yīng)用use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\MinLength;
PHP應(yīng)用class User
{
??? public static function loadValidatorMetadata(ClassMetadata $metadata)
??? {
??????? $metadata->addPropertyConstraint('email', new Email(array(
??????????? 'groups' => array('registration')
??????? )));
PHP應(yīng)用??????? $metadata->addPropertyConstraint('password', new NotBlank(array(
??????????? 'groups' => array('registration')
??????? )));
??????? $metadata->addPropertyConstraint('password', new MinLength(array(
??????????? 'limit'? => 7,
??????????? 'groups' => array('registration')
??????? )));
PHP應(yīng)用??????? $metadata->addPropertyConstraint('city', new MinLength(3));
??? }
}
PHP應(yīng)用這里我們配置了兩個校驗組:
????? default默認(rèn)組: 包括所有沒有分配到任何組的約束規(guī)則
????? registration: 只包含了email和password字段的校驗規(guī)則
PHP應(yīng)用告訴validator使用指定的校驗組,傳一個或者多個組名作為validate()辦法的第二個參數(shù)即可:
PHP應(yīng)用值和數(shù)組校驗
PHP應(yīng)用到目前為止,我們已經(jīng)看了如何校驗整個對象.但是有時候,我們可能想值校驗一個單獨的值,比如校驗一個字符串是不是一個合法的email地址.這非常簡單,在Controller類中進(jìn)行如下:
PHP應(yīng)用public function addEmailAction($email)
{
??? $emailConstraint = new Email();
??? // 所有的校驗選項(options)都可以這樣設(shè)置
??? $emailConstraint->message = 'Invalid email address';
PHP應(yīng)用??? // 使用validator來校驗一個值
??? $errorList = $this->get('validator')->validateValue($email, $emailConstraint);
PHP應(yīng)用??? if (count($errorList) == 0) {
??????? // 這是一個合法的email地址,可以做些什么
??? } else {
??????? // 這是一個非法的email地址
??????? $errorMessage = $errorList[0]->getMessage()
PHP應(yīng)用??????? // 做一些錯誤處理
??? }
PHP應(yīng)用??? // ...
}
PHP應(yīng)用通過調(diào)用validator的validateValue辦法,你可以傳入一個原始值和一個你要使用的校驗對象.該辦法會返回一個ConstraintViolationList對象,它扮演的只是一個錯誤信息數(shù)組的角色.集合中的每一個錯誤是一個ConstraintViolation對象,使用對象的getMessage辦法可以獲取錯誤信息.
PHP應(yīng)用總結(jié):
PHP應(yīng)用Symfony2 的validator是一個強(qiáng)大的工具,它可以被用來保證任何對象數(shù)據(jù)的合法性.它的強(qiáng)大來源于約束規(guī)則,你可以把它們應(yīng)用于你對象的屬性和getter辦法.其實,你大多數(shù)情況下都是在使用表單時,間接的應(yīng)用了校驗框架,記住它可以被應(yīng)用于任何地方校驗任何對象.
PHP應(yīng)用希望本文所述對大家的Symfony框架程序設(shè)計有所贊助.
歡迎參與《PHP實戰(zhàn):Symfony數(shù)據(jù)校驗方法實例分析》討論,分享您的想法,維易PHP學(xué)院為您提供專業(yè)教程。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/12526.html