• Laravel之HTTP相应


    一.基本相应示例

    1.返回简单字符串

    Route::get('/', function () {
    return 'Hello World';
    });
    

      

    给定的字符串会被框架自动转化为 HTTP 响应

    2.返回head头

    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);
    });
    

      

    二.添加header

    return response($content)
    	->header('Content-Type', $type)
    	->header('X-Header-One', 'Header Value')
    	->header('X-Header-Two', 'Header Value');
    

      

    三.添加cookies

    return response($content)->header('Content-Type', $type)
    	->withCookie('name', 'value');
    
    withCookie 方法接收额外的可选参数从而允许对 cookie 属性更多的自定义:
    	->withCookie($name, $value, $minutes, $path, $domain, $secure, $httpOnly)
    

      

    默认情况下,Laravel 框架生成的 cookies 经过加密和签名,所以在客户端不能进行修改,如果你想要将特定的cookies 子集在生成时取消加密,可以使用中间件AppHttpMiddlewareEncryptCookies 的$except 属性:

    /**
    * 需要被加密的 cookies 名称
    *
    * @var array
    */
    protected $except = [
    'cookie_name',
    ];
    

      

    四.视图相应

    return response()->view('hello', $data)->header('Content-Type', $type);
    

      

    五.json相应


    json 方法会自动将 Content-Type 头设置为application/json ,并使用 PHP 函数json_encode 方法将给定数组转化为 JSON:

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

      

    如果你想要创建一个 JSONP 响应,可以添加setCallback 到json 方法后面:

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

      

    六.文件下载

    download 方法用于生成强制用户浏览器下载给定路径文件的响应。download 方法接受文件名作为第二个参数,该参数决定用户下载文件的显示名称,你还可以将 HTTP 头信息作为第三个参数传递到该方法:

    return response()->download($pathToFile);
    return response()->download($pathToFile, $name, $headers);
    

      

    七.重定向

    Route::get('dashboard', function () {
        return redirect('home/dashboard');
    });
    

      

    1.重定向到前一个位置

    Route::post('user/profile', function () {
    	// 验证请求...
    	return back()->withInput();
         // 重定向到前一个位置,并携带错误信息
         //return back()->withErrors('token错误,请重新提交');
    });

      

    2.重定向到命名路由:

    return redirect()->route('login');
    

      

    如果路由中有参数,可以将其作为第二个参数传递到route 方法:

    // For a route with the following URI: profile/{id}
    return redirect()->route('profile', [1]);
    

      

    3.如果要重定向到带 ID 参数的路由,并从 Eloquent 模型中取数据填充表单,可以传递模型本身,ID 会被自动解析出来:

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

      

    示例代码:
    public function index(User $user)
    {
            return redirect()->route('test', [$user]);
    }
    public function test(User $user)
    {
            var_dump($user);
    
    }
    
    路由:
    Route::get('guo/test', ['as'=>'test', 'uses'=>'GuoController@test']);
    Route::get('guo/{user}', 'GuoController@index');
    
    RouteServiceProvider配置:
    public function boot(Router $router)
    {
         $router->model('user', 'AppModelsUser');
         parent::boot($router);
    }
    

      

    访问http://localhost:9000/guo/1,重定向到http://localhost:9000/guo/test?1,test控制器中打印user数组

    4.重定向到控制器

    return redirect()->action('HomeController@index');
    

      


    当然,如果控制器路由要求参数,你可以将参数作为第二个参数传递给 action 方法:

    return redirect()->action('UserController@profile', [1]);
    

      

    5.带一次性 Session 数据的重定向

    Route::post('user/profile', function () {
      // 更新用户属性...
      return redirect('dashboard')->with('status', 'Profile updated!');
    });
    

      

    在模板中取出数据

    @if (session('status'))
    <div class="alert alert-success">
    {{ session('status') }}
    </div>
    @endif
    

      

    八.相应宏


    如果你想要定义一个自定义的响应并且在多个路由和控制器中复用,可以使用IlluminateContractsRoutingResponseFactory 实现上的macro 方法。 比如,在一个服务提供者的boot 方法中:

    <?php
    namespace AppProviders;
    use IlluminateSupportServiceProvider;
    use IlluminateContractsRoutingResponseFactory;
    class ResponseMacroServiceProvider extends ServiceProvider
    {
    	/**
    	* Perform post-registration booting of services.
    	*
    	* @param ResponseFactory $factory
    	* @return void
    	*/
    	public function boot(ResponseFactory $factory)
    	{
    		$factory->macro('caps', function ($value) use ($factory) {
    		return $factory->make(strtoupper($value));
    		});
    	}
    }
    

      

    micro 方法接收响应名称作为第一个参数,一个闭包函数作为第二个参数, micro 的闭包在从ResponseFactory 实现或帮助函数response 上调用 macro 名称的时候被执行:

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

      

  • 相关阅读:
    SpringMVC文件上传
    c函数调用过程原理及函数栈帧分析
    《C++游戏开发》笔记十一 平滑动画:不再颤抖的小雪花
    Java学习笔记——IO操作之以图片地址下载图片
    uva 400 Unix ls 文件输出排版 排序题
    【VC++积累】之八、PreTranslageMessage;TranslageMessage;GetMessage和PeekMessage的区别
    uva 331 Mapping the Swaps 求交换排序的map 纯DFS
    uva 10344 23 out of 5 凑运算结果 全排列+dfs
    Java学习笔记——File类文件管理及IO读写、复制操作
    uva 301 Transportation 铁路公司的阳谋 纯dfs暴力
  • 原文地址:https://www.cnblogs.com/itfenqing/p/6919922.html
Copyright © 2020-2023  润新知