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
网友评论