美文网首页
Laravel 学习笔记 - 表单篇

Laravel 学习笔记 - 表单篇

作者: 陈小陌丿 | 来源:发表于2017-02-08 09:39 被阅读0次

Controller

Controller 之 Rquest

  • Larvel中的请求使用的是symfony/http-foundation组件
  • use Illuminate\Http\Request;
  • 请求里面存放了 $_GET $_POST $_COOKIE $_FILES $_SERVER等数据

获取请求中的值

判断请求类型

/**
     * 获取请求
     * @return [type] [description]
     */
    public function request1(Request $request){

        /*
            // 取值 
            echo $request->input('name');
            // http://laravel.study.com/request1?name=zhangsan  
            // echo zhangsan

            // 设置一个默认值
            echo $request->input('sex', '未知');
            // http://laravel.study.com/request1?sex=1  
            // echo 1
            // 
            // http://laravel.study.com/request1
            // echo 未知
        */


        /*
            // 判断是否存在该参数
            if ($request->has('name')) {
                echo $request->input('name');
            } else {
                echo "无参数";
            }
        */
        
        /* 
            // 取url 所有的参数
            $res = $request->all();
            dd($res);
            // http://laravel.study.com/request1?aa=bb&cc=dd
            // array:2 [▼
            //   "aa" => "bb"
            //   "cc" => "dd"
            // ]
        */
        


        // 获取请求类型
        // echo $request->method();

        // 判断请求类型是否是预设的类型
        // echo $request->isMethod('GET') ? 'get' : '未知';

        // 判断是否是ajax
        // echo $request->ajax();


        // 判断地址格式 是否符合 设定的标准
        // $res = $request->is('student/*');
        // var_dump($res);
        // // bool(false) 

        // 获取当前的url
        // echo $request->url();
        // // http://laravel.study.com/request1

    }

Controller 之 session

  • 默认使用的是 "file" 的session 驱动
  • session 的配置文件 配置在config/session.php 中

laravel中使用的session有三种方式

  • HTTP request 类session() 方法
  • session() 辅助函数
  • Session facade 类 --- 需要引入 use Illuminate\Support\Facades\Session;
    /**
     * 学习 处理 session  主要设置session
     * @return [type] [description]
     */
    public function session1(Request $request)
    {
        // 1、 HTTP request session();
        // 设置 session 值
        // $request->session()->put('key1', 'value1');

        // 2、 session()
        // 设置 session 值
        // session()->put('key2', 'value2');
        

        // 4、 使用Session 类
        // 需要引入  use Illuminate\Support\Facades\Session;
        // 设置 session 值
        // Session::put('key3', 'value3');
        
        // 5、 设置一个数组
        // Session::put(['key4'=>'value4']);


        // 6、 往session 中的元素 填入数组
        // Session::push('student', 'test');
        // Session::push('student', 'imooc');
        // 
        

        // 7、 取出数据并删除
        // $res = Session::pull('student', 'default');
        // var_dump($res);


        // 8、  取出所有session 的值
        // $res = Session::all();
        // dd($res);
        

        // 9、 判断session 值是否存在
        // if (Session::has('key11')) {
        //  $res = Session::all();
        //  dd($res);
        // } else {
        //  echo 'session key11 不存在!';
        // }


        // 10、 删除指定key

        // // 删除操作
        // Session::forget('key3');

        // $res = Session::all();
        // dd($res);



        // 11、 清空session
        // Session::flush();

        // $res = Session::all();
        // dd($res);
        
        // 12、 暂存数据 即:第一次访问存在  第二次访问就被删除
        Session::flash('flash-key', 'flash-value');
    }

    /**
     * 主要获取SESSION
     * @param  Request $request [description]
     * @return [type]           [description]
     */
    public function session2(Request $request)
    {   
        // 1、 HTTP request session()  获取值 
        // echo $request->session()->get('key1');
        
        // 2、 session() 获取值 
        // echo session()->get('key2');
        
        // 3、 使用 Session 类
        // echo Session::get('key3');

        // 设置默认值
        // echo Session::get('key4', 'default');
        

        // 5、 获取刚才用数组存入的key4的值
        // echo Session::get('key4', 'default');
        

        // 6、 获取元素值
        // $res = Session::get('student');
        // dd($res);
        // array:2 [▼
        //   0 => "test"
        //   1 => "imooc"
        // ]
        // 
        

        // 12、 暂存数据 即:第一次访问存在  第二次访问就被删除
        $res =  Session::get('flash-key');
        dd($res);
    }

Controller 之 Response

字符串

reutrn 'aa';

视图

return view('welcome');

json

response()->json($data);

重定向

// 根据控制器和方法名
redirect()->action('StudentController@responseTest');

// 根据别名
redirect()->route('responseTest');

// 返回来源页面
redirect()->back();
    /**
     * response 响应
     * @return [type] [description]
     */
    public function response(){

/*
        // 响应 json 字符串
        $data = array(
            range('a', 'z'),
            'test'=>'test'
        );
        // dump($data);
        return response()->json($data);
*/

        // 重定向
        // return redirect('responseTest');

        // 重定向 带参数(session 方式)
        // return redirect('responseTest')->with('message', '我是快闪数据!');
        

        // action 跳转方法
        // return redirect()->action('StudentController@responseTest')->with('message', '我是快闪数据!');
    
        // route
        // return redirect()->route('responseTest')->with('message', '我是快闪数据!');

        // 返回上一个页面
        // sleep(3);
        // return redirect()->back();
    
    }


    /**
     * 设置重定向后的地址
     */
    public function responseTest(){
        // 重定向 没带参数
        // return '我从response而来。';

        // 重定向 带参数
        // return Session::get('message', '暂无信息');
    
    }
    

Controller 之 Middleware

中间件有什么作用

Laravel 中间件提供一个方便的机制来过滤进入应用程序的 http请求

使用场景

有一个活动,在指定日期开始后,如果活动没开启,只能访问宣传页面

  • 新建中间件
  • 注册中间件
  • 使用中间件
  • 中间件的前置和后置操作

创建逻辑代码

app\Http\Controllers\StudentController.php


    /**
     *  学习使用中间件   活动的宣传页面
     */
    public function activity0()
    {
        return '活动快要开始啦,敬请期待。';
    }


    /**
     * 学习使用中间件  活动开始页面
     */
    public function activity1()
    {
        return '活动进行中,谢谢您的参与1!';
    }

    /**
     * 学习使用中间件  活动开始页面
     */
    public function activity2()
    {
        return '互动进行中,谢谢您的参与2!';
    }

创建路由

app\Http\routes.php

Route::any('activity0', ['uses'=>'StudentController@activity0']);
Route::any('activity1', ['uses'=>'StudentController@activity1']);
Route::any('activity2', ['uses'=>'StudentController@activity2']);

新建中间件

app\Http\Middleware\ 目录是存放中间件的目录
新建 活动中间件 Acivity.php

<?php
namespace app\Http\Middleware;

// 引入 中间件对象的处理方法
use Closure;


/**
 *  活动中间件
 */
class Acivity
{
    
    /**
     * 中间件处理方法 方法名(handle)是固定的
     * @param  [type]  $request 请求对象
     * @param  Closure $next    处理包 
     * @return [type]           [description]
     */
    public function handle($request, Closure $next)
    {

        // 如果时间未到
        if (time() < strtotime('2016-11-20')) { 
        
            // 重定向到活动宣传页面
            return redirect('activity0');
        }


        // 如果时间到了  就继续匹配下面的路由  传入请求数据
        return $next($request);
    }

}

中间件

配置文件地址
app\Http\Kernel.php

如果要 注册一个全局的中间件的话 就新增到 $middleware变量中
如果要新增一个临时的 就新增到 $routeMiddleware变量中

<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array
     */
    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    ];

    /**
     * The application's route middleware groups.
     *
     * @var array
     */
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
        ],

        'api' => [
            'throttle:60,1',
        ],
    ];

    /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        
        // 新增 活动中间件
        'activity' =>  \App\Http\Middleware\Activity::class,
    ];
}

使用中间件

修改路由文件

// 创建活动路由
// Route::any('activity0', ['uses'=>'StudentController@activity0']);
// Route::any('activity1', ['uses'=>'StudentController@activity1']);
// Route::any('activity2', ['uses'=>'StudentController@activity2']);


// 活动开始页面 不需要做限制
Route::any('activity0', ['uses'=>'StudentController@activity0']);

// 使用中间件
Route::group(['middleware'=>['activity']], function(){
    Route::any('activity1', ['uses'=>'StudentController@activity1']);
    Route::any('activity2', ['uses'=>'StudentController@activity2']);
});

中间件的前置操作和后置操作

前置和后置的区别是:
前置在交给下一个路由操作之前就已经 进行逻辑代码处理了
后置在交给下一个路由操作之后再进行逻辑代码的处理

    /**
     * 中间件处理方法 方法名(handle)是固定的
     * @param  [type]  $request 请求对象
     * @param  Closure $next    处理包 中的方法
     * @return [type]           [description]
     */
    

    /* 
    // 请求前置操作
    public function handle($request, Closure $next)
    {

        // 如果时间未到
        // if (time() < strtotime('2016-11-20')) {
        if (time() < strtotime('2016-11-19')) {

            // 重定向到活动宣传页面
            return redirect('activity0');
        }

        // 如果时间到了  就继续匹配下面的路由  传入请求数据
        return $next($request);
    }
    */


    // 请求后置操作
    public function handle($request, Closure $next)
    {
        // 如果时间到了  就继续匹配下面的路由  传入请求数据
        $response =  $next($request);
        var_dump($response);

        // 逻辑代码
        echo '这是后面执行的操作,即后置操作。';
        exit;
    }

Laravel表单案例演示

案例演示

。。。。

静态资源管理及模板布局

asset()

通过该方法引入前端资源文件

<link rel="stylesheet" href="{{ asset('static/bootstrap/css/bootstrap.min.css') }}">

include

通过该方法 引入 分离的组件

表单列表及分页实现

// 通过  paginate(每页多少行)获取数据
$students = Student::paginate(2);


// 在前端使用 foreach 进行遍历 
@foreach($students as $student)
<tr>
    <th scope="row">{{ $student->id }}</th>
    <td>{{ $student->name }}</td>
    <td>{{ $student->age }}</td>
    <td>{{ $student->sex }}</td>
    <td>{{ date('Y-m-d', $student->created_at) }}</td>
    <td>
        <a href="{{ url('student/detail', ['id' => $student->id]) }}">详情</a>
        <a href="{{ url('student/update', ['id' => $student->id]) }}">修改</a>
        <a href="{{ url('student/delete', ['id' => $student->id]) }}"
                onclick="if (confirm('确定要删除吗?') == false) return false;">删除</a>
    </td>
</tr>
@endforeach


// 使用 自带的 render() 方法可以自动生成 分页的HTML 代码
{{ $students->render() }}

通过表达实现新增及操作状态提示功能

使用模型中的create 方法 创建数据

使用 模型对象创建数据

使用【WEB】中间件 默认 开启session 和 表单 令牌

在表单中新增 表单令牌组件

csrf_field()

表单验证及数据保持详解

即 数据保持 提交数据 出错后(逻辑处理) 数据还在input 中

return redirect()->back()->withErrors($validator)->withInput();

控制器验证

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

// 2. 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()) {
    return redirect()->back()->withErrors($validator)->withInput();
}


$data = $request->input('Student');

if (Student::create($data) ) {
    return redirect('student/index')->with('success', '添加成功!');
} else {
    return redirect()->back();
}

数据保持

使用 lod(); 方法 获取上一次请求 接收到的值
<input type="text" name="Student[name]"
                   value="{{ old('Student')['name'] ? old('Student')['name'] : $student->name }}"
                   class="form-control" id="name" placeholder="请输入学生姓名">

通过模型处理性别

模型代码

    // 数字转字符串
    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;
    }

视图使用

<div class="col-sm-5">
    @foreach($student->sex() as $ind=>$val)
        <label class="radio-inline">
            <input type="radio" name="Student[sex]"
                   {{ isset($student->sex) && $student->sex == $ind ? 'checked' : ''  }}
                   value="{{ $ind }}"> {{ $val }}
        </label>
    @endforeach
</div>

通过表单实现修改

表表单中查看详情及删除

laravel 表单课程总结

  • Request
  • Response
  • Session
  • Middleware

相关文章

网友评论

      本文标题:Laravel 学习笔记 - 表单篇

      本文链接:https://www.haomeiwen.com/subject/hslvittx.html