# Laravel Requests
https://laravel.com/docs/8.x/requests
# Interacting With The Request
Laravel 提供 `Illuminate\Http\Request` 這個 class 去存取進來的請求,透過 dependency injection 去注入 request instance
範例
```php=
<?php
// route file
use App\Http\Controllers\UserController;
Route::put('/user/{id}', [UserController::class, 'update']);
```
```php=
<?php
// Controller file
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
/**
* Store a new user.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function update(Request $request)
{
$name = $request->input('name');
//
}
}
```
# Request methods
```php=
<?php
return [
'path' => $request->path(), // 取得 Request Path
'is' => $request->is('admin/*'), // 是否符合這個 pattern
'routeIs' => $request->routeIs('admin.*'), // 是否符合 named route
'url' => $request->url(), // url 沒有 query string
'fullUrl' => $request->fullUrl(), // url 有 query string
'method' => $request->method(), // 回傳 http verb
'isMethod' => $request->isMethod('post'), // 是不是某個 http verb
// header
'header' => $request->header('X-Header-Name'), // 拿某個 header值
'header' => $request->header('X-Header-Name', 'default'), // 拿某個 header值 沒有就預設
'hasHeader' => $request->header('X-Header-Name'), // 有沒有某個 header
'bearerToken' => $request->bearerToken(), // 從 Authorization header 裡拿
//ip
'ip' => $request->ip(),// 拿取 ip
// Content Negotiation
'contentTypes ' => $request->getAcceptableContentTypes(), // 取得 accept 的 content types
'accepts' => $request->accepts(['text/html', 'application/json']), // 只能接受陣列內的 content types
'prefers' => $request->prefers(['text/html', 'application/json']),
'expectsJson' => $request->expectsJson(), // expects a JSON response
];
```
結果
```json=
{
"path": "api/test",
"is": false,
"routeIs": false,
"url": "http://localhost/api/test",
"fullUrl": "http://localhost/api/test?type=1",
"method": "GET",
"isMethod": false,
"header": "default",
"hasHeader": null,
"bearerToken": null,
"ip": "::1",
"contentTypes ": [
"*/*"
],
"accepts": true,
"prefers": "text/html",
"expectsJson": false
}
```
# PSR-7 Requests
頃向使用 psr-7 request 而非 laravel request 可以參照下面的網址去安裝和使用
https://laravel.com/docs/8.x/requests#psr7-requests
# Input
```php=
<?php
return [
'all' => $request->all(), // 取得所有 input data 回傳是陣列
'collect' => $request->collect(), // 取得所有 input data 回傳是collection
'collect_subset' => $request->collect('users')->each(function ($user) {
// 取得某個 subset 並且用 collection 的形式去跑
}),
'input' => $request->input('name'), // 取得某個key的值
'default_input' => $request->input('name', 'Sally'), // 取得某個key的值沒有就預設
'dot' => $request->input('products.0.name'),
'dot_wildcard' => $request->input('products.*.name'),
'query_string' => $request->query('name'), // 取得 query string variable
'query_string_default' => $request->query('name', 'Helen'), // 取得 query string variable 沒有就預設
'json' => $request->input('user.name'), // json input value
'boolean' => $request->boolean('archived'), // true for 1, "1", true, "true", "on", and "yes"
// 'date' => $request->date('birthday'), // carbon instance
'only' => $request->only(['username', 'password']), // 只有某些值
'except' => $request->except(['credit_card']), // 除了某些值
'has' => $request->has('name'), // 是否有某個值
'has_multiple' => $request->has(['name', 'email']), // 是否有某些值
// 'flash' => $request->flash() 將 current input to the session
'cookie' => $request->cookie('name'), // 取得 cookie 的某個值 所有laravel 的 cookie 都會被加密
//file
'file' => $request->file('photo'), // 取得檔案會是 Illuminate\Http\UploadedFile 的格式
'hasFile' => $request->hasFile('photo'), // 是否有這個檔案
// 'file_path' => $request->photo->path() // 取得 file path
// 'extension' => $request->photo->extension() // 取得 file extension
// 'store' => $request->photo->store('images', 's3') // 儲存檔案
// 'storeAs' => $request->photo->storeAs('images', 'filename.jpg', 's3') // 另存檔案名稱為
];
```
結果
```json=
{
"all": {
"type": "1"
},
"collect": {
"type": "1"
},
"collect_subset": [],
"input": null,
"default_input": "Sally",
"dot": null,
"dot_wildcard": null,
"query_string": null,
"query_string_default": "Helen",
"json": null,
"boolean": false,
"only": [],
"except": {
"type": "1"
},
"has": false,
"has_multiple": false,
"cookie": null,
"file": null,
"hasFile": false
}
```
###### tags: `2022` `laravel` `request` `file`
{%hackmd BJrTq20hE %}