Laravel 5.5是如何創造回應的?也許很多人不是很清楚,那麼,接下來我將為大家介紹一下關於Laravel 5.5創建一個http響應的方法以及介紹一下其他的響應類型。
所有的路由和控制器處理完業務邏輯之後都會傳回一個傳送到使用者瀏覽器的回應,Laravel 提供了多種不同的方式來回傳回應,最基本的回應就是從路由或控制器傳回一個簡單的字串,框架會自動將這個字串轉換為一個完整的HTTP 回應。
Route::get('/', function () { return 'Hello World'; });
除了從路由或控制器傳回字串之外,還可以傳回陣列。框架會自動將陣列轉換為一個 JSON 回應。
Route::get('/', function () { return [1, 2, 3]; });
附註:也可以從路由或控制器傳回 Eloquent 集合,這也會自動轉換為 JSON 回應。
通常,我們不會只是從路由簡單返回字串或數組,大多數情況下,都會傳回一個完整的 Illuminate\Http\Response 實例或視圖。
傳回一個完整的 Response 實例允許你自訂回應的 HTTP 狀態碼和頭資訊。 Response 實例繼承自 Symfony\Component\HttpFoundation\Response 基類,該類別提供了一系列方法用於建立 HTTP 回應。
Route::get('/', function () { return response('Hello World', 200) ->header('Content-Type', 'text/plain'); });
大部分回應方法都可以以方法鏈的形式調用,從而可以流式建構回應(流介面模式)。例如,在發送回應給使用者之前可以使用 header 方法來新增一系列回應頭。
return response($content) ->header('Content-Type', $type) ->header('X-Header-One', 'Header Value') ->header('X-Header-Two', 'Header Value');
或你可以使用 withHeaders 方法來指定頭資訊數組加入回應。
return response($content) ->withHeaders([ 'Content-Type' => $type, 'X-Header-One' => 'Header Value', 'X-Header-Two' => 'Header Value', ]);
使用回應實例上的 cookie 方法可以輕鬆新增 Cookie 到回應。例如,你可以使用 cookie 方法產生 Cookie 並將其新增至回應實例。
return response($content) ->header('Content-Type', $type) ->cookie('name', 'value', $minutes);
cookie 方法還可以接收更多使用頻率較低的額外可選參數,一般來說,這些參數和 PHP 原生提供的 setcookie 方法目的和意義差不多。
->cookie($name, $value, $minutes, $path, $domain, $secure, $httpOnly)
此外,也可以使用 Cookie 門面以」佇列」形式將 Cookie 新增至回應。 queue 方法接收 Cookie 實例或建立 Cookie 所需的參數作為參數,這些 Cookie 會在回應傳送到瀏覽器之前新增至回應。
Route::get('cookie/response', function() { Cookie::queue(Cookie::make('site', 'www.baidu.com',1)); Cookie::queue('author', 'admin', 1); return response('Hello Laravel', 200) ->header('Content-Type', 'text/plain'); });
在瀏覽器中造訪 http://www.adm.devp/cookie/response ,就可以看到這兩個新增的 cookie 。
預設情況下,Laravel 框架產生的 Cookie 都經過了加密和簽名,以免在客戶端被篡改。如果你想讓特定的 Cookie 子集在產生時取消加密,可以透過 app/Http/Middleware 目錄下的中間件 App\Http\Middleware\EncryptCookies 提供的 $except 屬性來排除這些 Cookie。
/** * 不需要被加密的cookies名称 * * @var array */ protected $except = [ 'cookie_name', ];
重定向回應是Illuminate\Http\RedirectResponse 類別的實例,包含了必要的頭資訊將使用者重定向到另一個URL,有很多方式來產生RedirectResponse 實例,最簡單的方法就是使用全域輔助函式redirect。
Route::get('dashboard', function () { return redirect('home/dashboard'); });
有時候你想要將使用者重定向到上一個請求的位置,例如,表單提交後,驗證不通過,你就可以使用輔助函數back 返回前一個URL(由於該功能使用了Session,使用該方法之前確保相關路由位於web 中間件群組或應用了Session 中間件)。
Route::post('user/profile', function () { // 验证请求... return back()->withInput(); });
如果呼叫不含參數的 redirect 方法,會傳回一個 Illuminate\Routing\Redirector 實例,然後就可以使用 Redirector 實例上的所有方法。
例如,要產生一個 RedirectResponse 到命名路由,可以使用 route 方法。
return redirect()->route('login');
如果路由中有參數,可以將其作為第二個參數傳遞到route 方法:
// For a route with the following URI: profile/{id} return redirect()->route('profile', ['id'=>1]);
如果要重定向到帶有ID 參數的路由( Eloquent 模型綁定),可以傳遞模型本身,ID 會自動解析出來。
return redirect()->route('profile', [$user]);
如果你想要自訂這個路由參數中的預設參數名稱(預設是 id),需要重寫模型實例上的 getRouteKey 方法。
/** * Get the value of the model's route key. * * @return mixed */ public function getRouteKey() { return $this->slug; }
你也可以產生重定向到控制器的方法,只需傳遞控制器和方法名稱到 action 方法即可。記住,你不需要指定控制器的完整命名空間,因為 Laravel 的 RouteServiceProvider 將會自動設定預設的控制器命名空間。
return redirect()->action('HomeController@index');
和 route 方法一樣,如果控制器路由要求參數,你可以將參數作為第二個參數傳遞給 action 方法。
return redirect()->action('UserController@profile', ['id'=>1]);
重定向到一個新的URL 並將資料儲存到一次性Session 中通常是同時完成的,為了方便,可以建立一個RedirectResponse然後實例在同一個方法鏈上將資料儲存到Session,這種方式在action 之後儲存狀態資訊時特別方便。
Route::post('user/profile', function () { // 更新用户属性... return redirect('dashboard')->with('status', 'Profile updated!'); });
用户重定向到新页面之后,你可以从 Session 中取出并显示这些一次性信息,使用 Blade 语法实现如下:
@if (session('status')) <p class="alert alert-success"> {{ session('status') }} </p> @endif
注:这个一次性体现在第一次从 Session 取出数据之后,这些数据就会被销毁,不复存在。
上面我们讲了 Response 和 RedirectResponse 两种响应类型,我们还可以通过辅助函数 response 很方便地生成其他类型的响应实例,当无参数调用 response 时会返回 Illuminate\Contracts\Routing\ResponseFactory 契约的一个实现,该契约提供了一些有用的方法来生成各种响应,如视图响应、JSON 响应、文件下载、流响应等等。
如果你需要控制响应状态和响应头,并且还需要返回一个视图作为响应内容,可以使用 view 方法。
return response() ->view('hello', $data, 200) ->header('Content-Type', $type);
当然,如果你不需要传递自定义的 HTTP 状态码和头信息,只需要简单使用全局辅助函数 view 即可。
Route::get('view/response', function() { return view('hello'); });
注:视图响应的视图文件必须存在,视图文件位于 resources/views 目录中。
json 方法会自动将 Content-Type 头设置为 application/json,并使用 PHP 函数 json_encode 方法将给定数组转化为 JSON 格式的数据。
return response()->json([ 'name' => 'Abigail', 'state' => 'CA' ]);
如果你想要创建一个 JSONP 响应,可以在 json 方法之后调用 withCallback 方法。
return response() ->json(['name' => 'Abigail', 'state' => 'CA']) ->withCallback($request->input('callback'));
或者直接使用 jsonp 方法。
return response() ->jsonp($request->input('callback'), ['name' => 'Abigail', 'state' => 'CA']);
download 方法用于生成强制用户浏览器下载给定路径文件的响应。download 方法接受文件名作为第二个参数,该参数决定用户下载文件的显示名称,你还可以将 HTTP 头信息作为第三个参数传递到该方法。
return response()->download($pathToFile); return response()->download($pathToFile, $name, $headers); return response()->download($pathToFile)->deleteFileAfterSend(true);
注:管理文件下载的 Symfony HttpFoundation 类要求被下载文件有一个 ASCII 文件名,这意味着被下载文件名不能是中文。
Route::get('download/response', function() { return response()->download(storage_path('app/photo/test.jpg'), '测试图片.jpg'); });
file 方法可用于直接在用户浏览器显示文件,例如图片或 PDF,而不需要下载,该方法接收文件路径作为第一个参数,头信息数组作为第二个参数。
return response()->file($pathToFile); return response()->file($pathToFile, $headers);
如果你想要定义一个自定义的可以在多个路由和控制器中复用的响应,可以使用 Response 门面上的 macro 方法。
例如,在某个服务提供者的 boot 方法中编写代码如下:
<?php namespace App\Providers; use Illuminate\Support\Facades\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)); }); } }
macro 方法接收响应名称作为第一个参数,闭包函数作为第二个参数,响应宏的闭包在 ResponseFactory 实现类或辅助函数 response 中调用宏名称的时候被执行。
Route::get('macro/response', function() { return response()->caps('test'); });
在浏览器中访问 http://www.adm.devp/macro/response ,输出入下:
TEST
相关推荐:
以上是Laravel 5.5如何創造回應?建立回應的介紹(程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!