Laravel默認是自帶了CURD的功能,使用路由的Route::resource能夠作到。php
但真正的項目中,這每每不是咱們所須要的。由於一個項目會有比較複雜的計算、驗證等功能。app
下面是對項目中的列表、新增、修改、刪除寫了一個簡單的view層的模型例子函數
在app\Http\routes.php加入以下:post
Route::group(["prefix" => "my2"], function() { Route::controller("/", "my\MyTest2Controller"); });
在app\Http\Controllers目錄下新建一php類文件:BaseController.phpui
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; class BaseController extends Controller { public function __construct() { $this->beforeFilter(function() { $this->before(); }); } protected function before() { } } ?>
在app\models目錄下新增php類文件:BaseModel.php (Laravel 5好像默認沒有這個目錄,須要自已新建)this
<?php namespace App\models; use Validator; /** * Model基類 * @author Robin * */ abstract class BaseModel { /** * 驗證類 * @var Validator */ private $_validator; /** * 錯誤驗證信息 * @var Array */ protected $messages = [ "integer" => "應爲整型值", "required" => "必填字段", "confirmed" => "密碼兩次輸入不一致", "email" => "郵件地址格式不正確", "date" => "日期格式不正確", "between" => "值區間爲:min 到 :max", "min" => "最小值爲:min", "max" => "最大值爲:max", "in" => "值應爲:values", "size" => "大小爲:size", ]; /** * 加載函數 * @param Input $input * @param Rule $rule */ protected function init($input, $rule = array()) { $this->_validator = Validator::make($input, $rule, $this->messages); $formKey = array_keys(get_class_vars(get_class($this))); // 遍歷表單鍵值 並賦予類成員 foreach ($formKey as $value) { if(isset($input[$value])) { $this->$value = $input[$value]; } } } /** * 取得驗證器 */ public function validator() { return $$this->_validator; } /** * 判斷是否驗證成功 * @return boolean */ public function isValid() { return !$this->_validator->fails(); } /** * 取得驗證錯誤信息 */ public function messages() { return $this->_validator->messages(); } } ?>
在app\models目錄下新建my2目錄,在my2目錄下新建php類:MyUser.phpurl
<?php namespace App\models\my2; use App\models\BaseModel; class MyUser extends BaseModel { public $id; public $name; public $email; public $age; public $birthday; public $password; public $password_confirmation; public $homepage; public function __construct() { } public function convert($input) { //----------------------------------------------------- // 字段驗證 //----------------------------------------------------- $rule = array( "name" => "required|min:4|max:10", "email" => "required|email", "age" => "required|integer|between:1,100", "birthday" => "required|date", "password" => "required|between:6,12|confirmed", "password_confirmation" => "required", "homepage" => "required|regex:/^http:\/\/.+/", ); //----------------------------------------------------- // 加入自定義驗證錯誤信息 //----------------------------------------------------- $selfMessages = [ "homepage.regex" => "主頁地址不正確", "name.min" => "最小:min個字符", "name.max" => "最多:max個字符", ]; $this->messages = array_merge($this->messages, $selfMessages); //----------------------------------------------------- // 調用父類方法 //----------------------------------------------------- $this->init($input, $rule); } } ?>
因爲Laravel是沒有直接對用戶提交的數據映射成model的功能,因此寫了一個模型基類作這個事。固然,這個基類也包括了對模型的數據驗證。spa
在app\Http\Controllers目錄下新建目錄my2,在my2目錄下新建php類文件:MyTest2Controller.phpcode
<?php namespace App\Http\Controllers\my; use App\models\my2\MyUser; use App\Http\Controllers\BaseController; use Redirect; use Route; use View; use Input; use Request; use URL; use Session; use Response; class MyTest2Controller extends BaseController { /** * 設置路徑 */ private $path; function __construct() { $this->path = [ "add" => URL::action("my\MyTest2Controller@getAdd"), "edit" => URL::action("my\MyTest2Controller@getEdit"), ]; } public function getIndex() { $data = array( ["id" => 1, "name" => "robin"], ["id" => 2, "name" => "zhang"] ); // 取得當前路由名稱,如在路由中沒有指定名稱,返回空 //$route = Route::currentRouteName(); // 取得當前請求地址 //$route = Request::url(); // 取得當前請求路徑 // $path = Request::path(); // 取得指定方法的Action // $action = action('my\MyTest2Controller@getAdd'); // 取得指定方法的URL // $url = URL::action('my\MyTest2Controller@getEdit'); return View::make("my.MyList", ["data" => $data, "path" => $this->path]); } public function getEdit($id) { $myUser = new MyUser(); $myUser->id = $id; return View::make("my.MyEdit", ["user" => $myUser, "path" => $this->path]); } public function postEdit($id) { return $this->save($id); } public function getAdd() { return View::make("my.MyEdit", ["user" => new MyUser(), "path" => $this->path]); } public function postAdd() { return $this->save(0); } private function save($id) { $myUser = new MyUser(); $myUser->id = $id; // ----------------------------------------------- // 將輸入值轉換爲對象 // ----------------------------------------------- $myUser->convert(Input::All()); // ----------------------------------------------- // 驗證輸入 // ----------------------------------------------- if($myUser->isValid()) { if($myUser->id == 0) { // TODO: // 新增 } else { // TODO: // 更新 } // 成功後重定向 //return redirect()->to("/my2"); return redirect()->action("my\MyTest2Controller@getIndex"); } else { // 輸入驗證錯誤,返回view return View::make("my.MyEdit", ["user" => $myUser, "messages" => $myUser->messages(), "path" => $this->path]); } } } ?>
在resources\views\目錄下新建my目錄,新建php文件:MyList.blade.phporm
<h1>List page:</h1> <?php foreach ($data as $item) { echo($item["name"]); } ?> <br/> <a href="{{$path['add']}}">Add user</a> <br/> @foreach($data as $item) <p>ID={{$item["id"]}}, Name={{$item["name"]}}, <a href="{{$path['edit']}}/{{$item["id"]}}">edit</a></p> @endforeach
一樣,新建php文件:MyEdit.blade.php
<?php ?> @if (isset($messages)) <p>輸入錯誤:</p> <ul> @foreach($messages->all() as $item) <li style="color: red;">{{$item}}</li> @endforeach </ul> <hr/> @endif <form name="myform" action="{{$user->id>0 ? $path['edit'].'/'.$user->id : $path['add']}}" method="post"> User name:<input name="name" type="text" value="{{$user->name}}" />{!!isset($messages) ? $messages->first('name', '<span style="color:red;">:message</span>') : ""!!}<br/> Email:<input name="email" type="text" value="{{$user->email}}" />{!!isset($messages) ? $messages->first('email', '<span style="color:red;">:message</span>') : ""!!}<br/> Age:<input name="age" type="text" value="{{$user->age}}" />{!!isset($messages) ? $messages->first('age', '<span style="color:red;">:message</span>') : ""!!}<br/> Birthday:<input name="birthday" type="text" value="{{$user->birthday}}" />{!!isset($messages) ? $messages->first('birthday', '<span style="color:red;">:message</span>') : ""!!}<br/> Password:<input name="password" type="password" value="{{$user->password}}" />{!!isset($messages) ? $messages->first('password', '<span style="color:red;">:message</span>') : ""!!}<br/> Confirm Password:<input name="password_confirmation" type="password" value="{{$user->password_confirmation}}" /> {!!isset($messages) ? $messages->first('password_confirmation', '<span style="color:red;">:message</span>') : ""!!}<br/> Home page:<input name="homepage" type="text" value="{{$user->homepage}}" />{!!isset($messages) ? $messages->first('homepage', '<span style="color:red;">:message</span>') : ""!!}<br/> <input type="submit" value="save" /> </form>