首页 > 代码库 > laravel框架总结(一) -- 请求和响应
laravel框架总结(一) -- 请求和响应
一.laravel请求
1.获取请求
1>获取请求的 URI
path 方法会返回请求的 URI。所以,如果接收到的请求目标是 http://domain.com/foo/bar,那么 path 方法就会返回 foo/bar:
$uri = $request->path();
is 方法可以验证接收到的请求 URI 与指定的规则是否相匹配。使用此方法时你可以将 * 符号作为通配符:
if ($request->is(‘admin/*‘)) { // }
使用 url 方法,可以获取完整的网址:
$url = $request->url();
2>获取请求的方法
method 方法会返回此次请求的 HTTP 动作。也可以通过 isMethod 方法来验证 HTTP 动作和指定的字符串是否相匹配:
$method = $request->method(); if ($request->isMethod(‘post‘)) { // }
2.获取输入数据
获取特定输入值
你可以通过 Illuminate\Http\Request 的实例,不需要去担心发出请求时使用的 HTTP 动作,因为它们获取输入数据的方式都是相同的。
$name = $request->input(‘name‘);
此外,可以使用 Illuminate\Http\Request 的属性访问用户输入。
$name = $request->name;
可以在 input 方法的第二个参数中传入一个默认值。当请求的输入数据不存在于此次请求时,就会返回默认值:
$name = $request->input(‘name‘, ‘Sally‘);
如果是「数组」形式的输入数据,则可以使用「点」语法来获取数组:
$input = $request->input(‘products.0.name‘);
确认是否有输入值
使用 has 方法。当该数据存在并且字符串不为空时,has 方法就会传回 true:
if ($request->has(‘name‘)) { // }
获取所有输入数据
你也可以使用 all 方法以 数组 形式获取到所有输入数据:
$input = $request->all();
获取部分输入数据
如果你想获取输入数据的子集,则可以使用 only 及 except 方法。这两个方法都接受单个数组或是动态列表作为参数:
$input = $request->only([‘username‘, ‘password‘]);
$input = $request->only(‘username‘, ‘password‘);
$input = $request->except([‘credit_card‘]);
$input = $request->except(‘credit_card‘);
3.旧输入数据
Laravel 可以让你将本次的输入数据保留,它只在下一次的请求内有效.可以使用 flash 方法保存 session,将数据保留到下个 HTTP 请求,然后就会被自动删除,这对于在表单验证失败后重新填入表单值相当有用.
举例:登录操作
登录失败,再次跳转到登录页面,此时我们不做任何操作,其实后台已经发送了一次请求到/user/login,进行登录失败的跳转操作,此时闪存内容还存在.
我们再次刷新页面,会再次产生一次请求,此时闪存内容就不存在了
将输入数据闪存至 Session
Illuminate\Http\Request 实例的 flash 方法会将当前的输入数据存进session中,所以下次用户发出请求至应用程序时就可以使用它们:
$request->flash();
你也可以使用 flashOnly 及 flashExcept 方法将请求数据的子集保存至 Session:
$request->flashOnly(‘username‘, ‘email‘);
$request->flashExcept(‘password‘);
闪存输入数据至 Session 后重定向
你可能需要将输入数据闪存并重定向至前一页,这时只要在重定向方法后加上 withInput 即可:
return redirect(‘form‘)->withInput();
return redirect(‘form‘)->withInput($request->except(‘password‘));
获取旧输入数据
注意上面两种闪存方式使用session(‘username‘)是拿不到数据的,若要获取上一次请求后所闪存的输入数据,则可以使用 Request 实例中的 old 方法,
$username = $request->old(‘username‘);
Laravel 也提供了全局辅助函数 old。如果你要在Blade模板中显示旧输入数据,可以使用更加方便的 old 辅助函数:
{{old(‘username‘)}}
二.laravel响应
1.基本响应
1>返回一个字符串,指定的字符串会被框架自动转换成 HTTP 响应。
Route::get(‘/‘, function () { return ‘Hello World‘; });
2>返回一个完整的 Response 实例时,就能够自定义响应的 HTTP 状态码以及标头。
use Illuminate\Http\Response;
Route::get(‘home‘, function () {
return (new Response($content, $status)) ->header(‘Content-Type‘, $value);
});
为了方便起见,你可以使用辅助函数 response:
Route::get(‘home‘, function () {
return response($content, $status) ->header(‘Content-Type‘, $value);
});
2.其它响应类型
1>视图响应
如果你想要控制响应状态码及标头,同时也想要返回一个视图作为返回的内容时,则可以使用 view 方法:
return response()->view(‘hello‘, $data)->header(‘Content-Type‘, $type);
当然,如果你没有自定义 HTTP 状态码及标头的需求,则可以简单的使用全局的 view 辅助函数。
return view(‘hello‘,$data);
2>JSON 响应
json 方法会自动将标头的 Content-Type 设置为 application/json,并通过 PHP 的 json_encode 函数将指定的数组转换为 JSON:
return response()->json([‘name‘ => ‘Abigail‘, ‘state‘ => ‘CA‘]);
如果你想创建一个 JSONP 响应,则可以使用 json 方法并加上 setCallback:
return response()->json([‘name‘ => ‘Abigail‘, ‘state‘ => ‘CA‘]) ->setCallback($request->input(‘callback‘));
3>文件下载
download 方法可以用于生成强制让用户的浏览器下载指定路径文件的响应。download 方法接受文件名称作为方法的第二个参数,此名称为用户下载文件时看见的文件名称。最后,你可以传递一个 HTTP 标头的数组作为第三个参数传入该方法:
return response()->download($pathToFile);
return response()->download($pathToFile, $name, $headers);
3.重定向
1>简单重定向
最简单的方式就是通过全局的 redirect 辅助函数:
Route::get(‘dashboard‘, function () { return redirect(‘home/dashboard‘); });
有时你可能希望将用户重定向至前一个位置,例如当提交一个无效的表单之后。这时可以使用全局的 back 辅助函数来达成这个目的:
Route::post(‘user/profile‘, function () { // 验证该请求... return back()->withInput(); });
2>重定向至命名路由
当你调用 redirect 辅助函数且不带任何参数时,将会返回 Illuminate\Routing\Redirector 的实例,你可以对该 Redirector 的实例调用任何方法。举个例子,要生成一个 RedirectResponse 到一个命名路由,你可以使用 route 方法:
return redirect()->route(‘login‘);
如果你的路由有参数,则可以将参数放进 route 方法的第二个参数:
// 重定向到以下 URI: profile/{id} return redirect()->route(‘profile‘, [1]);
如果你要重定向至路由且路由的参数为 Eloquent 模型的「ID」,则可以直接将模型传入,ID 将会自动被提取:
return redirect()->route(‘profile‘, [$user]);
3>重定向至控制器行为
请记得,你不需要指定完整的命名空间,因为 Laravel 的 RouteServiceProvider 会自动设置默认的控制器命名空间:
return redirect()->action(‘HomeController@index‘);
当然,如果你的控制器路由需要参数的话,你可以传递它们至 action 方法的第二个参数:
return redirect()->action(‘UserController@profile‘, [1]);
4>重定向并加上 Session 闪存数据
通常重定向至新的 URL 时会一并写入闪存数据至session。所以为了方便,你可以利用链式调用的方式创建一个 RedirectResponse 的实例并闪存数据至 Session。这对于在一个动作之后保存状态消息相当方便:
Route::post(‘user/profile‘, function () {
// 更新用户的个人数据...
return redirect(‘dashboard‘)->with(‘status‘, ‘Profile updated!‘);
});
当然,在用户重定向至新的页面后,你可以获取并显示session的闪存数据,注意这里闪存的信息和使用使用$request->flash()闪存数据提出方法不同,old(‘status‘)是取不到的,要使用session(‘status‘)
@if (session(‘status‘))
<div class="alert alert-success"> {{ session(‘status‘) }} </div>
@endif
laravel框架总结(一) -- 请求和响应