首页 > 代码库 > 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框架总结(一) -- 请求和响应