Maison > Article > développement back-end > Comment créer une réponse dans Laravel 5.5 ? Introduction à la création de réponses (code)
Comment Laravel 5.5 crée-t-il des réponses ? Beaucoup de gens ne sont peut-être pas très clairs à ce sujet, je vais donc vous présenter ensuite comment créer une réponse http dans Laravel 5.5 et présenter d'autres types de réponse.
Une fois que toutes les routes et tous les contrôleurs ont traité la logique métier, ils renvoient une réponse qui est envoyée au serveur de l'utilisateur. Réponse du navigateur, Laravel propose de nombreuses façons différentes de renvoyer des réponses. La réponse la plus basique consiste à renvoyer une simple chaîne à partir de la route ou du contrôleur. Le framework convertira automatiquement cette chaîne en une réponse HTTP complète.
Route::get('/', function () { return 'Hello World'; });
En plus de renvoyer des chaînes à partir de routes ou de contrôleurs, vous pouvez également renvoyer des tableaux. Le framework convertira automatiquement le tableau en réponse JSON.
Route::get('/', function () { return [1, 2, 3]; });
Remarque : Il est également possible de renvoyer des collections Eloquent à partir de routes ou de contrôleurs, qui seront également automatiquement converties en réponse JSON.
Habituellement, nous ne renvoyons pas simplement une chaîne ou un tableau de la route, dans la plupart des cas, une instance ou une vue IlluminateHttpResponse complète est renvoyée.
Renvoie une instance de réponse complète vous permettant de personnaliser le code d'état HTTP et les informations d'en-tête de la réponse. Les instances de réponse héritent de la classe de base SymfonyComponentHttpFoundationResponse, qui fournit une série de méthodes pour créer des réponses HTTP.
Route::get('/', function () { return response('Hello World', 200) ->header('Content-Type', 'text/plain'); });
La plupart des méthodes de réponse peuvent être appelées sous la forme de chaînes de méthodes, permettant à la réponse d'être construite de manière continue (modèle d'interface de streaming). Par exemple, vous pouvez utiliser la méthode header pour ajouter une série d'en-têtes de réponse avant d'envoyer la réponse à l'utilisateur.
return response($content) ->header('Content-Type', $type) ->header('X-Header-One', 'Header Value') ->header('X-Header-Two', 'Header Value');
Ou vous pouvez utiliser la méthode withHeaders pour spécifier un tableau d'informations d'en-tête à ajouter à la réponse.
return response($content) ->withHeaders([ 'Content-Type' => $type, 'X-Header-One' => 'Header Value', 'X-Header-Two' => 'Header Value', ]);
L'ajout de cookies aux réponses est facile en utilisant la méthode des cookies sur l'instance de réponse. Par exemple, vous pouvez utiliser la méthode cookie pour générer un cookie et l'ajouter à l'instance de réponse.
return response($content) ->header('Content-Type', $type) ->cookie('name', 'value', $minutes);
La méthode cookie peut également recevoir des paramètres facultatifs supplémentaires moins fréquemment utilisés. De manière générale, ces paramètres ont des objectifs et des significations similaires à la méthode setcookie fournie nativement par PHP.
->cookie($name, $value, $minutes, $path, $domain, $secure, $httpOnly)
Alternativement, des cookies peuvent être ajoutés aux réponses dans une « file d'attente » en utilisant la façade Cookie. La méthode queue reçoit en paramètres une instance de Cookie ou les paramètres nécessaires à la création d'un cookie qui sera ajouté à la réponse avant son envoi au navigateur.
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'); });
Visitez http://www.adm.devp/cookie/response dans votre navigateur, vous pourrez voir ces deux nouveaux cookies.
Par défaut, les cookies générés par le framework Laravel sont cryptés et signés pour éviter toute falsification côté client. Si vous souhaitez qu'un sous-ensemble spécifique de cookies ne soit pas chiffré lors de leur génération, vous pouvez exclure ces cookies via l'attribut $sauf fourni par le middleware AppHttpMiddlewareEncryptCookies dans le répertoire app/Http/Middleware.
/** * 不需要被加密的cookies名称 * * @var array */ protected $except = [ 'cookie_name', ];
La réponse de redirection est une instance de la classe IlluminateHttpRedirectResponse et contient les informations d'en-tête nécessaires pour rediriger l'utilisateur vers une autre URL. Le moyen le plus simple de générer une instance RedirectResponse consiste à utiliser la fonction d'assistance globale de redirection.
Route::get('dashboard', function () { return redirect('home/dashboard'); });
Parfois, vous souhaitez rediriger l'utilisateur vers l'emplacement de la demande précédente. Par exemple, une fois le formulaire soumis et la vérification échouée, vous pouvez utiliser la fonction auxiliaire de retour pour revenir à l'URL précédente. (en raison de la fonction utilise Session. Avant d'utiliser cette méthode, assurez-vous que l'itinéraire approprié se trouve dans le groupe de middleware Web ou que le middleware de session est appliqué).
Route::post('user/profile', function () { // 验证请求... return back()->withInput(); });
Si vous appelez la méthode de redirection sans paramètres, une instance IlluminateRoutingRedirector sera renvoyée, puis toutes les méthodes de l'instance Redirector pourront être utilisées.
Par exemple, pour générer une RedirectResponse vers une route nommée, vous pouvez utiliser la méthode route.
return redirect()->route('login');
S'il y a des paramètres dans l'itinéraire, vous pouvez les transmettre comme deuxième paramètre à la méthode d'itinéraire :
// For a route with the following URI: profile/{id} return redirect()->route('profile', ['id'=>1]);
Si vous souhaitez rediriger vers une route avec un paramètre ID (liaison de modèle Eloquent), vous pouvez transmettre le modèle lui-même et l'ID sera automatiquement résolu.
return redirect()->route('profile', [$user]);
Si vous souhaitez personnaliser le nom du paramètre par défaut dans ce paramètre de route (la valeur par défaut est id), vous devez remplacer la méthode getRouteKey sur l'instance de modèle.
/** * Get the value of the model's route key. * * @return mixed */ public function getRouteKey() { return $this->slug; }
Vous pouvez également générer une méthode qui redirige vers le contrôleur, transmettez simplement le contrôleur et le nom de la méthode à la méthode d'action. N'oubliez pas que vous n'avez pas besoin de spécifier l'espace de noms complet du contrôleur, car RouteServiceProvider de Laravel définira automatiquement l'espace de noms du contrôleur par défaut.
return redirect()->action('HomeController@index');
Comme la méthode route, si la route du contrôleur nécessite des paramètres, vous pouvez transmettre les paramètres comme deuxième paramètre à la méthode d'action.
return redirect()->action('UserController@profile', ['id'=>1]);
La redirection vers une nouvelle URL et le stockage des données dans la session unique se font généralement en même temps. Pour plus de commodité, vous pouvez le faire. create Une instance RedirectResponse stocke ensuite les données dans la session dans la même chaîne de méthodes, ce qui est particulièrement pratique lors du stockage des informations d'état après une 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
相关推荐:
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!