二、laravel表单
1.request
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
namespace App\Http\Controllers;
use App\Student;
use Illuminate\Http\Request;
class StudentController
{
public function request(Request $request) { // 这个$request是Illuminate\Http\Request的
// 1.取值
$request->input('name');
$request->input('name', '未知'); // 如果name值不存在,则输出未知
$request->has('name'); // 判断有无该属性
$request->all(); // 取出请求中所有属性,以数组的方式列出来
// 2.判断请求类型
$request->method();
$request->ismethod('GET'); // 判断请求是否用GET方法
$request->ajax(); // 判断是否ajax请求
// 3.判断请求是否满足特定格式
$request->is('student/*'); // 判断是不是student这个url路径下的,即是否请求路径的前缀为:http://<ip addr>/student/
$request->url(); // 请求的路径
}
}
2.session
session的配置文件在config/session.php中。
使用session的三种方法:
- HTTP request类的session()方法
- session()辅助函数
- Session facade
config/session.php部分解析:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
return [
// 默认使用file驱动,支持:"file", "cookie", "database", "apc", "memcached", "redis", "array"
'driver' => env('SESSION_DRIVER', 'file'),
// session有效期
'lifetime' => 120,
'expire_on_close' => false,
'encrypt' => false,
'files' => storage_path('framework/sessions'),
'connection' => null,
// 使用数据库驱动的话,默认的表是sessions
'table' => 'sessions',
'store' => null,
'lottery' => [2, 100],
'cookie' => env(
'SESSION_COOKIE',
str_slug(env('APP_NAME', 'laravel'), '_').'_session'
),
'path' => '/',
'domain' => env('SESSION_DOMAIN', null),
'secure' => env('SESSION_SECURE_COOKIE', false),
'http_only' => true,
'same_site' => null,
];
先在路由表中添加要使用session()的路由的web中间件:
1
2
3
4
5
// routes/web.php
Route::group(['middleware' => ['web']], function (){ // 用路由组的方式同时给session1和session2两个路由添加webs中间价
Route::any('session1', ['uses' => 'StudentController@session1']);
Route::any('session2', ['uses' => 'StudentController@session2']);
});
1.HTTP request的session()
先访问session1方法,会往session放入一个key,然后访问session2方法,会从session中取出key值。
1
2
3
4
5
6
7
8
9
class StudentController
{
public function session1(Request $request) {
$request->session()->put('key', 'value'); // 用put往session放入一个key属性,值为value
}
public function session2(Request $request) {
$val = $request->session()->get('key'); // 用get从session取出key值
}
}
2.直接session()
1
2
3
4
5
6
7
8
9
class StudentController
{
public function session1(Request $request) {
session()->put('key', 'value'); // 用put往session放入一个key属性,值为value
}
public function session2(Request $request) {
session()->get('key'); // 用get从session取出key值
}
}
3.Session facade
1
2
3
4
5
6
7
8
9
10
class StudentController
{
public function session1(Request $request) { // 这里的Session导入的是Illuminate\Support\Facades\Session
Session::put('key', 'value'); // 用put往session放入一个key属性,值为value
}
public function session2(Request $request) {
Session::get('key'); // 用get从session取出key值
Session::get('key', 'default'); // 用get从session取出key,如果没有,则为'default'
}
}
其他用法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 以数组形式存储数据
Session::put(['key' => 'value']);
// 把数据放到Session的数组中,这里同时将'a', 'b'同时存进'student'中,所以'student'就会是个数组
Session::push('student', 'a');
Session::push('student', 'b');
// 从session中取出'student',然后就把它从session删除
Session::pull('student', 'default');
// 取出所有的值,返回一个数组
$res = Session::all();
// 判断key值存不存在,返回一个bool值
$bool = Session::has('key');
// 删除session中的key值
Session::forget('key');
// 清空session中所有的数据
Session::flush();
// 暂存数据,只有第一次访问的时候存在
class StudentController
{
public function session1(Request $request) {
Session::flash('key', 'value'); // 暂存'key'属性,其值为'value'
}
public function session2(Request $request) {
Session::get('key'); // 第一次访问session2的时候能打印出'key'值,一刷新,即第二次访问session2就没有了
}
}
3.response
响应的类型:字符串, 视图, Json, 重定向。
- Json
1
2
3
4
5
6
7
8
9
public function response() {
// 响应Json
$data = [
'errCode' => 0,
'errMsg' => 'Error'
];
// 将数据以json形式传过去
return response()->json($data);
}
- 重定向
1
2
3
4
5
6
7
8
9
10
11
class StudentController
{
public function session(Request $request) {
// 带数据的重定向其实也是用Session的flash(),故取数据时用get就可以了,但只能取一次
return Session::get('msg', 'default msg');
}
public function response() {
// return redirect('session'); // 不带数据的重定向
return redirect('session')->with('msg', '我是快闪数据'); // 带数据的重定向
}
}
1
2
3
或者:
action(), 控制器+方法
1
2
3
4
5
6
7
8
9
10
11
class StudentController
{
public function session(Request $request) {
return Session::get('msg', 'default msg');
}
public function response() {
return redirect()
->action('StudentController@session') // 重定向的是控制器
->with('msg', '我是快闪数据'); // 可带重定向数据也可以不带
}
}
1
2
3
或者:
route(), 路由别名
1
2
3
4
5
6
7
8
9
10
11
class StudentController
{
public function session(Request $request) {
return Session::get('msg', 'default msg');
}
public function respose() {
return redirect()
->route('session') // 通过路由别名重定向
->with('msg', '我是快闪数据'); // 可带重定向数据也可以不带
}
}
1
2
3
或者:
back(),返回上一个页面
1
2
3
4
5
6
class StudentController
{
public function response() {
redirect()->back();
}
}
4.Middleware
Laravel中间件提供了一个方便的机制来过滤进入应用程序的HTTP请求。
假设一个场景:有一个活动,指定日期开始前只能访问宣传页面,活动开始日期后才可以访问活动页面。
- 新建控制器方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
namespace App\Http\Controllers;
use App\Student;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Session;
class StudentController
{
public function activity_advertise() {
return '活动宣传页面';
}
public function activity_running() {
return '活动进行中';
}
}
- 新建中间件
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
namespace App\Http\Middleware;
class Activity
{
public function handle($request, \Closure $next) { // 函数名是固定的
// 这里的$next是个方法,如果看'\Closure $next'不爽,可以在头部添加'use Closure',
// 这样,这里就可以写成:public function handle($request, Closure $next)
if (time() < strtotime('2018-08-07')) { // strtotime()将'yyyy-MM-dd'格式的日期转为一个时间戳
return redirect('activity_advertise');
}
return $next($request); // $next是个方法,将$request请求扔进这个方法里
}
}
1
在Kernel.php中注册中间件:
1
2
3
4
5
6
7
8
9
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'activity' => \App\Http\Middleware\Activity::class, // 注册在这里,值为中间件路径
];
1
如果想注册全局中间件,则在Kernel.php里的这里注册:
1
2
3
4
5
6
7
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
\App\Http\Middleware\TrustProxies::class,
];
- 使用中间件(在路由文件中)
1
2
3
4
5
6
// 访问活动页面就会跳入这个中间件
Route::group(['middleware' => ['activity']], function () {
Route::any('activity_running', ['uses' => 'StudentController@activity_running']);
});
// 然后中间件根据判断就会重定向到这个路由
Route::any('activity_advertise', ['uses' => 'StudentController@activity_advertise']);
- 其他
中间件有前置操作和后置操作。
1
2
3
4
5
6
7
8
9
10
11
// 后置操作
<?php
namespace App\Http\Middleware;
use Closure;
class Activity
{
public function handle($request, Closure $next) {
$response = $next($request);
echo $response;
}
}
1
2
3
4
5
6
7
8
9
10
11
// 前置操作
<?php
namespace App\Http\Middleware;
use Closure;
class Activity
{
public function handle($request, Closure $next) {
echo 'Jim';
return $next($request);
}
}