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 ステータス コードとヘッダー情報をカスタマイズできます。レスポンスインスタンスは、HTTP レスポンスを作成するための一連のメソッドを提供する Symfony\Component\HttpFoundation\Response 基本クラスを継承します。
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 の作成に必要なパラメータをパラメータとして受け取ります。
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 にアクセスすると、これら 2 つの新しい Cookie が表示されます。
デフォルトでは、Laravel フレームワークによって生成された Cookie は、クライアント側で改ざんされるのを防ぐために暗号化および署名されます。 Cookie の特定のサブセットを生成時に暗号化しないようにしたい場合は、app/Http/Middleware ディレクトリ内のミドルウェア App\Http\Middleware\EncryptCookies によって提供される $excel 属性を使用して、これらの Cookie を除外できます。
/** * 不需要被加密的cookies名称 * * @var array */ protected $except = [ 'cookie_name', ];
リダイレクト応答は Illuminate\Http\RedirectResponse クラスのインスタンスであり、ユーザーを別の URL にリダイレクトするために必要なヘッダー情報が含まれています。 RedirectResponse インスタンスを生成するにはさまざまな方法がありますが、最も簡単な方法は、グローバル ヘルパー関数のリダイレクトを使用することです。
Route::get('dashboard', function () { return redirect('home/dashboard'); });
ユーザーを前のリクエストの場所にリダイレクトしたい場合があります。たとえば、フォームが送信され、検証が失敗した後、補助関数 back を使用して前の URL に戻ることができます。この機能はセッションを使用します。このメソッドを使用する前に、関連するルートが Web ミドルウェア グループに存在するか、セッション ミドルウェアが適用されていることを確認してください)。
Route::post('user/profile', function () { // 验证请求... return back()->withInput(); });
パラメーターを指定せずにリダイレクト メソッドを呼び出すと、Illuminate\Routing\Redirector インスタンスが返され、Redirector インスタンスのすべてのメソッドを使用できるようになります。
たとえば、名前付きルートへの RedirectResponse を生成するには、route メソッドを使用できます。
return redirect()->route('login');
ルートにパラメータがある場合は、それを 2 番目のパラメータとしてルート メソッドに渡すことができます:
// For a route with the following URI: profile/{id} return redirect()->route('profile', ['id'=>1]);
If 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; }
コントローラーとメソッド名をアクション メソッドに渡すだけで、コントローラーにリダイレクトするメソッドを生成することもできます。 Laravel の RouteServiceProvider がデフォルトのコントローラー名前空間を自動的に設定するため、コントローラーの完全な名前空間を指定する必要はないことに注意してください。
return redirect()->action('HomeController@index');
ルート メソッドと同様、コントローラー ルートにパラメーターが必要な場合は、そのパラメーターを 2 番目のパラメーターとしてアクション メソッドに渡すことができます。
return redirect()->action('UserController@profile', ['id'=>1]);
新しい URL へのリダイレクトとワンタイム セッションへのデータの保存は、通常、同時に行われます。 RedirectResponse 次に、インスタンスは同じメソッド チェーン内のセッションにデータを保存します。これは、アクションの後に状態情報を保存する場合に特に便利です。
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 中国語 Web サイトの他の関連記事を参照してください。