Controller

Controller之Request

获取请求的值

namespace App\Http\Controllers;
use Illuminate\http\Request;
public function request(Request $request) {
    echo $request->input('name');
    echo $request->input('name', 'default');
    if($request->has('nikename')){
        ...
    }
    $aRequest = $request->all();
}
// 无需对参数转成实体,因为在输出时候会自动转成实体,并且在插入数据库,laravel 自动实现参数绑定。

判断请求类型

echo $request->method();
if($request->isMethod('GET'){
    ...
}
$flag = $request->ajax();  //判断是否是ajax请求
$flag = $request->is('student/*');  //判断是否是student下的控制器 注意:s必须小写
$request->url();                // 获取当前url

Controller之Session

Route::group(['middleware' => 'web'], function(){       // 开启session
    Route::any('session1', ['uses' => 'StudentController@session1']);
    Route::any('session2', ['uses' => 'StudentController@session2']);
});
// HTTP request 操作方法
public function session1(Request $request) {
    $request->session()->put('key1', 'value1');
}

public function session2(Request $request){
    $request->session()->get('key1');
}
// session() 操作方法
public function session1() {
    session()->put('key1', 'value1');
}

public function session2(){
    session()->get('key1');
}
// Session:: 操作方法 (一个注意点)
public function session1() {
    Session::put('key1', 'value1');    // (注意点)需要 use 一个Session 在 Illuminate Support Facades
    // 还可以 Session::put(['key1' => 'value1']);
}

public function session2){
    Session::get('key1');
    // 还可以 Session::get('key1', 'default_value');
}
// 存一个数组然后取出
public function session1() {
    Session::push('student', 'sean');
    Session::push('student', 'imooc');
}

public function session2(){
    $res = Session::get('student', 'default');
    var_dump($res);
}
// pull 可以取出后就删除掉了  unset
public function session2(){
    $res = Session::pull('student', 'default');
    var_dump($res);
}  // 第一次输出 student 的值,第二次则是 default
// 取出所有的值
public function session2(){
    $res = Session::all();
    var_dump($res);
}
// 判断值是否存在
public function session2(){
    if(Session::has('key1')){
        $res = Session::all();
        var_dump($res);
    }
}
// 删除某个值
Session::forget('key1');
// 删除所有
Session::flush();
// 第一次访问存在,第二次就不见了
Session::flash('key_flash', 'value_flash');

Controller之Response

echo response()->json($data);
return redirect('student/list');    // 跳转到方法 action
public function c1(){
    return Session::get('msg', '暂无数据');
}
public function c2(){
    return redirect('c1')->with('msg', '我是快闪数据');    // 原理就是 Session::flash
}
return redirect()->action('StuController@action')->with('msg', '我是快闪数据');
return redirect()->route('aliasname')->with('msg', '我是快闪数据');
// 返回上一个页面
return redirect()->back();

Controller之Middleware

有个活动,在活动日期前是宣传页面,活动之后是活动页面。

新建中间件

// 在 Middleware 文件夹下面,新建 Activity.php
namespace App\Http\Middleware;
use Closure;
class Activity{

}

注册中间件

// 文件夹 Http/Kernel.php
protected $routeMiddleware = [
    ...
    'Activity' => \App\Http\Middleware\Activity::class;
];

使用中间件

Route::group(['middleware' => 'Activity'], function(){
    Route::any('active1', ['uses' => 'StudentController@active1']);
    Route::any('active2', ['uses' => 'StudentController@active2']);
});

中间件前置和后置操作

// 在中间件里面,首先展示一个前置操作
public function handle($request, Closure $next){
    if(time() < strtotime('20170406')){
       return redirect('active0');
    }
    return $next($request);
}
// 展示一个后置操作
public function handle($request, Closure $next){
    $response = $next($request);
    var_dump($response);
    echo '这是后置操作';
}

表单

静态资源管理及模板布局

{{ asset('static/js/jquery.min.js') }}    // public 下面的路径

表单列表及分页实现

// 控制器中
$student = Student::paginate(2);  // 每页显示两条
// 视图中
{{$student->render()}}

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

模型新增

// 导航当前是否选中和对应的样式
{{Request::getPathInfo() == '/student/index' ? 'active' : ''}}

create 新增

public function save(Request $request){
    $data = $request->input('Student');
    $student = new Student();
    $student->name = $data['name'];
    $student->age = $data['age'];
    if($student->save()){
        return redirect('student/index');
    }else{
        return redirect()->back();
    }
}

// 还可以这样
public function save(Request $request){
    if($request->isMethod('POST')){
        // 位置1(后面会用到这个位置)
        if(Student::create($data)){         // 需要设置批量赋值 protected $fillable = ['name', 'age'];
            return redirect('student/index')->with('success', '添加成功!');
                // 报错 TokenMismatchException 则需要在表单里添加 {{csrf_field()}}
                /**
                    @if(Session::has('success'))
                        <div>
                            ...
                            {{Session::get('success')}}
                        </div>
                    @endif
                    {{-- error 同理 --}}
                **/
        }else{
            return redirect()->back();
        }
    }
    return view('student.create');
}

表单验证及数据保持详解

控制器验证

Validator

@if (count($errors))
    <div class='alert'>
        <ul>
            <li>
                {{$errors->first()}}
            </li>
        </ul>
    </div>

    // 或者
    <div class='alert'>
        <ul>
            @foreach($errors->all() as $e)
                <li>{{$e}}</li>
            @endforeach
        </ul>
    </div>
@endif

// 在 input 后面加报错信息
{{ $errors->first('Student.name') }}
// 在 位置1 处,插入 validate 代码
$this->validate(
    $request,
    [
        'name' => 'required|min:2|max:20',
        'age' => 'required|integer',
    ],
    [
        'required' => ':attribute 为必填项',
        'min' => ':attribute 长度不符合要求',
        'integer' => ':attribute 必须是整数',
    ],
    [
        'name' => '姓名',
        'age' => '年龄',
    ]
);

// 第二种
$validator = \Validator::make(
    $request->input(),
    [
        'name' => 'required|min:2|max:20',
        'age' => 'required|integer',
    ],
    [
        'required' => ':attribute 为必填项',
        'min' => ':attribute 长度不符合要求',
        'integer' => ':attribute 必须是整数',
    ],
    [
        'name' => '姓名',
        'age' => '年龄',
    ]
);
if($validator->fails()){
    return redirect()->back()->withErrors($validator);
}

数据保持

value="{{old('message')}}"
value="{{old('Student')['name']}}"

通过模型处理性别

// 模型中
const SEX_GIRL = 10;
const SEX_BOY = 20;
public function sex($index=null){
    $arr = [
        self::SEX_GIRL => '女',
        self::SEX_BOY => '男',
    ];
    if($index!=null){
        return array_key_exists($index, $arr) ? $arr[$index] : '未知';
    }
    return $arr;
} 

// 模版中
{{ $student->sex($student->sex) }}   // Student::all() 返回的是一个对象,所以可以 $student->sex()

通过表单实现修改

// 模版中
{{ old('Student')['name'] ? old('Student')['name'] : $student->name }}
{{ isset($student->sex) && $student->sex == $index ? 'checked' : '' }}
// 控制中
public function update($request, $id){
    $student = Student::find($id);
    if($request->isMethod('POST')){
        $data = $request->input('Student');
        $student->name = $data['name'];
        $student->age = $data['age'];
        if($student->save()){
            return redirect('student/index')->with('success', '修改成功');
        }
    }
    return view('student.update', ['student' => $student]);
}

表单中查看详情及删除

public function detail($id){
    $student = Student::find($id);
    return view('student/detail', ['student' => $student]);
}
<a href='{{ url("student/del", ["id" => $student->id]) }}'></a>

Route::any('student/del/{id}', ['uses' => 'StudentController@del']);

public function del($id){
    $student = Student::find($id);
    if($student->delete()){
        return redirect('student/index')->with('success', '删除成功');
    }else{
        return redirect('student/index')->with('error', '删除失败');
    }
}

/** ajax 删除 **/
<a href="" onclick='javascript:var tag=confirm("您确定要删除该用户吗");if(!tag){return false;}del("{{ url("student/del") }}");return false;'>删除</a>

function del(url,id){
    $.post(
        url,
        {id:id},
        function(data){
            $('.none'+id).hide();
        }
    );
}

laravel 学习之第二章的更多相关文章

  1. 《DOM Scripting》学习笔记-——第二章 js语法

    <Dom Scripting>学习笔记 第二章 Javascript语法 本章内容: 1.语句. 2.变量和数组. 3.运算符. 4.条件语句和循环语句. 5.函数和对象. 语句(stat ...

  2. The Road to learn React书籍学习笔记(第二章)

    The Road to learn React书籍学习笔记(第二章) 组件的内部状态 组件的内部状态也称为局部状态,允许保存.修改和删除在组件内部的属性,使用ES6类组件可以在构造函数中初始化组件的状 ...

  3. [HeadFrist-HTMLCSS学习笔记]第二章深入了解超文本:认识HTML中的“HT”

    [HeadFrist-HTMLCSS学习笔记]第二章深入了解超文本:认识HTML中的"HT" 敲黑板!!! 创建HTML超链接 <a>链接文本(此处会有下划线,可以单击 ...

  4. C++ Primer Plus学习:第二章

    C++入门第二章:开始学习C++ 进入C++ 首先,以下是一个C++程序: //myfirst.cpp 显示一行文字 #include<iostream> //预处理器编译指令 int m ...

  5. Windows程序设计(第五版)学习:第二章 Unicode简介

    第二章 Unicode简介 1,Windows通过双字节技术DBCS解决这个问题,代码页定义不同的字符集,称为ANSI字符集,比如日文为CP932,韩文为CP949,繁体中文为CP950,简体中文为C ...

  6. [HeadFirst-JSPServlet学习笔记][第二章:高层概述]

    第二章:高层体系结构 容器 1 什么是容器? servelet没有main()方法.它们受控于另一个Java应用,这个Java应用称为容器(Container) Tomcat就是这样一个容器.Web服 ...

  7. 《JS权威指南学习总结--第二章词法结构》

    第二章词法结构 内容要点: 一.注释 1. //表示单行注释 2. /*这里是一段注释*/ 3.一般编辑器里加注释是:选中要加注释的语句,按 ctrl+/ 二.直接量 所谓直接量,就是程序中直接使用的 ...

  8. c#高级编程第七版 学习笔记 第二章 核心c#

    第二章 核心C# 本章内容: 声明变量 变量的初始化和作用域 C#的预定义数据类型 在c#程序中使用条件语句.循环和跳转语句执行流 枚举 名称空间 Main()方法 基本的命令行c#编译器选项 使用S ...

  9. Windows Forms编程实战学习:第二章 欢迎使用Visual Studio

    第二章 欢迎使用Visual Studio 1,AssemblyInfo文件 包含程序集的属性,向应用程序添加元数据 [assembly:<attribute>(<setting&g ...

随机推荐

  1. 使用 sed 命令查找和替换文件中的字符串的 16 个示例

    当你在使用文本文件时,很可能需要查找和替换文件中的字符串.sed 命令主要用于替换一个文件中的文本.在 Linux 中这可以通过使用 sed 命令和 awk 命令来完成. 在本教程中,我们将告诉你使用 ...

  2. Appium测试框架

    介绍 读作['æpɪəm],是selenium的扩展,同样基于WebDriver协议,详见:http://appium.io/. 关于WebDriver终端操作,详见:https://www.w3.o ...

  3. OpenStack 虚拟机冷/热迁移的实现原理与代码分析

    目录 文章目录 目录 前文列表 冷迁移代码分析(基于 Newton) Nova 冷迁移实现原理 热迁移代码分析 Nova 热迁移实现原理 向 libvirtd 发出 Live Migration 指令 ...

  4. 阶段3 2.Spring_10.Spring中事务控制_5 spring事务控制的代码准备

    创建一个工程,只搭建环境不做配置.等配置的时候把这个项目相关的代码再复制到新项目里面 jar包的打包方式 导入包 事务控制也是基于AOP的.所以这里导入aspectjweaver 复制jdbcTemp ...

  5. LoadRunner 技巧之 检查点

    LoadRunner 技巧之 检查点 判断脚本是否执行成功是根据服务器返回的状态来确定的,如果服务器返回的HTTP状态为 200 OK ,那么VuGen 就认为脚本正确地运行了,并且是运行通过的.在绝 ...

  6. spring aop影响dubbo返回值问题解决

    问题描述: dubbo服务已经注册,客户端调用提供者服务返回值为空.(考虑动态代理.aop的返回值影响,dubbo基于spring2.5.6.SEC03,本次开发使用的是spring4.3.8) 解决 ...

  7. 【HANA系列】SAP HANA跟我学HANA系列之创建属性视图一

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA跟我学HANA系 ...

  8. DHCP迁移

    情况1:windows 2003迁移到windows 2003或者windows 2008,按照需要以下几个步骤:1.在源DHCP服务器导出DHCP数据文件,执行以下命令netsh dhcp serv ...

  9. (转)在Kubernetes集群中使用JMeter对Company示例进行压力测试

    背景 压力测试是评估应用性能的一种有效手段.此外,越来越多的应用被拆分为多个微服务而每个微服务的性能不一,有的微服务是计算密集型,有的是IO密集型. 因此,压力测试在基于微服务架构的网络应用中扮演着越 ...

  10. 异常1(Exception)

    父类 :Throwable(可抛出的) 有两个子类:Error(错误)       Exception(异常) Error是所有错误类的父类,Exception是所有异常类的父类. 如图所示: 格式: ...