前言:Laravel文档梳理,仅作为记录后看,无关其他。
1、laravel框架最基本的响应
Route::get('/', function () {
return 'Hello World';
});
Ps:
A、laravel框架最基本的响应,就是通过路由或控制器简单的返回一个字符串
B、指定的字符串会被框架自动转换为HTTP响应
2、通常的返回,需要返回一个完整的Illuminate\Http\Response实例,如:
use Illuminate\Http\Response;
Route::get('home', function () {
return (new Response($content, $status))
->header('Content-Type', $value);
});
Ps:之所以要返回完整的实例,是为了便于定义标头及状态码
Response实例继承的类:Symfony\Component\HttpFoundation\Response
3、关于响应,为了方便起见,可以使用辅助函数response,如:
Route::get('home', function () {
return response($content, $status)
->header('Content-Type', $value);
});
4、大部分的响应方法是可以进行链式调用的,比如附加标头至响应:
return response($content)
->header('Content-Type', $type)
->header('X-Header-One', 'Header Value')
->header('X-Header-Two', 'Header Value');
5、附加cookie到响应
return response($content)->header('Content-Type', $type)
->withCookie('name', 'value');
WithCookie方法还有一些额外的参数:
->withCookie($name, $value, $minutes, $path, $domain, $secure, $httpOnly)
Ps:默认情况,laravel框架会对cookie进行加密,用户是无法读取和修改的,但是,如果某些,你不想加密,可利用App\Http\Middleware\EncryptCookies中间件的$except属性,如:
/**
* 无需被加密的 cookies 名称。
*
* @var array
*/
protected $except = [
'cookie_name',
];
6、辅助函数response()不带任何参数,返回的实现是?
Illuminate\Contracts\Routing\ResponseFactory的contract实现
7、视图的响应
return response()->view('hello', $data)->header('Content-Type', $type);
8、json响应
return response()->json(['name' => 'Abigail', 'state' => 'CA']);
Ps:json()方法会自动将标头的Content-Type设置为application/json,并且通过PHP的json_encode()方法将数组转换为json
9、jsonP响应
return response()->json(['name' => 'Abigail', 'state' => 'CA'])
->setCallback($request->input('callback'));
Ps:jsonp响应相对于json响应,就是多加了一个setCallback方法
10、文件下载响应
return response()->download($pathToFile);
Ps:download方法可以强制生成让用户浏览器生成指定路径文件下载的响应。
Download方法还有第2、3个参数,分别是文件名、http标头,如下:
return response()->download($pathToFile, $name, $headers);
11、重定向响应
Route::get('dashboard', function () {
return redirect('home/dashboard');
});
Ps:使用redirect()辅助函数,是最简单的重定向响应
常见有用实例:比如用户提交了一个空的表单,就让他返回去,继续到那个页面,这个时候,用到back函数,如
Route::post('user/profile', function () {
// 验证该请求...
return back()->withInput();
});
12、重定向到命名路由
return redirect()->route('login');
Ps:如果路由有参数,放进route方法的第二个参数
// 重定向到以下 URI: profile/{id}
return redirect()->route('profile', [1]);
如果路由的参数是Eloquent模型的id,则直接将模型传入,id会被提取
return redirect()->route('profile', [$user]);
13、重定向至控制器行为
return redirect()->action('HomeController@index');
Ps:如果控制器路由需要参数的话,则在action方法,传入第二个参数
return redirect()->action('UserController@profile', [1]);
14、重定向并加上session闪存数据
通常重定向到新的url,数据会一并写入到session。所以,这个时候,闪存数据是很方便的,如:
Route::post('user/profile', function () {
// 更新用户的个人数据...
return redirect('dashboard')->with('status', 'Profile updated!');
});
同步状态
重定向到新的页面后,在该页面你如果还想获取该数据,使用blade的语法:
@if (session('status'))
<div class="alert alert-success">
{{ session('status') }}
</div>
@endif
15、响应宏
如果你想定义在很多路由器和控制器重复使用的响应,可以使用
Illuminate\Contracts\Routing\ResponseFactory实现的方法macro,举例:
来自服务提供者的boot方法
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Contracts\Routing\ResponseFactory;
class ResponseMacroServiceProvider extends ServiceProvider
{
/**
* 提供注册后运行的服务。
*
* @param ResponseFactory $factory
* @return void
*/
public function boot(ResponseFactory $factory)
{
$factory->macro('caps', function ($value) use ($factory) {
return $factory->make(strtoupper($value));
});
}
}
Ps:macro()方法的第一个参数是宏名称,第二个参数是闭包函数。
宏的闭包函数会在responseFactory的实现或者辅助函数response调用宏名称的时候被运行。
如:
return response()->caps('foo');