laravel笔记-请求与响应
写在前面
时间可贵,善用目录↑
学习Laravel的笔记,仅仅是作为laravel文档笔记,目的是强化对文档的理解,质量不高。
预备知识
Jsonp:利用script标签绕过同源策略,获得一个类似这样的数据,jsonpcallback是页面存在的回调方法,参数就是想得到的json。
同源策略:不允许从一个源加载的文档或脚本,获取或设置另一个源加载的文档的属性
什么是请求(Request)和响应(Response)
这个大多数框架都大同小异.
浏览器->请求->服务器->响应->浏览器
关于请求
//判断输入值是否出现
if ($request->has('name')) {
}
//获取所有输入值
$input = $request->all();
//获取单个输入值,第二个参数是默认值
$name = $request->input('name', 'Sally');
//获取数组形式的输入
$input = $request->input('products.0.name');
$names = $request->input('products.*.name');
//如果表单包含 name 字段
$name = $request->name;
//请求支持json,还可以通过.解析
$name = $request->input('user.name');
//取出(排除)输入数据的子集
$input = $request->only(['username', 'password']);
$input = $request->only('username', 'password');
$input = $request->except(['credit_card']);
$input = $request->except('credit_card');
/*文件操作*/
/*详情参看UploadedFile的API文档*/
//获取上传的文件,例如name='photo'
$file = $request->file('photo');
$file = $request->photo;
//判断是否存在文件
if ($request->hasFile('photo')) {
//
}
//判断文件是否上传成功
if ($request->file('photo')->isValid()){
//
}
//文件的路径
$path = $request->photo->path();
//文件的扩展名
$extension = $request->photo->extension();
//保存文件,第一个是路径不包含文件名,二是磁盘,选配
$path = $request->photo->store('images', 's3');
/*还有一些骚操作*/
//取出上次请求数据
$username = $request->old('username');
//从请求中取出Cookies
$value = $request->cookie('name');
关于响应(Response)
基础响应
/*响应的类型*/
//可以是字符串、数组
Route::get('/', function () {
return 'Hello World';
});
//也可以是Response对象
Route::get('home', function () {
return response('Hello World', $status)
->header('Content-Type', $value);
});
//更常用的则是返回一个视图View,第二个参数是数据,具体在view笔记中。
return response()->view('hello', $data, 200)->header('Content-Type', $type);
//有时候则需要返回json
return response()->json(['name' => 'Abigail', 'state' => 'CA']);
//有时候的有时候需要Jsonp响应
//就是加一个回调函数
return response()->json(['name' => 'Abigail', 'state' => 'CA'])
->withCallback($request->input('callback'));
Response杂七杂八的方法
响应头
Response 实例允许你自定义响应的 HTTP 状态码和头信息。
//这样
return response($content)
->header('Content-Type', $type)
->header('X-Header-One', 'Header Value')
->header('X-Header-Two', 'Header Value');
//或者这样
return response($content)
->withHeaders([
'Content-Type' => $type,
'X-Header-One' => 'Header Value',
'X-Header-Two' => 'Header Value',
]);
Cookie
类似于响应头,也可以添加cookie到响应
return response($content)
->header('Content-Type', $type)
->cookie('name', 'value', $minutes);
重定向的杂七杂八
重定向也是比较关键的功能了
Route::get('dashboard', function () {
//这里是重定向到URL
return redirect('home/dashboard');
//也可以重定向到路由
//这里注意不带参数的redirect()方法会返回一个RedirectResponse实例
//第二个参数是路由需要的参数
return redirect()->route('profile', ['id'=>1]);
//第二个参数也可以是需要的Eloquent模型
return redirect()->route('profile', [$user]);
});
//也可以是返回上一页(也是重定向的一种)
Route::post('user/profile', function () {
// 验证请求...
return back()->withInput();
});
//当然也可以是控制器动作,第二个是参数
return redirect()->action('UserController@profile', ['id'=>1]);
session
类似于Response,RedirectResponse可以携带session
Route::post('user/profile', function () {
// 更新用户属性...
//with()中就是session~
return redirect('dashboard')->with('status', 'Profile updated!');
});
文件处理
//文件下载
return response()->download($pathToFile);
//文件路径(包含文件名),文件名(用户看到的),请求头信息
return response()->download($pathToFile, $name, $headers);
//打开文件,图片或PDF直接打开
return response()->file($pathToFile);
return response()->file($pathToFile, $headers);
骚操作
响应宏
定义一个自定义的可以在多个路由和控制器中复用的响应。
使用Response门面上的macro方法
namespace App\Providers;
use Response;
use Illuminate\Support\ServiceProvider;
class ResponseMacroServiceProvider extends ServiceProvider
{
/**
* Perform post-registration booting of services.
*
* @return void
*/
public function boot()
{
//方法名,闭包函数
Response::macro('caps', function ($value) {
return Response::make(strtoupper($value));
});
}
}
然后这么用:
return response()->caps('foo');