Laravel 一个Dome实例

一.静态资源管理及模板布局

分为头部,左边菜单,页脚,右边内容

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.phpStudent[]中的数据全都获取
    $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">&times;</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>
@stop
2.修该删除连接,并添加方法与路由。危险操作需要加提示
<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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值