{"id":2532,"date":"2015-06-25T22:07:19","date_gmt":"2015-06-25T14:07:19","guid":{"rendered":"http:\/\/blog.turn.tw\/?p=2532"},"modified":"2015-06-25T22:07:19","modified_gmt":"2015-06-25T14:07:19","slug":"%e8%83%96%e8%83%96-model-%e7%9a%84%e6%b8%9b%e9%87%8d%e6%96%b9%e6%b3%95%ef%bc%9aform","status":"publish","type":"post","link":"https:\/\/blog.turn.tw\/?p=2532","title":{"rendered":"\u80d6\u80d6 Model \u7684\u6e1b\u91cd\u65b9\u6cd5\uff1aForm"},"content":{"rendered":"<p>Web application\u5e38\u5e38\u9700\u8981\u5c0d\u4f7f\u7528\u8005\u8f38\u5165\u7684\u53c3\u6578\u505a\u9a57\u8b49\u3002<\/p>\n<p>\u9019\u4e9b\u9a57\u8b49\uff08validation\uff09logic\u8a72\u653e\u54ea\u88e1\u5462\uff1f<\/p>\n<p>\u73fe\u4ee3\u6846\u67b6\u901a\u5e38\u6703\u63d0\u4f9b\u5de5\u5177\u5354\u52a9\u9019\u4ef6\u4e8b\uff0c<\/p>\n<p>\u4ee5Laravel\u4f86\u8aaa\uff0c\u4f7f\u7528\u5167\u5efa\u7684Validator\u53ef\u4ee5\u5728controller\u5167\u9019\u9ebc\u505a\uff1a<\/p>\n<pre>\r\n$validation = Validator::make(\r\n    array(\r\n        'name' => Input::get( 'name' ),\r\n        'email' => Input::get( 'email' ),\r\n    ),\r\n    array(\r\n        'name' => array( 'required', 'alpha_dash' ),\r\n        'email' => array( 'required', 'email' ),\r\n    )\r\n);\r\n \r\nif ( $validation->fails() ) {\r\n    $errors = $validation->messages();\r\n}\r\n<\/pre>\n<p>\u540c\u6a23\u7684validation logic\u53ea\u51fa\u73fe\u4e00\u6b21\u9084\u597d\uff0c\u51fa\u73fe\u5728\u4e0d\u540ccontroller\u5c31\u6703\u5c0e\u81f4\u9019\u6bb5code duplicate\u3002<\/p>\n<p>\u8a72\u600e\u9ebc\u8fa6\u5462\uff1f<\/p>\n<p>\u8a66\u8a66\u770b\u653e\u9032model\uff1a<\/p>\n<pre>\r\nclass Ball extends Eloquent\r\n{\r\n    private $rules = array(\r\n        'color' => 'required|alpha|min:3',\r\n        'size'  => 'required',\r\n        \/\/ .. more rules here ..\r\n    );\r\n\r\n    public function validate($data)\r\n    {\r\n        \/\/ make a new validator object\r\n        $v = Validator::make($data, $this->rules);\r\n        \/\/ return the result\r\n        return $v->passes();\r\n    }\r\n}\r\n<\/pre>\n<p>controller\u5167\u7684code\u5c31\u6703\u7c21\u5316\u6210\u9019\u6a23\uff1a<\/p>\n<pre>\r\n$b = new Ball();\r\n\r\nif ($b->validate(Input::all())){\r\n    \/\/ success code\r\n}else{\r\n    \/\/ failure code\r\n}\r\n<\/pre>\n<p>\u9084\u7b97OK\u7684\u4f5c\u6cd5&#8230;\u5982\u679c\u4f60\u80fd\u63a5\u53d7\u5c07validation logic\u8996\u70babusiness logic\u7684\u8a71\u3002<\/p>\n<p>\u9019\u985e\u7684code\u6709\u6bd4controller\u548cmodel\u66f4\u9069\u5408\u7684\u5730\u65b9\u3002\u5beb\u4e00\u500bform class\u5373\u53ef\uff1a<\/p>\n<pre>\r\nclass ArticleForm\r\n{\r\n    protected $validationRules = [\r\n        'title' => 'required',\r\n        'content' => 'required',\r\n    ];\r\n    protected $inputData;\r\n    protected $validator;\r\n\r\n    public function __construct($input)\r\n    {\r\n        $this->inputData = $input;\r\n    }\r\n\r\n    public function isValid()\r\n    {\r\n        $this->validator = Validator::make($this->input, $this->validationRules);\r\n        return $this->validator->passes();\r\n    }\r\n    \r\n    public function getErrors()\r\n    {\r\n        return $this->validator->errors();\r\n    }\r\n\r\n}\r\n<\/pre>\n<p>controller\u5167\u76f4\u63a5\u547c\u53eb\u5373\u53ef\uff0c\u770b\u8d77\u4f86readable\u8a31\u591a\uff1a<\/p>\n<pre>\r\n$form = new ArticleForm( Input::all() );\r\n \r\nif ( ! $form->isValid() ){\r\n    return Redirect::back()->with( [ 'errors' => $form->getErrors() ] );    \r\n}\r\n \r\n$article = new Article( Input::only('title', 'content', 'status') );\r\n \r\n$article->save();\r\n<\/pre>\n<p>\u5982\u679c\u591a\u500bmodel\u90fd\u6709form classs\u7684\u8a71\uff0c\u53ef\u4ee5\u5c07\u5171\u7528\u7684code\u62bd\u51fa\u4f86\u6210\u70ba\u62bd\u8c61\u985e\u5225\uff1a<\/p>\n<pre>\r\nabstract class FormModel\r\n{\r\n    protected $validationRules;\r\n    protected $inputData;\r\n    protected $validator;\r\n\r\n    public function __construct($input)\r\n    {\r\n        $this->inputData = $input;\r\n    }\r\n\r\n    public function isValid()\r\n    {\r\n        $this->validator = Validator::make($this->input, $this->validationRules);\r\n        return $this->validator->passes();\r\n    }\r\n    \r\n    public function getErrors()\r\n    {\r\n        return $this->validator->errors();\r\n    }\r\n\r\n}\r\n<\/pre>\n<p>\u9019\u6a23\u539f\u672c\u7684form class\u53ef\u4ee5\u7c21\u5316\u5230\u53ea\u5269\u4e0bvalidation rules\uff1a<\/p>\n<pre>\r\nclass ArticleForm extends FormModel\r\n{\r\n    protected $validationRules = [\r\n        'title' => 'required',\r\n        'content' => 'required',\r\n    ];\r\n}\r\n<\/pre>\n<p>\u751a\u81f3\u80fd\u5beb\u591a\u7a2evalidation rules\u7d66\u4e0d\u540ccontroller\uff1a<\/p>\n<pre>\r\n   protected $happyArticleValidationRules;\r\n    protected $angryArticleValidationRules;\r\n    protected $funnyArticleValidationRules;\r\n\r\n    public function isValidHappy()\r\n    {\r\n        $this->validator = Validator::make($this->input, $this->happyArticleValidationRules);\r\n        return $this->validator->passes();\r\n    }\r\n    \r\n    public function isValidAngry()\r\n    {\r\n        $this->validator = Validator::make($this->input, $this->angryArticleValidationRules);\r\n        return $this->validator->passes();\r\n    } \r\n   \r\n    public function isValidFunny()\r\n    {\r\n        $this->validator = Validator::make($this->input, $this->funnyArticleValidationRules);\r\n        return $this->validator->passes();\r\n    }\r\n<\/pre>\n<p>\u5be6\u4f5c\u4e0a\u53ef\u4ee5\u53c3\u8003<a href=\"https:\/\/github.com\/LaravelIO\/laravel.io\/blob\/master\/src\/Core\/FormModel.php\">Laravel\u5b98\u65b9\u8ad6\u58c7\u539f\u59cb\u78bc<\/a>\u3002<\/p>\n<p>\uff08\u6ce8\u610f\uff1a\u82e5\u60a8\u662f\u7528Laravel 5\uff0c<a href=\"http:\/\/laravel.com\/docs\/master\/validation#form-request-validation\">Request\u7684\u5c01\u88dd<\/a>\u53ef\u4ee5\u53d6\u4ee3\u9019\u4ef6\u4e8b\u3002\uff09<\/p>\n<p>\u4e0b\u6b21\u4f60\u7684application\u5305\u542b\u5927\u91cfvalidation logic\u6642\uff0c\u4e0d\u59a8\u8a66\u8a66\u770b\u9019\u500b\u4f5c\u6cd5\u3002<\/p>\n<p>(Photo via <a href=\"https:\/\/www.flickr.com\/photos\/infomastern\/\">Susanne Nilsson<\/a>, CC licensed)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Web application\u5e38\u5e38\u9700\u8981\u5c0d\u4f7f\u7528\u8005\u8f38\u5165\u7684\u53c3\u6578\u505a\u9a57\u8b49\u3002 \u9019\u4e9b\u9a57\u8b49\uff08validation\uff09logic\u8a72 &hellip; <a href=\"https:\/\/blog.turn.tw\/?p=2532\" class=\"more-link\">\u7e7c\u7e8c\u95b1\u8b80 <span class=\"screen-reader-text\">\u80d6\u80d6 Model \u7684\u6e1b\u91cd\u65b9\u6cd5\uff1aForm<\/span> <span class=\"meta-nav\">&rarr;<\/span> <\/a><\/p>\n","protected":false},"author":1,"featured_media":2514,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false},"categories":[2],"tags":[8,14,19],"_links":{"self":[{"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/posts\/2532"}],"collection":[{"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2532"}],"version-history":[{"count":3,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/posts\/2532\/revisions"}],"predecessor-version":[{"id":2536,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/posts\/2532\/revisions\/2536"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/media\/2514"}],"wp:attachment":[{"href":"https:\/\/blog.turn.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2532"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2532"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2532"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}