一.静态资源管理及模板布局
分为头部,左边菜单,页脚,右边内容
1.新建一个Controller用来渲染视图,添加对应路由
<?php namespace App\Http\Controllers; class StudentController extends Controller { public function index() { return view('student.index'); } }2.在views目录下创建common文件夹用来存放公用布局。
layoout.blade.php <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>轻松学会Laravel - @yield('title')</title> <!-- Bootstrap CSS 文件 --> <link rel="stylesheet" href="{{ asset('static/bootstrap/css/bootstrap.min.css') }}"> @section('style') @show </head> <body> <!-- 头部 --> @section('header') <div class="jumbotron"> <div class="container"> <h2>轻松学会Laravel</h2> <p> - 玩转Laravel表单</p> </div> </div> @show <!-- 中间内容区局 --> <div class="container"> <div class="row"> <!-- 左侧菜单区域 --> <div class="col-md-3"> @section('leftmenu') <div class="list-group"> <a href="#" class="list-group-item ">学生列表</a> <a href="#" class="list-group-item">新增学生</a> </div> @show </div> <!-- 右侧内容区域 --> <div class="col-md-9"> @yield('content') </div> </div> </div> <!-- 尾部 --> @section('footer') <div class="jumbotron" style="margin:0;"> <div class="container"> <span> @2016 imooc</span> </div> </div> @show <!-- jQuery 文件 --> <script src="{{ asset('static/jquery/jquery.min.js') }}"></script> <!-- Bootstrap JavaScript 文件 --> <script src="{{ asset('static/bootstrap/js/bootstrap.min.js') }}"></script> @section('javascript') @show </body> </html>3. 头部,页脚,左侧菜单都不需要重写,在index模板中继承布局后重写右侧内容区域
index.blade.php @extends('common.layout') @section('content') @include('common.message') <!-- 自定义内容区域 --> <div class="panel panel-default"> <div class="panel-heading">学生列表</div> <table class="table table-striped table-hover table-responsive"> <thead> <tr> <th>ID</th> <th>姓名</th> <th>年龄</th> <th>性别</th> <th>添加时间</th> <th width="120">操作</th> </tr> </thead> </table> </div> <!-- 分页 --> <div> <div class="pull-right"> </div> </div> @stop
二.表单列表及分页实现
1.新建对应model
Student.php <?php namespace App; use Illuminate\Database\Eloquent\Model; class Student extends Model { protected $table = 'student'; public $timestamps = false; protected function getDateFormat(){ return time(); } protected function asDateTime($value) { return $value; } }2.在控制器中通过ORM方式获取数据库中的数据,并发送到视图
//学生列表页 public function index() { //使用ORM的方式获取数据 //$students = Student::get(); //获取数据并在属兔中通过render()函数实现分页 $students = Student::paginate(2); return view('student.index',[ 'students'=>$students ]); }
3.在视图中获取控制器传来的数据,并实现分页
<tbody> @foreach($students as $student) <tr> <th scope="row">{{ $student->id }}</th> <td>{{$student->name}}</td> <td>{{$student->age}}</td> <td>{{$student->sex}}</td> <td>{{$student->create_at}}</td> <td> <a href="#">详情</a> <a href="#">修改</a> <a href="#">删除</a> </td> </tr> @endforeach </tbody>
<!-- 分页 --> <div> <div class="pull-right"> {{$students->render()}} </div> </div>
三.通过表单实现新增及操作状态提示功能
1.在控制器中添加方法显示新增页面,添加相应路由。
//添加数据页面 public function create() { return view('student.create'); }
Route::any('student/create',['uses'=>'StudentController@create']);2.在student文件夹下创建“新增模板”。并在layout模板中设定跳转页面路由
<!-- 左侧菜单区域 --> <div class="col-md-3"> @section('leftmenu') <div class="list-group"> <a href="{{url('student/index')}}" class="list-group-item {{--默认选中--}} {{ Request::getPathInfo()=='/student/index'?'active':''}} ">学生列表</a> <a href="{{url('student/create')}}" class="list-group-item {{ Request::getPathInfo()=='/student/create'?'active':''}} ">新增学生</a> </div> @show </div>3.用Student[]数组储存输入的数据,提交表单后跳转到保存方法,添加路由与相应方法
<div class="form-group"> <label for="name" class="col-sm-2 control-label">姓名</label> <div class="col-sm-5"> <input type="text" class="form-control" id="name" name="Student[name]" placeholder="请输入学生姓名"> </div> <div class="col-sm-5"> <p class="form-control-static text-danger">姓名不能为空</p> </div> </div>
<form class="form-horizontal" method="post" action="{{url('student/save')}}">
Laravel框架为了防止跨域请求攻击(CSRF)而为用户生成的随机令牌。post请求如果没有验证token,就会报错。
在表单中添加一行代码:
<input type="hidden" name="_token" value="{{csrf_token()}}">添加路由与方法:
Route::any('student/save',['uses'=>'StudentController@save']);
//保存添加 public function save(Request $request) { //将在create.blade.php中Student[]中的数据全都获取 $data = $request->input('Student'); //获取模型 $student = new Student(); //给模型赋值 $student->name = $data['name']; $student->age = $data['age']; $student->sex = $data['sex']; //保存值 if($student->save()) { return redirect('student/index'); }else{ return redirect()->back(); } }
这样就实现了添加数据功能。
实现操作提示:
在保存数据时增加一个with()方法
//保存值 if($student->save()) { return redirect('student/index')->with("success","添加成功"); }else{ return redirect()->back(); }讲路由放入session中:
Route::group(['middleware'=>['web']],function (){ Route::get('student/index',['uses'=>'StudentController@index']); Route::any('student/create',['uses'=>'StudentController@create']); Route::any('student/save',['uses'=>'StudentController@save']); });在message.blade.php中获取并显示提示信息
<!-- 成功提示框 --> @if(Session::has('success')) <div class="alert alert-success alert-dismissible" role="alert"> <button type="button" class="close" data-dismiss="alert" aria-label="Close"> <span aria-hidden="true">×</span> </button> <strong>成功!</strong>{{Session::get('success')}} </div> @endif
四.表单验证及数据保持
1.控制器验证
//控制器验证 $this->validate($request, [ 'Student.name' => 'required|min:2|max:20', 'Student.age' => 'required|integer', 'Student.sex' => 'required|integer', ], [ 'required' => ':attribute 为必填项', 'min' => ':attribute 长度不符合要求', 'integer' => ':attribute 必须为整数', ], [ 'Student.name' => '姓名', 'Student.age' => '年龄', 'Student.sex' => '性别', ]);新建validator模板
@if(count($errors)) <div class="alert alert-danger"> <ul> <li>{{$errors->first()}}</li> </ul> </div> <div class="alert alert-danger"> <ul> @foreach($errors->all() as $error) <li>{{$error}}</li> @endforeach </ul> </div> @endif在create模板中引入
@include('common.validator')2.validator类验证
//Validator类验证 $validator = \Validator::make($request->input(),[ 'Student.name' => 'required|min:2|max:20', 'Student.age' => 'required|integer', 'Student.sex' => 'required|integer', ], [ 'required' => ':attribute 为必填项', 'min' => ':attribute 长度不符合要求', 'integer' => ':attribute 必须为整数', ], [ 'Student.name' => '姓名', 'Student.age' => '年龄', 'Student.sex' => '性别', ]); if($validator->fails()){ //需要手动注册错误信息 //withInput()方法保持数据 return redirect()->back()->withErrors($validator)->withInput(); }在表单中显示错误信息以及保持数据
<div class="form-group"> <label for="name" class="col-sm-2 control-label">姓名</label> <div class="col-sm-5"> <input type="text" class="form-control" id="name" value="{{old('Student')['name']}}" name="Student[name]" placeholder="请输入学生姓名"> </div> <div class="col-sm-5"> <p class="form-control-static text-danger">{{$errors->first('Student.name')}}</p> </div> </div>
五.通过模型处理性别
重写模型
Student.php文件 //定义对应性别常量 const SEX_UN = 10; const SEX_BOY= 20; const SEX_GRIL= 30; public function sex($ind=null) { $arr=[ self::SEX_UN=>"未知", self::SEX_BOY=>"男", self::SEX_GRIL=>"女" ]; if($ind!==null){ return array_key_exists($ind,$arr)?$arr[$ind]:$arr[self::SEX_UN]; } return $arr; }index.blade.php文件显示性别
<th scope="row">{{ $student->id }}</th> <td>{{$student->name}}</td> <td>{{$student->age}}</td> <td>{{$student->sex($student->sex)}}</td> <td>{{$student->create_at}}</td>在控制器中的create方法中new一个Student对象
public function create() { $student=new Student(); return view('student.create',[ 'student'=>$student ]); }create.blade.php文件选择性别
<label class="col-sm-2 control-label">性别</label> <div class="col-sm-5"> @foreach($student->sex() as $ind=>$val) <label class="radio-inline"> <input type="radio" name="Student[sex]" value="{{$ind}}"> {{$val}} </label> @endforeach </div>
六.通过表单修改数据
1.在index页面添加链接
<a href="{{url('student/update',['id'=>$student->id])}}">修改</a>2.添加路由和方法
Route::any('student/update/{id}',['uses'=>'StudentController@update']);
public function update(Request $request,$id) { $student =Student::find($id); if($request->isMethod('POST')){ $data=$request->input('Student'); $student->name=$data['name']; $student->age=$data['age']; $student->sex=$data['sex']; if($student->save()) { return redirect('student/index')->with('success','修改成功-'.$id); } } return view('student.update',[ 'student'=>$student ]); }
3.因为内容与添加数据的表单相同,所以将表单内容抽取为_form,添加视图。
@extends('common.layout') @section('content') @include('common.validator') <!-- 自定义内容区域 --> <div class="panel panel-default"> <div class="panel-heading">修改学生</div> <div class="panel-body"> <form class="form-horizontal" method="post" action=""> @include('student._form') </div> </div> @stop()
七.查看详情及删除数据
1.修改查询连接,并创建对应路由,方法,模板视图
<a href="{{url('student/detail',['id'=>$student->id])}}">详情</a>
Route::any('student/detail/{id}',['uses'=>'StudentController@detail']);
//数据详情 public function detail($id) { $student = Student::find($id); return view('student.detail',[ 'student'=>$student ]); }
@extends('common.layout') @section('content') <!-- 自定义内容区域 --> <div class="panel panel-default"> <div class="panel-heading">学生详情</div> <table class="table table-bordered table-striped table-hover "> <tbody> <tr> <td width="50%">ID</td> <td>{{$student->id}}</td> </tr> <tr> <td>姓名</td> <td>{{$student->name}}</td> </tr> <tr> <td>年龄</td> <td>{{$student->age}}</td> </tr> <tr> <td>性别</td> <td>{{$student->getSex($student->sex)}}</td> </tr> <tr> <td>添加日期</td> <td>{{$student->created_at}}</td> </tr> <tr> <td>最后修改</td> <td>{{$student->updated_at}}</td> </tr> </tbody> </table> </div> @stop2.修该删除连接,并添加方法与路由。危险操作需要加提示
<a href="{{url('student/delete',['id'=>$student->id])}}" οnclick="if(confirm('确定删除吗?')==false) return false;">删除</a>
Route::any('student/delete/{id}',['uses'=>'StudentController@delete']);
//删除数据 public function delete($id) { $student=Student::find($id); if($student->delete()) { return redirect('student/index')->with('success','删除成功-'.$id); } else{ return redirect('student/index')->with('error','删除失败-'.$id); } }
这样就完成了一个完整的Demo.