Laravel Controller 中的请求与响应、Session、中间件

1. Request;

  • 每次的访问都是一个请求,请求之后返回到浏览器的都是一个响应
  • Laravel 中的请求使用的是 symfony/http-foundation 组件
  • 请求里存放了 $_GET$_POST$_COOKIE$_FILES$_SERVER 等数据
<?php
# routes/web.php 新建一条路由
Route::any('request1', ['uses' => 'StudentController@request1']);

# 在 App/Http/Controllers/StudentController.php 加载类库
use Illuminate\Http\Request;	 // 加载的类库
# 再新增一个方法
// 通过一个依赖注入获取一个 request 实例
public function request1(Request $request){
	// 获取请求的值,或者 $request->get();
	echo $request->input('name', 'unknown');
	
	// 判断是否有值
	$request->has('name');
	
	// 获取 URL 中所有参数,返回一个数组
	dd($request->all();
	
	// 判断请求的类型,浏览器访问返回 GET
	echo $request->method();
	
	// 判断是否指定的类型
	$request->isMethod('GET');
	
	// 判断是否 AJAX 请求
	$request->ajax();
	
	// 判断请求的路径是否符合特定的格式
	$request->is('request');
	$request->is('student/*');
	
	// 获得当前 URL
	echo $request->url();	// 返回:http://192.168.1.214:2000/request1
	
}

2. Session;

  • Session 简介
    • 由于 HTTP 协议是无状态(stateless)的,所以 session 提供一种保存用户数据的方法
    • Laravel 支持了多种 Session 后端驱动,并提供清楚统一的 API。也内置支持如 Memcached、Redis 和数据库的后端驱动。默认使用 file 的 Session 驱动
    • Session 的配置文件在 config/session.php
  • Laravel 中使用 Session 有三种方式
    • HTTP request 类的 session() 方法
    • session() 辅助函数
    • Session fecade
<?php 
## 相关文件简介
# 打开 config/session.php
'driver' => env('SESSION_DRIVER', 'file'),	// 默认使用 file 驱动
// Supported: "file", "cookie", "database", "apc", 
// "memcached", "redis", "dynamodb", "array"
'lifetime' => env('SESSION_LIFETIME', 120),	// 有效期设置
'table' => 'sessions',						// 如果使用数据库驱动,默认的表设置

# 打开 App/Http/Kernel.php
// 找到 web 的中间件组 protected $middlewareGroups,
// 里面已经启动了 session:\Illuminate\Session\Middleware\StartSession::class
// 所以要在路由里添加:

## 演示:
# 添加中间件
Route::group(['middleware' => ['web']], function(){
	# routes/web.php 新建一条路由
	Route::any('session1', ['uses' => 'StudentController@session1']);
	Route::any('session2', [
		'as' => 'session2',
		'uses' => 'StudentController@session2'
	]);
});



# 在 App/Http/Controllers/StudentController.php 加载类库
# 再新增一个方法
// 通过一个依赖注入获取一个 request 实例
public function session1(Request $request){
	// 1. HTTP request session()
	$request->session()->put('key1', 'value1');
	echo $request->session()->get('key1');

	// 2. session() 辅助函数
	session()->put('key2', 'value2');
	echo session()->get('key2');
	
	// 3. 通过 Session 类
	// use Illuminate\Support\Facades\Session;	 // 加载的类库
	Session::put('key3','value3');
	echo Session::get('key3');

	// 以下以第三种方式演示
	echo Session::get('key4', 'default4');	// 不存在则取默认值

	// 以数组形式存入 Session
	Session::put(['key4' => 'value4']);
	echo Session::get('key4');

	// 把数据放入 Session 的数组中
	Session::push('student', 'Tom');
	Session::push('student', 'Jerry');
	$res = Session::get('student');
	var_dump($res);
	
	// 取出数据并删除
	$res = Session::pull('student');
	
	// 取出所有的值
	$res = Session::all();
	dd($res);

	// 判断 Session 是否存在
	Session::has('key1');
	
	// 删除 Session 指定的 key 值
	// pull 获取并删除数据,forget 删除数据
	// 一个获取之后再删除,一个不获取,直接删除
	Session::forget('key1');
	
	// 删除所有的 Session
	Session::flush();
	
	// 暂存
	Session::flash('key-flash','value-falsh');
	echo Session::get('key-flash');		// 第一次访问有,第二次就没有了
}

3. Response;

  • 响应的常见类型:字符串、视图、Json、重定向
<?php
# routes/web.php 新建一条路由
Route::any('response1', ['uses' => 'StudentController@response1']);

# 在 App/Http/Controllers/StudentController.php 新增方法
public function response1(){
	// 响应 json
	$data = [
		'errCode' => 0,
		'errMsg' => 'success',
		'data' => 'Tom'
	];
	
	// use Illuminate\Contracts\Routing\ResponseFactory;	 // 加载的类库
	return response()->json($data);		
	// 返回 {"errCode":0,"errMsg":"success","data":"Tom"}

	// 重定向
	return redirect('session2')->with('message', 'flash-key');	// 返回快闪数据
	
	// action():通过指定控制器及方法名生成 url 跳转
	return redirect()->action('StudentController@session2')
					 ->with('message', 'flash-key');

	// route():通过路由的别名生成 url 跳转
	return redirect()->route('session2')->with('message', 'flash-key');
	
	// 返回上一个页面
	return redirect()->back();

}

public function session2(Request $request){
	// return 'Session2';
	return Session::get('message', 'no message');
}

4. Middleware。

  • 中间件有什么作用
    • Laravel 中间件提供一个方便的机制来过滤进入应用程序的 HTTP 请求
  • 一个了解中间件的场景:有一个活动,在指定日期后开始,如果活动没有开始只能访问宣传页面。需要:
    • 新建中间件
    • 注册中间件
    • 使用中间件
    • 中间件的前置和后置操作
<?php
# 在 App/Http/Controllers/StudentController.php 新增方法
// 活动的宣传页面
public function activity0(){
	return '活动即将开始,敬请期待';
}

public function activity1(){
	return '活动 1 进行中,谢谢您的参与';
}

public function activity2(){
	return '活动 2 进行中,谢谢您的参与';
}

# 新建中间件 Http/Middleware/Activity.php
namespace App\Http\Middleware;

class Activity{

    // $next 为全局包
    // \closure 可改为 closure,class前面加上 use Closure;

	// 前置操作
    public function handle($request, \closure $next){
        if(time() < strtotime('2029-08-05')){
            return redirect('activity0');
        }

        return $next($request);	// 请求
    }

}

# 在 App/Http/Kernel.php 注册中间件
// 如果要注册全局的中间件,在 protected $middleware 里注册
// 路由中间件在 protected $routeMiddleware 里注册
// 添加:
'activity' => \App\Http\Middleware\Activity::class,

# 使用中间件
# routes/web.php 添加路由
Route::any('activity0', ['uses' => 'StudentController@activity0']);

Route::group(['middleware' => ['activity']], function(){
	Route::any('activity1', ['uses' => 'StudentController@activity1']);
	Route::any('activity2', ['uses' => 'StudentController@activity2']);
});
// 访问:http://192.168.1.214:2000/activity1
// 跳转到:http://192.168.1.214:2000/activity0

# 中间件的前置和后置操作
// 前置操作和后置操作的区分是根据中间件的逻辑,是在请求执行前还是执行后再执行
// 之前写的是前置操作

// 接下去演示后置操作
// 修改中间件 Http/Middleware/Activity.php
public function handle($request, \closure $next){

    $response = $next($request);
    var_dump($response);
    
	echo '我是后置操作'; 

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值