[PHP] - Laravel - 列表、新增、修改、刪除例子

前言

Laravel默認是自帶了CURD的功能,使用路由的Route::resource能夠作到。php

但真正的項目中,這每每不是咱們所須要的。由於一個項目會有比較複雜的計算、驗證等功能。app

下面是對項目中的列表、新增、修改、刪除寫了一個簡單的view層的模型例子函數


 

 

1、路由配置

在app\Http\routes.php加入以下:post

Route::group(["prefix" => "my2"], function() {
   Route::controller("/", "my\MyTest2Controller");
});

 

2、控制器基類

在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() {
    }
}

?>

 

3、視圖模型

視圖模型基類

在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

 

4、控制器

在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]);
        }
    }
}

?>

 

5、視圖

在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>

 

運行效果

列表頁

 

新增頁

 

保存驗證頁

相關文章
相關標籤/搜索