[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\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.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>
运行效果
列表页
新增页
保存验证页
[PHP] - Laravel - 列表、新增、修改、删除例子的更多相关文章
- Oracle忘记用户名和密码以及管理员用户新增修改删除用户
Oracle忘记密码: 1.以管理员身份登录,打开dos窗口,输入 sqlplus / as sysdba 回车 2.查看当前用户和状态 select username, account_status ...
- MYSQL基础01(新增,修改,删除)
首先说明一下,本人之前一直都是用MSSQL,由于工作原因,每天写上百条sql语句,并持续了几年;由于换了工作目前主要接触的MYSQL;所以现在开始学习MYSQL. 我的学习计划很简单,我在MSSQL使 ...
- Java代码操作properties文件(读取,新增/修改,删除)
项目中需要用到操作properties文件中的数据,记录一下 package com.bonc.savepic.save; import java.io.FileNotFoundException; ...
- BizTalk 新增/修改/删除 XmlDocument 名字空间的高效方法
新增一个名字空间 public class AddXmlNamespaceStream : XmlTranslatorStream { private String namespace_; priva ...
- spring-data-jpa 新增 修改 删除 查询 分页
1.查询所有数据 findAll() 2.分页查询 findAll(new PageRequest(0, 2)) 3.根据id查询 findOne() 4.根据实体类属性查询: findByPro ...
- sql 新增 修改 删除 列操作
IF COL_LENGTH('SYS_Department', 'CreatedBy') IS NOT NULL --判断 SYS_Department 中是否存在 CreatedBy 字段 EXEC ...
- oracle 数据库更新 新增 修改 删除
数据增加 INSERT INTO 表名称 [(字段,字段,...)] VALUES (值,值,...) ; 考虑到日后代码的可维护性,一定要使用完整的语法进行数据的增加. 数据修改 UPDATE 表名 ...
- .net操作xml文件(新增.修改,删除,读取) 转
今天有个需求需要操作xml节点.突然见遗忘了许多.上网看了些资料.才整出来.脑袋真不够用.在这里把我找到的资料共享一下.方便以后使用.本文属于网摘/ 1 一.简单介绍2 using System.Xm ...
- SQL中插入单引号,新增修改删除
1.插入单引号如果不转化的话,字符串插入到数据库中错误的,只要在字符串中有单引号的地方在加一个单引号即可. 例如:在数据库插入'井下设备' : insert into Static_Bel ...
- windows新增/修改/删除系统环境变量bat示例,一键配置JAVA_HOME
setx JAVA_HOME "C:\Program Files\java\jdk1.6.0_27" /m setx classpath = ".;%JAVA_HOME% ...
随机推荐
- Java并发编程学习笔记(三)——对象的组合
重要概念: 1.在设计线程安全类的过程中,需要包含以下三个基本要素: (1)找出构成对象状态的所有变量. (2)找出约束状态变量的不变性条件. (3)建立对象状态的并发访问管理策略. 2.
- Oracle设置自动递增的方法
1)创建序列: create sequence SEQ_TEST --字段名 minvalue 1 --最小值 maxvalue XXXXX --设置最大值 start wit ...
- Win8 安装 Scrapy
安装Python2.7.11 32位(自带pip) 使用如下命令更新pip python -m pip install -U pip 下载lxml,建议32位,直接安装 https://pypi.py ...
- Codeforces
Codeforces 7E #include <iostream> #include <cstring> #include <cstdio> #include &l ...
- HDU5402 暴力模拟
因为题目中没有说是否是正整数,导致我们以为是DP,没敢做...太可惜了,不过现场赛绝对不会出现这种情况,毕竟所有的提问是都可以看见的. 题意:告诉一个矩阵,然后求从(1,1)到(n,m)能走过的最大和 ...
- 《制造杀人犯/Making A Murder》中的疑点和感想
快马加鞭,一天之内看完了完整的10集,很震撼,在案件还存在诸多疑点的情况下.在还有如此多的细节无法确定的情况下,最后由12人组成的陪审团一致通过S.A的谋杀罪成立,尽管初次投票时有7票反对. ...
- 基于vue2.0的分页组件开发
今天安排的任务是写基于vue2.0的分页组件,好吧,我一开始是觉得超级简单的,但是越写越写不出来,写的最后乱七八糟的都不知道下句该写什么了,所以重新捋了思路,小结一下- 首先写组件需要考虑: 要从父组 ...
- MySQL - MySQL++在c++11环境下接口设计
安装官方提供的mysqlconnect后,可以使用mysql++库,在官方的C API上再次做一个c++面向对象封装. 这里mysql++的安装依赖于mysql-connector-c.安装参考:ht ...
- DELL vostro V5460 装mSATA 半高SSD硬盘后装win8.1系统
1.介绍 DELL vostro V5460的超极本性能虽然不是那么好,但的确是我觉得样子最好看的一款.满足了,轻,薄.如果是红色的,则很适合女生用. 2.缺点 这款笔记本最大的缺点,就是有的无线网卡 ...
- Echarts 动态折线图
<script src="http://echarts.baidu.com/build/dist/echarts-all.js"></script>< ...