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

前言

Laravel默认是自带了CURD的功能,使用路由的Route::resource可以做到。

但真正的项目中,这往往不是我们所需要的。因为一个项目会有比较复杂的计算、验证等功能。

下面是对项目中的列表、新增、修改、删除写了一个简单的view层的模型例子


一、路由配置

在app\Http\routes.php加入如下:

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

二、控制器基类

在app\Http\Controllers目录下新建一php类文件:BaseController.php

<?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好像默认没有这个目录,需要自已新建)

<?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.php

<?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的功能,所以写了一个模型基类做这个事。当然,这个基类也包括了对模型的数据验证。

四、控制器

在app\Http\Controllers目录下新建目录my2,在my2目录下新建php类文件:MyTest2Controller.php

<?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\[email protected]"),
            "edit" => URL::action("my\[email protected]"),
        ];
    }

    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\[email protected]‘);
        // 取得指定方法的URL
        // $url = URL::action(‘my\[email protected]‘);

        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\[email protected]");
        }
        else {
            // 输入验证错误,返回view
            return View::make("my.MyEdit", ["user" => $myUser, "messages" => $myUser->messages(), "path" => $this->path]);
        }
    }
}

?>

五、视图

在resources\views\目录下新建my目录,新建php文件:MyList.blade.php

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

运行效果

列表页

新增页

保存验证页

时间: 2024-08-23 22:52:52

[PHP] - Laravel - 列表、新增、修改、删除例子的相关文章

MYSQL基础01(新增,修改,删除)

首先说明一下,本人之前一直都是用MSSQL,由于工作原因,每天写上百条sql语句,并持续了几年;由于换了工作目前主要接触的MYSQL;所以现在开始学习MYSQL. 我的学习计划很简单,我在MSSQL使用或学习到的功能,都会尝试在MYSQL实现,所以如果我都尝试了一遍,我认为MYSQL的使用也学的差不多了,当然工作中遇到的问题和解决经验也会总结下来. 刚开始工作中最首先使用的也是最常用的当然就是增删改查了,所以第一遍就会介绍MYSQL的新增,修改,删除:查询是很大的一块,所以会另外展开 INSER

新增修改删除等方法

//创建datatable DataTable dt = new DataTable("个人简历"); dt.Columns.Add("id", typeof(int)); dt.Columns.Add("name", typeof(string)); dt.Columns.Add("sex", typeof(int)); dt.Columns.Add("address", typeof(string));

git 强制放弃本地修改(新增、删除文件)

放弃本地所有修改.新增.删除文件和目录: git checkout . && git clean -df 注释: git checkout . //放弃本地修改,没有提交的可以回到未修改前版本 git clean //是从工作目录中移除没有track的文件. git clean -df //-d表示同时移除目录,-f表示force,因为在git的配置文件中,clean.requireForce=true,如果不加-f,clean将会拒绝执行. 原文地址:https://www.cnblog

python 从入门到放弃之列表的增加,删除,插入,修改

#列表是什么? 列表是由多个按顺序排列的元素组成的 #在python中用[]来代表一个列表 例如: name_list = [] #这就是创建一个简单的列表 #让我们在列表里面加入一些东西来做为后面列表操作的基础数据 name_list = ['tom','Jim','hanmeimei'] #这样就可以了 #列表索引的介绍 name_list = ['tom','Jim','hanmeimei']  #这个列表里面有三个值 它们分别对应的索引值为 0  1  2 这个是从零开始的(我记住的方法

python3_列表(修改,添加和删除元素操作)

前言:列表的定义:列表是由一系列按特定顺序排列的元素组成.即列表是一个有序集合. 1.修改列表元素 由前言知列表是一个有序集合,因此在修改列表元素时我们需指定列表名和要修改的元素的索引,再指定该元素的新值. 例如,假设有一个人名列表,其中第一个人叫'xiaohong',如何修改他的值呢? names = ['xiaohong', 'Eric', 'Lily'] print(names) names[0] = 'xiaoming' print(names) 上述代码中,我们首先定义了一个人名列表,

Exchange 2013 PowerShell新建&修改&删除邮箱

在我们日常使用Exchange Management Shell最多的应该就是邮箱的管理了.在这一节中,将主要介绍下在Exchange中使用语法命令在组织中创建.更新和删除邮箱. 先来看一个示例: 1.  我们可以使用Exchange Management Shell创建一个启用了邮箱功能的AD账户.语法如下: $password = ConvertTo-SecureString -AsPlainText abc.123 -Force New-Mailbox -UserPrincipalName

【转】C#添加修改删除文件文件夹大全

[转]C#添加修改删除文件文件夹大全 C#添加修改删除文件文件夹大全 StreamWriter sw = File.AppendText(Server.MapPath(".")+"\\myText.txt");sw.WriteLine("追逐理想");sw.WriteLine("kzlll");sw.WriteLine(".NET笔记");sw.Flush();sw.Close();C#拷贝文件string

《html5新增及删除标签》

html5新增及删除标签 原文:http://www.cnblogs.com/starof/archive/2015/06/23/4581850.html 一.新增标签 有一种划分为,功能性标签[html5新增,如canvas,旧浏览器没有]和语义性标签[如header等只是增强语义,没有新功能].下面按照分几个小类来说. 1.结构标签 新增的结构标签,之前都是用div实现的,为了语义化,html5从div派生出很多新的标签.这些新增的结构标签有助于将文档分成几个逻辑部分.如下: a.secti

ElasticSearch.net NEST批量创建修改删除索引完整示例

本示例采用Elasticsearch+Nest 网上查了很多资料,发现用C#调用Elasticsearch搜索引擎的功能代码很分散,功能不完整,多半是非常简单的操作,没有成型的应用示例.比如新增或修改索引,都是发起一个request新增或修改一条数据,当一次性修改几千条数据时,发起的requst请求过多容易导致429 Too Many Request的错误,单个新增修改索引就非常不适用.其实Nest有批量新增.修改索引的功能,批量删除也可以.现将项目中采用Elasticsearch的C#代码分享

跟我一起学extjs5(39--单个模块的设计[7数据的增加修改删除])

跟我一起学extjs5(39--单个模块的设计[7数据的增加修改删除]) 从后台取得数据已经可以了,下面对记录的新增.修改和删除进行前后台的互动改造.首先将新增和修改在行内进行,也就是都是在grid上进行. 在grid上可以编辑行,需要在initComponent中增加一个plugins的修改,将原来cellEditing的删除掉,加入rowEditing: // 可以在grid中进行行编辑的设置 this.rowEditing = new Ext.grid.plugin.RowEditing(