• Laravel5.1学习笔记5 请求


    HTTP 请求

    #取得请求实例

        #基本的请求信息

        #PSR-7 请求

    #取出输入数据

        #旧的输入

        #Cookies

        #文件

     

    #取得请求实例(此部分文档5.1完全重写,注意)

    要通过依赖注入获取当前HTTP Request的实例, 你应该在控制器构造器,或方法中 type-hint (类型约束)IlluminateHttpRequest 类, 当前request 实例会被服务容器自动注入:

    <?php

    namespace AppHttpControllers;

    use IlluminateHttpRequest;
    use IlluminateRoutingController;

    class UserController extends Controller
    {
    /**
    * Store a new user.
    *
    * @param Request $request
    * @return Response
    */
    public function store(Request $request)
    {
    $name = $request->input('name');

    //
    }
    }

    如果你的控制器方法也期待着路由参数的输入,只需在你的其他依赖注入后面列出你的路由参数,比如你的路由这样定义:

    Route::put('user/{id}', 'UserController@update');
    你还是可以类型约束 IlluminateHttpRequest 和通过定义控制器方法取得你的路由参数Id

    <?php

    namespace AppHttpControllers;

    use IlluminateHttpRequest;
    use IlluminateRoutingController;

    class UserController extends Controller
    {
    /**
    * Update the specified user.
    *
    * @param Request $request
    * @param int $id
    * @return Response
    */
    public function update(Request $request, $id)
    {
    //
    }
    }

    #基本的请求信息

    IlluminateHttpRequest   实例提供了不同的方法去验证HTTP请求, Laravel  的 IlluminateHttpRequest   继承了SymfonyComponentHttpFoundationRequest 类, 这里有几个更有用的类方法:

    取得 请求Request的 URI

    Path方法返回请求的URI, 因此,如果请求的目标是 http://domain.com/foo/bar,  Path方法会返回 foo/bar:

    $uri = $request->path();
     
    is 方法允许你验证请求URI匹配一个给定的模式,你可以使用*通配符来使用之。
    if ($request->is('admin/*')) {
    //
    }
    要取得完整URL,而不是Path,你要用url方法:
    $url = $request->url();

    获得Request对象的方法

    method方法用来返回请求的HTTP操作, 你也可以用 isMethod 方法来验证HTTP动词匹配一个给定的字符串。
    $method = $request->method();

    if ($request->isMethod('post')) {
    //
    }
     

    PSR-7 Requests

    PSR-7标准制定了HTTP信息的接口, 包括Requests 和 Responses, 如果你想要获得一个PSR-7请求的实例,你首先需要安装一些库, Laravel使用Symfony HTTP Message Bridge 组件去把Laravel Requests和 Response转为PSR-7兼容的实现。

    composer require symfony/psr-http-message-bridge

    composer require zendframework/zend-diactoros

    如果你已经装过这些库, 你可以 在路由或控制器中 类型提示这个Request 类型来获得要给RSR-7的提示。
    use PsrHttpMessageServerRequestInterface;

    Route::get('/', function (ServerRequestInterface $request) {
    //
    });

    如果从路由和控制器返回一个 PSR-7响应实例, 它会自动转为一个Laravel响应实例然后被框架所显示。
     

    #取得输入数据

    取得特定输入数据

    你可以通过 IlluminateHttpRequest 的实例,经由几个简洁的方法取得所有的用户输入数据。不需要担心发出请求时使用的 HTTP 请求,取得输入数据的方式都是相同的。

    $name = Request::input('name');

    取得特定输入数据,若没有则取得默认值

    $name = Request::input('name', 'Sally');
    如果是返回数组输入值的forms, 用“点”分隔符来获取数组里面的元素

    $input = $request->input('products.0.name');

    确认是否有输入数据,用has方法,返回true如果有值且不为空。
    if (Request::has('name'))
    {
    //
    }

    取得所有发出请求时传入的输入数据

    $input = Request::all();

    取得部分发出请求时传入的输入数据

    $input = Request::only('username', 'password');

    $input = Request::except('credit_card');

    #旧输入数据

    Laravel 可以让你保留这次的输入数据,直到下一次请求发送前。例如,你可能需要在表单验证失败后重新填入表单值。

    将输入数据存成一次性 Session

    IlluminateHttpRequest实例中的flash 方法会将当前的输入数据存进 session中,所以下次用户发出请求时可以使用保存的数据:

    $request->flash();

    将部分输入数据存成一次性 Session

    Request::flashOnly('username', 'email');
    Request::flashExcept('password');
     

    快闪到Session然后重定向

    你很可能常常需要在重定向至前一页,并将输入数据存成一次性 Session。只要在重定向方法后的链式调用方法中传入输入数据,就能简单地完成。

    return redirect('form')->withInput();

    return redirect('form')->withInput(Request::except('password'));

    取得旧输入数据

    若想要取得前一次请求所保存的一次性 Session,你可以使用 Request 实例中的 old 方法。

    $username = $request->old('username');
     
    如果你想在 Blade 模板显示旧输入数据,可以使用更加方便的辅助方法 old
    {{ old('username') }}
    

     

     

    #Cookies

    Laravel 所建立的 cookie 会加密并且加上认证记号,这代表着被用户擅自更改的 cookie 会失效。从请求中取得Cookie值,你使用cookie方法

    $value = $request->cookie('name');
    还可以使用辅助方法
    $value = Request::cookie('name');
     

    加上新的 Cookie 到响应

    辅助方法 cookie 提供一个简易的工厂方法来产生新的 SymfonyComponentHttpFoundationCookie 实例。可以在 Response 实例之后连接 withCookie 方法带入 cookie 至响应:

    $response = new IlluminateHttpResponse('Hello World');

    $response->withCookie(cookie('name', 'value', $minutes));

    return $response;

    建立永久有效的 Cookie*

    虽然说是「永远」,但真正的意思是五年。

    $response->withCookie(cookie()->forever('name', 'value'));

    Queueing Cookies

    You may also "queue" a cookie to be added to the outgoing response, even before that response has been created:

    <?php namespace AppHttpControllers;

    use Cookie;
    use IlluminateRoutingController;

    class UserController extends Controller
    {
    /**
    * Update a resource
    *
    * @return Response
    */
    public function update()
    {
    Cookie::queue('name', 'value');

    return response('Hello World');
    }
    }

    上传文件

    取得上传文件

    $file = $request->file('photo');

    确认文件是否有上传

    if (Request::hasFile('photo'))
    {
    //
    }

    file 方法返回的对象是 SymfonyComponentHttpFoundationFileUploadedFile 的实例,UploadedFile 继承了 PHP 的 SplFileInfo 类并且提供了很多和文件交互的方法。

    确认上传的文件是否有效

    if (Request::file('photo')->isValid())
    {
    //
    }

    移动上传的文件

    这个move方法从暂时目录移动文件到一个你指定的永久目录, (PHP配置决定暂时目录)

    Request::file('photo')->move($destinationPath);

    Request::file('photo')->move($destinationPath, $fileName);

     

    其他上传文件的方法

    UploadedFile 的实例还有许多可用的方法,可以至 API文档 了解有关这些方法的详细信息。

    (以下内容5.1文档被删,只存在5.0文档中)

    #其他的请求信息

    Request 类提供很多方法检查 HTTP 请求,它继承了 SymfonyComponentHttpFoundationRequest类,下面是一些使用方式。

    取得请求 URI

    $uri = Request::path();

    判断一个请求是否使用了 AJAX

    if (Request::ajax())
    {
    //
    }

    取得请求方法

    $method = Request::method();

    if (Request::isMethod('post'))
    {
    //
    }

    确认请求路径是否符合特定格式

    if (Request::is('admin/*'))
    {
    //
    }

    取得请求 URL

    $url = Request::url();

  • 相关阅读:
    Java 9 揭秘(9. 打破模块封装)
    Java 9 揭秘(8. JDK 9重大改变)
    好书分享 ——《深度工作》
    Java 9 揭秘(7. 创建自定义运行时映像)
    Java 9 揭秘(6. 封装模块)
    如何更好地管理你的精力,时间和专注力实现最佳表现
    这是您一直期待的所有iOS 11功能的屏幕截图
    我为什么不敢也不想写自己的经验和想法?
    无聊? 现在你知道为什么了!
    Java 9 揭秘(5. 实现服务)
  • 原文地址:https://www.cnblogs.com/grkin/p/4607341.html
Copyright © 2020-2023  润新知