Laravel文档梳理6、响应

这篇博客详细介绍了Laravel框架中响应和重定向的各种方法。从基本的字符串响应到创建完整HTTP响应实例,再到视图、JSON、文件下载、重定向等不同类型的响应,以及如何使用响应宏定义自定义响应。还提到了如何使用session闪存数据进行重定向,并给出了多个实用示例。
摘要由CSDN通过智能技术生成

前言:Laravel文档梳理,仅作为记录后看,无关其他。


1、laravel框架最基本的响应
Route::get('/', function () {
    return 'Hello World';
});

Ps:
A、laravel框架最基本的响应,就是通过路由或控制器简单的返回一个字符串
B、指定的字符串会被框架自动转换为HTTP响应

2、通常的返回,需要返回一个完整的Illuminate\Http\Response实例,如:
use Illuminate\Http\Response;

Route::get('home', function () {
    return (new Response($content, $status))
                  ->header('Content-Type', $value);
});
Ps:之所以要返回完整的实例,是为了便于定义标头及状态码
Response实例继承的类:Symfony\Component\HttpFoundation\Response

3、关于响应,为了方便起见,可以使用辅助函数response,如:
Route::get('home', function () {
    return response($content, $status)
                  ->header('Content-Type', $value);
});

4、大部分的响应方法是可以进行链式调用的,比如附加标头至响应:
return response($content)
            ->header('Content-Type', $type)
            ->header('X-Header-One', 'Header Value')
            ->header('X-Header-Two', 'Header Value');

5、附加cookie到响应
return response($content)->header('Content-Type', $type)
                 ->withCookie('name', 'value');

WithCookie方法还有一些额外的参数:
->withCookie($name, $value, $minutes, $path, $domain, $secure, $httpOnly)

Ps:默认情况,laravel框架会对cookie进行加密,用户是无法读取和修改的,但是,如果某些,你不想加密,可利用App\Http\Middleware\EncryptCookies中间件的$except属性,如:
/**
 * 无需被加密的 cookies 名称。
 *
 * @var array
 */
protected $except = [
    'cookie_name',
];

6、辅助函数response()不带任何参数,返回的实现是?
Illuminate\Contracts\Routing\ResponseFactory的contract实现

7、视图的响应
return response()->view('hello', $data)->header('Content-Type', $type);

8、json响应
return response()->json(['name' => 'Abigail', 'state' => 'CA']);

Ps:json()方法会自动将标头的Content-Type设置为application/json,并且通过PHP的json_encode()方法将数组转换为json

9、jsonP响应
return response()->json(['name' => 'Abigail', 'state' => 'CA'])
                 ->setCallback($request->input('callback'));

Ps:jsonp响应相对于json响应,就是多加了一个setCallback方法

10、文件下载响应
return response()->download($pathToFile);

Ps:download方法可以强制生成让用户浏览器生成指定路径文件下载的响应。

Download方法还有第2、3个参数,分别是文件名、http标头,如下:
return response()->download($pathToFile, $name, $headers);

11、重定向响应
Route::get('dashboard', function () {
    return redirect('home/dashboard');
});

Ps:使用redirect()辅助函数,是最简单的重定向响应

常见有用实例:比如用户提交了一个空的表单,就让他返回去,继续到那个页面,这个时候,用到back函数,如
Route::post('user/profile', function () {
    // 验证该请求...

    return back()->withInput();
});

12、重定向到命名路由
return redirect()->route('login');

Ps:如果路由有参数,放进route方法的第二个参数
// 重定向到以下 URI: profile/{id}

return redirect()->route('profile', [1]);

如果路由的参数是Eloquent模型的id,则直接将模型传入,id会被提取
return redirect()->route('profile', [$user]);

13、重定向至控制器行为
return redirect()->action('HomeController@index');

Ps:如果控制器路由需要参数的话,则在action方法,传入第二个参数
return redirect()->action('UserController@profile', [1]);

14、重定向并加上session闪存数据
通常重定向到新的url,数据会一并写入到session。所以,这个时候,闪存数据是很方便的,如:
Route::post('user/profile', function () {
    // 更新用户的个人数据...

    return redirect('dashboard')->with('status', 'Profile updated!');
});
同步状态

重定向到新的页面后,在该页面你如果还想获取该数据,使用blade的语法:
@if (session('status'))
    <div class="alert alert-success">
        {{ session('status') }}
    </div>
@endif

15、响应宏
如果你想定义在很多路由器和控制器重复使用的响应,可以使用
Illuminate\Contracts\Routing\ResponseFactory实现的方法macro,举例:

来自服务提供者的boot方法
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Contracts\Routing\ResponseFactory;

class ResponseMacroServiceProvider extends ServiceProvider
{
    /**
     * 提供注册后运行的服务。
     *
     * @param  ResponseFactory  $factory
     * @return void
     */
    public function boot(ResponseFactory $factory)
    {
        $factory->macro('caps', function ($value) use ($factory) {
            return $factory->make(strtoupper($value));
        });
    }
}
Ps:macro()方法的第一个参数是宏名称,第二个参数是闭包函数。
宏的闭包函数会在responseFactory的实现或者辅助函数response调用宏名称的时候被运行。

如:
return response()->caps('foo');

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值