<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # Laravel 的 HTTP 請求 Request - [獲取請求](#accessing-the-request) - [請求路徑 & 方法](#request-path-and-method) - [PSR-7 請求](#psr7-requests) - [輸入數據的預處理和規范化](#input-trimming-and-normalization) - [獲取輸入數據](#retrieving-input) - [舊輸入數據](#old-input) - [Cookies](#cookies) - [文件資源](#files) - [獲取上傳文件](#retrieving-uploaded-files) - [儲存上傳文件](#storing-uploaded-files) - [配置可信代理](#configuring-trusted-proxies) <a name="accessing-the-request"></a> ## 獲取請求 要通過依賴注入的方式來獲取當前 HTTP 請求的實例,你應該在控制器方法中使用 `Illuminate\Http\Request` 類型提示。當前的請求實例將通過 [服務容器](/docs/{{version}}/container) 自動注入: <?php namespace App\Http\Controllers; use Illuminate\Http\Request; class UserController extends Controller { /** * 儲存一個新用戶。 * * @param Request $request * @return Response */ public function store(Request $request) { $name = $request->input('name'); // } } #### 依賴注入 & 路由參數 如果控制器方法也有輸入數據是從路由參數中傳入的,只需將路由參數置于其他依賴之后。 例如,你的路由是這樣定義的: Route::put('user/{id}', 'UserController@update'); 只要像下方一樣定義控制器方法,你就可以使用 `Illuminate\Http\Request` 類型提示了,同時獲取到路由參數 `id`: <?php namespace App\Http\Controllers; use Illuminate\Http\Request; class UserController extends Controller { /** * 更新指定的用戶。 * * @param Request $request * @param string $id * @return Response */ public function update(Request $request, $id) { // } } #### 通過路由閉包獲取請求 你也可以在一個路由閉包中使用 `Illuminate\Http\Request` 類型提示。當它執行時,服務容器會自動注入當前請求到閉包中: use Illuminate\Http\Request; Route::get('/', function (Request $request) { // }); <a name="request-path-and-method"></a> ### 請求路徑 & 方法 `Illuminate\Http\Request` 的實例提供了多種方法去檢查應用程序的 HTTP 請求,Laravel 的 `Illuminate\Http\Request` 繼承了 `Symfony\Component\HttpFoundation\Request` 類。下面是該類幾個有用的方法: #### 獲取請求路徑 `path` 方法返回請求路徑信息。所以,如果收到的請求目標地址是 `http://domain.com/foo/bar`,那么 `path` 將會返回 `foo/bar`: $uri = $request->path(); `is` 方法可以驗證收到的請求路徑和指定規則是否匹配。使用這個方法的時候你也可以傳遞一個 `*` 字符作為通配符: if ($request->is('admin/*')) { // } #### 獲取請求的 URL 你可以使用 `url` 或 `fullUrl` 方法去獲取傳入請求的完整 URL。`url` 方法返回不帶有查詢字符串的 URL,而 `fullUrl ` 方法的返回值包含查詢字符串: // Without Query String... $url = $request->url(); // With Query String... $url = $request->fullUrl(); #### 獲取請求方法 對于傳入的請求 `method` 方法將返回 HTTP 的請求方式。你也可以使用 `isMethod` 方法去驗證 HTTP 的請求方式與指定規則是否相配: $method = $request->method(); if ($request->isMethod('post')) { // } <a name="psr7-requests"></a> ### PSR-7 請求 [PSR-7 標準](http://www.php-fig.org/psr/psr-7/)制定的 HTTP 消息接口包含了請求和響應。如果你想使用一個 PSR-7 請求來代替一個 Laravel 請求,那么你首先要安裝幾個函數庫。Laravel 使用了 Symfony 的 HTTP 消息橋接組件,將原來的 Laravel 請求和響應轉換到 PSR-7 所兼容的實現: composer require symfony/psr-http-message-bridge composer require zendframework/zend-diactoros 安裝完這些庫后, 就可以在路由閉包或控制器中,簡單的對請求類型使用類型提示來獲取 PSR-7 的請求: use Psr\Http\Message\ServerRequestInterface; Route::get('/', function (ServerRequestInterface $request) { // }); > {tip} 如果你從路由或者控制器返回了一個 PSR-7 響應實例,那么這個實例將被自動轉換回一個 Laravel 響應實例,同時由框架顯示。 <a name="input-trimming-and-normalization"></a> ## 輸入數據的預處理和規范化 在 Laravel 的全局中間件中默認包含了 `TrimStrings` 和 `ConvertEmptyStringsToNull` 兩個中間件。這些中間件被列在 `App\Http\Kernel` 類中。它們會自動處理所有請求中傳入的字符串字段,比如將空的字符串字段轉變成 `null` 值。你再也不用擔心路由和控制器中數據規范化的問題。 如果你想停用這些功能,你可以在 `App\Http\Kernel` 類的 `$middleware` 屬性中移除這些中間件。 <a name="retrieving-input"></a> ## 獲取輸入數據 #### 獲取所有輸入數據 你可以使用 `all` 方法以 `數組` 形式獲取到所有輸入數據: $input = $request->all(); #### 獲取指定輸入值 你可以通過 `Illuminate\Http\Request` 的實例,借助幾個簡單的方法,就可以獲取到用戶輸入的所有數據。而不需要擔心發起請求時使用了哪一種請求方式,`input` 方法通常被用來獲取用戶輸入數據: $name = $request->input('name'); 你可以給 `input` 方法的第二個參數傳入一個默認值。當請求的輸入數據不存在于此請求時,返回該默認值: $name = $request->input('name', 'Sally'); 如果傳輸表單數據中包含「數組」形式的數據,那么可以使用「點」語法來獲取數組: $name = $request->input('products.0.name'); $names = $request->input('products.*.name'); #### 通過查詢字符串獲取輸入數據 使用 `input` 方法可以從整個請求中獲取輸入數據(包括查詢字符串),而 `query` 方法可以只從查詢字符串中獲取輸入數據: $name = $request->query('name'); 如果請求的查詢字符串數據不存在,則將返回這個方法的第二個參數: $name = $request->query('name', 'Helen'); 你可以不提供參數調用 `query` 方法來將所有查詢字符串作為一個關聯數組取回: $query = $request->query(); #### 通過動態屬性獲取輸入數據 你也可以通過 `Illuminate\Http\Request` 實例的動態屬性來獲取用戶輸入的數據。例如,如果你應用程序表單中包含 `name` 字段,那么可以像這樣訪問提交的值: $name = $request->name; Laravel 在處理動態屬性的優先級是,先從請求的數據中查找,沒有的話再到路由參數中找。 #### 獲取 JSON 輸入信息 當你發送 JSON 請求到應用時,只要請求表頭中設置了 `Content-Type` 為 `application/json`,你就可以直接從 `Input` 方法中獲取 JSON 數據。你也可以通過 「點」語法來讀取 JSON 數組: $name = $request->input('user.name'); #### 獲取部分輸入數據 如果你需要獲取輸入數據的子集,則可以用 `only` 和 `except` 方法。這兩個方法都接收單個 `數組` 或動態列表作為參數: $input = $request->only(['username', 'password']); $input = $request->only('username', 'password'); $input = $request->except(['credit_card']); $input = $request->except('credit_card'); > {tip} `only` 方法會返回所有你指定的鍵值對,但不會返回請求中不存在的鍵值對。 #### 確定是否有輸入值 要判斷請求是否存在該數據,可以使用 `has` 方法。當請求中存在該數據時,`has` 方法就會返回 `true`: if ($request->has('name')) { // } 當提供一個數組作為參數時,`has` 方法將確定是否存在所有指定的值: if ($request->has(['name', 'email'])) { // } 如果你想判斷請求中存在數據并且不為空時,你可以使用 `filled` 方法: if ($request->filled('name')) { // } <a name="old-input"></a> ### 舊輸入數據 Laravel 允許你將本次的輸入數據保留到下一次請求發送前。這個特性在表單驗證錯誤后重新填寫表單相當有用。但是,如果你使用了 Laravel 的 [驗證特性](/docs/{{version}}/validation),你就不需要在手動實現這些方法,因為 Laravel 內置的驗證工具會自動調用他們。 #### 將輸入數據閃存至 Session `Illuminate\Http\Request` 的 `flash` 方法會將當前輸入的數據存進 [session](/docs/{{version}}/session) 中,因此下次用戶發送請求到應用程序時就可以使用它們: $request->flash(); 你也可以使用 `flashOnly` 和 `flashExcept` 方法將當前請求數據的子集保存到 session。這些方法對敏感信息的保護非常有用: $request->flashOnly(['username', 'email']); $request->flashExcept('password'); #### 閃存輸入數據到 Session 后重定向 你可能需要把輸入數據閃存到 session 并重定向到前一個頁面,這時只需要在重定向方法后加上 `withInput` 即可: return redirect('form')->withInput(); return redirect('form')->withInput( $request->except('password') ); #### 獲取舊輸入數據 若要獲取上一次請求后所閃存的輸入數據,則可以使用 `Request` 實例中的 `old` 方法。`old` 方法提供一個簡便的方式從 [Session](/docs/{{version}}/session) 取出被閃存的輸入數據: $username = $request->old('username'); Laravel 也提供了全局輔助函數 `old`。如果你要在 [Blade 模板](/docs/{{version}}/blade) 中顯示舊輸入數據,可以使用更加方便的 `old` 輔助函數。如果舊數據不存在,則返回 `null`: <input type="text" name="username" value="{{ old('username') }}"> <a name="cookies"></a> ### Cookies #### 從請求中獲取 Cookie 值 Laravel 框架創建的每個 cookie 都會被加密并且加上認證標識,這代表著用戶擅自更改的 cookie 都會失效。若要從此次請求獲取 cookie 值,你可以使用 `Illuminate\Http\Request` 實例中的 `cookie` 方法: $value = $request->cookie('name'); #### 將 Cookies 附加到響應 你可以使用 `cookie` 方法附加一個 cookie 到 `Illuminate\Http\Response` 實例。有效 cookie 應該傳遞字段名稱,字段值和過期時間給這個方法: return response('Hello World')->cookie( 'name', 'value', $minutes ); `cookie` 方法還可以接受更多參數,只是使用頻率較低。通常作用是傳遞參數給 PHP 原生 [設置 cookie](http://php.net/manual/en/function.setcookie.php) 方法: return response('Hello World')->cookie( 'name', 'value', $minutes, $path, $domain, $secure, $httpOnly ); #### 生成 Cookie 實例 如果你想要在一段時間以后生成一個可以給定 `Symfony\Component\HttpFoundation\Cookie` 的響應實例,你可以先生成 $cookie 實例,然后再指定給 response 實例,否則這個 cookie 不會被發送回客戶端: $cookie = cookie('name', 'value', $minutes); return response('Hello World')->cookie($cookie); > 譯者注: 關于 Cookie,需要注意一點,默認 Laravel 創建的所有 Cookie 都是加密過的,創建未加密的 Cookie 的方法請見 [【小技巧分享】在 Laravel 中設置沒有加密的 cookie](https://laravel-china.org/topics/1758) <a name="files"></a> ## 文件資源 <a name="retrieving-uploaded-files"></a> ### 獲取上傳文件 你可以使用 `Illuminate\Http\Request` 實例中的 `file` 方法獲取上傳的文件。file 方法返回的對象是 `Symfony\Component\HttpFoundation\File\UploadedFile` 類的實例,該類繼承了 PHP 的 `SplFileInfo` 類,并提供了許多和文件交互的方法: $file = $request->file('photo'); $file = $request->photo; 你可以使用請求的 `hasFile` 方法確認上傳的文件是否存在: if ($request->hasFile('photo')) { // } #### 確認上傳的文件是否有效 除了檢查上傳的文件是否存在外,你也可以通過 `isValid` 方法驗證上傳的文件是否有效: if ($request->file('photo')->isValid()) { // } #### 文件路徑 & 擴展 `UploadedFile` 這個類也包含了訪問文件完整路徑和擴展的方法。`extension` 方法會嘗試根據文件內容猜測文件的擴展名。猜測結果可能不同于客戶端原始的擴展名:  $path = $request->photo->path(); $extension = $request->photo->extension(); #### 其它上傳文件的方法 `UploadedFile` 的實例還有許多可用的方法,可以到該對象的 [API 文檔](http://api.symfony.com/3.0/Symfony/Component/HttpFoundation/File/UploadedFile.html) 了解這些方法的詳細信息。 <a name="storing-uploaded-files"></a> ### 儲存上傳文件 在設置好 [文件系統](/docs/{{version}}/filesystem) 的配置信息后,你可以使用 `UploadedFile` 的 `store` 方法把上傳文件儲存到本地磁盤,或者是亞馬遜 S3 云存儲上。 `store` 方法允許存儲文件到相對于文件系統根目錄配置的路徑。這個路徑不能包含文件名,名稱將使用 MD5 散列文件內容自動生成。 `store` 方法還接受一個可選的第二個參數,用于文件存儲到磁盤的名稱。這個方法會返回文件相對于磁盤根目錄的路徑: $path = $request->photo->store('images'); $path = $request->photo->store('images', 's3'); 如果你不想自動生成文件名,那么可以使用 `storeAs` 方法去設置路徑,文件名和磁盤名作為方法參數: $path = $request->photo->storeAs('images', 'filename.jpg'); $path = $request->photo->storeAs('images', 'filename.jpg', 's3'); <a name="configuring-trusted-proxies"></a> ## 配置可信代理 如果你的應用程序運行在 TLS / SSL 證書負載均衡器后,你可能會注意到你的應用程序有時不會生成 HTTPS 鏈接。通常這是因為你的應用程序被負載均衡器轉發 80 端口的流量,不知道應該生成安全鏈接。 為了解決這個問題,你可以在 Laravel 應用程序中加載 `App\Http\Middleware\TrustProxies` 這個中間件,這使得你可以快速自定義應用程序信任的負載均衡器或代理。你信任的代理列表應該保存在這個中間件的屬性 `$proxies` 數組中。除了配置可信代理,你還可以配置發送給代理的原始請求響應頭: <?php namespace App\Http\Middleware; use Illuminate\Http\Request; use Fideloper\Proxy\TrustProxies as Middleware; class TrustProxies extends Middleware { /** * 這個應用程序的可信代理列表 * * @var array */ protected $proxies = [ '192.168.1.1', '192.168.1.2', ]; /** * 當前代理響應頭映射關系 * * @var array */ protected $headers = [ Request::HEADER_FORWARDED => 'FORWARDED', Request::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR', Request::HEADER_X_FORWARDED_HOST => 'X_FORWARDED_HOST', Request::HEADER_X_FORWARDED_PORT => 'X_FORWARDED_PORT', Request::HEADER_X_FORWARDED_PROTO => 'X_FORWARDED_PROTO', ]; } #### 信任所有代理 如果你使用亞馬遜 AWS 或其他的云負載均衡器,你可能不知道負載均衡器的實際 IP 地址。在這種情況下,你可以使用 `**` 來信任所有代理: /** * 這個應用程序的可信代理列表 * * @var array */ protected $proxies = '**'; --- > {note} 歡迎任何形式的轉載,但請務必注明出處,尊重他人勞動共創開源社區。 > > 轉載請注明:本文檔由 Laravel China 社區 [laravel-china.org](https://laravel-china.org) 組織翻譯,詳見 [翻譯召集帖](https://laravel-china.org/topics/5756/laravel-55-document-translation-call-come-and-join-the-translation)。 > > 文檔永久地址: https://d.laravel-china.org
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看