درخواست های HTTP
دسترسی به درخواست
Illuminate\Http\Request
برای به دست آوردن نمونه ای از درخواست HTTP فعلی از طریق تزریق وابستگی،
باید کلاس را در متد کنترلر خود
تایپ کنید .
نمونه درخواست ورودی به طور خودکار توسط
کانتینر سرویس
تزریق می شود :
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; 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');
همچنان می توانید با تعریف روش کنترلر خود به صورت زیر ، پارامتر مسیر خود
را تایپ کنید
Illuminate\Http\Request
و به آن دسترسی پیدا کنید :
id
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class UserController extends Controller{ /** * Update the specified user. * * @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) { //});
درخواست مسیر و روش
نمونه
Illuminate\Http\Request
روش های مختلفی را برای بررسی درخواست HTTP برای برنامه شما ارائه می دهد و
Symfony\Component\HttpFoundation\Request
کلاس را گسترش می دهد.
در ادامه به چند مورد از مهم ترین روش ها خواهیم پرداخت.
بازیابی مسیر درخواست
متد
path
اطلاعات مسیر درخواست را برمی گرداند.
بنابراین، اگر درخواست ورودی در هدف قرار گیرد
http://domain.com/foo/bar
،
path
متد برمی گردد
foo/bar
:
$uri = $request->path();
این
is
روش به شما اجازه می دهد تا بررسی کنید که مسیر درخواست ورودی با یک الگوی
مشخص مطابقت دارد.
هنگام استفاده از این روش ، می توانید از
*
کاراکتر به عنوان علامت عام استفاده کنید:
if ($request->is('admin/*')) { //}
بازیابی URL درخواست
برای بازیابی URL کامل برای درخواست ورودی، می توانید از روش های
url
یا استفاده کنید
fullUrl
.
متد
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')) { //}
درخواست های PSR-7
استاندارد PSR -7 رابط هایی را برای پیام های HTTP از جمله درخواست ها و پاسخ ها مشخص می کند. اگر می خواهید به جای درخواست لاراول نمونه ای از درخواست PSR-7 را دریافت کنید، ابتدا باید چند کتابخانه را نصب کنید. لاراول از مؤلفه Symfony HTTP Message Bridge برای تبدیل درخواست ها و پاسخ های معمولی لاراول به پیاده سازی های سازگار با PSR-7 استفاده می کند:
composer require symfony/psr-http-message-bridgecomposer require nyholm/psr7
هنگامی که این کتابخانه ها را نصب کردید، می توانید یک درخواست PSR-7 را با تایپ کردن رابط درخواست در روش بسته شدن مسیر یا کنترلر خود دریافت کنید:
use Psr\Http\Message\ServerRequestInterface; Route::get('/', function (ServerRequestInterface $request) { //});
اگر یک نمونه پاسخ PSR-7 را از یک مسیر یا کنترلر برگردانید، به طور خودکار به یک نمونه پاسخ لاراول تبدیل شده و توسط چارچوب نمایش داده می شود.
برش و عادی سازی ورودی
به طور پیش فرض، لاراول شامل میان افزار
TrimStrings
و
ConvertEmptyStringsToNull
میان افزار در پشته میان افزار جهانی برنامه شما می شود.
این میان افزارها در پشته توسط
App\Http\Kernel
کلاس فهرست شده اند.
این میانافزار بهطور خودکار تمام فیلدهای رشته ورودی در درخواست را برش
میدهد، و همچنین هر فیلد رشته خالی را به
null
.
این به شما امکان می دهد نگران این نگرانی های عادی سازی در مسیرها و
کنترلرهای خود نباشید.
اگر میخواهید این رفتار را غیرفعال کنید، میتوانید دو میانافزار را از
پشته میانافزار برنامهتان با حذف آنها از ویژگی کلاس
$middleware
خود حذف کنید
App\Http\Kernel
.
بازیابی ورودی
بازیابی همه داده های ورودی
همچنین می توانید تمام داده های ورودی را با
array
استفاده از
all
روش زیر بازیابی کنید:
$input = $request->all();
بازیابی یک مقدار ورودی
با استفاده از چند روش ساده، می توانید به تمام ورودی های کاربر از
Illuminate\Http\Request
نمونه خود دسترسی داشته باشید بدون اینکه نگران باشید که کدام فعل HTTP برای
درخواست استفاده شده است.
صرف نظر از فعل HTTP، این
input
روش ممکن است برای بازیابی ورودی کاربر استفاده شود:
$name = $request->input('name');
می توانید یک مقدار پیش فرض را به عنوان آرگومان دوم به
input
متد ارسال کنید.
اگر مقدار ورودی درخواستی در درخواست وجود نداشته باشد، این مقدار برگردانده
می شود:
$name = $request->input('name', 'Sally');
هنگام کار با فرم هایی که حاوی ورودی های آرایه هستند، برای دسترسی به آرایه ها از نماد "نقطه" استفاده کنید:
$name = $request->input('products.0.name'); $names = $request->input('products.*.name');
شما می توانید
input
متد را بدون هیچ آرگومان فراخوانی کنید تا همه مقادیر ورودی را به عنوان یک
آرایه انجمنی بازیابی کنید:
$input = $request->input();
بازیابی ورودی از رشته Query
در حالی که
input
متد مقادیر را از کل بار بار درخواست (شامل رشته پرس و جو) بازیابی می کند،
این
query
روش فقط مقادیر را از رشته پرس و جو بازیابی می کند:
$name = $request->query('name');
اگر داده های مقدار رشته کوئری درخواستی وجود نداشته باشد، آرگومان دوم به این متد برگردانده می شود:
$name = $request->query('name', 'Helen');
شما می توانید
query
متد را بدون هیچ آرگومان فراخوانی کنید تا تمام مقادیر رشته پرس و جو را به
عنوان یک آرایه انجمنی بازیابی کنید:
$query = $request->query();
بازیابی ورودی از طریق ویژگی های دینامیک
همچنین میتوانید با استفاده از ویژگیهای پویا در
Illuminate\Http\Request
نمونه به ورودی کاربر دسترسی داشته باشید.
به عنوان مثال، اگر یکی از فرم های برنامه شما حاوی یک
name
فیلد باشد، می توانید به مقدار فیلد مانند زیر دسترسی داشته باشید:
$name = $request->name;
هنگام استفاده از ویژگی های پویا، لاراول ابتدا به دنبال مقدار پارامتر در بار درخواست می شود. اگر وجود نداشته باشد، لاراول فیلد را در پارامترهای مسیر جستجو می کند.
بازیابی مقادیر ورودی JSON
هنگام ارسال درخواستهای JSON به برنامه خود، میتوانید از طریق روش به
دادههای JSON دسترسی داشته باشید
input
تا زمانی که
Content-Type
هدر درخواست به درستی روی
application/json
.
حتی ممکن است از نحو "نقطه" برای حفاری در آرایه های JSON استفاده کنید:
$name = $request->input('user.name');
بازیابی مقادیر ورودی بولی
هنگامی که با عناصر HTML مانند چک باکس ها سر و کار دارید، برنامه شما ممکن
است مقادیر "واقعی" را دریافت کند که در واقع رشته هستند.
مثلاً «درست» یا «روشن».
برای راحتی، می توانید از
boolean
روش برای بازیابی این مقادیر به عنوان بولی استفاده کنید.
این
boolean
روش
true
برای 1، "1"، true، "true"، "on" و "yes" برمی گردد.
همه مقادیر دیگر باز خواهند گشت
false
:
$archived = $request->boolean('archived');
بازیابی بخشی از داده های ورودی
اگر نیاز به بازیابی زیرمجموعه ای از داده های ورودی دارید، می توانید از
روش
only
و استفاده کنید
except
.
هر دوی این روش ها یک
array
لیست واحد یا پویا از آرگومان ها را می پذیرند:
$input = $request->only(['username', 'password']); $input = $request->only('username', 'password'); $input = $request->except(['credit_card']); $input = $request->except('credit_card');
متد
only
تمام جفتهای کلید/مقدار مورد درخواست شما را برمیگرداند. با این حال، جفتهای کلید/مقدار را که در درخواست وجود ندارد، برنمیگرداند.
تعیین اینکه آیا یک مقدار ورودی وجود دارد یا خیر
has
برای تعیین اینکه آیا مقداری در درخواست وجود دارد یا خیر،
باید از روش استفاده کنید .
اگر مقدار در درخواست موجود باشد،
متد
has
برمی گردد :
true
if ($request->has('name')) { //}
هنگامی که یک آرایه داده می شود،
has
روش تعیین می کند که آیا همه مقادیر مشخص شده وجود دارند یا خیر:
if ($request->has(['name', 'email'])) { //}
اگر هر یک از مقادیر مشخص شده وجود داشته باشد،
متد
hasAny
برمی گردد :
true
if ($request->hasAny(['name', 'email'])) { //}
اگر می خواهید تعیین کنید که آیا مقداری در درخواست وجود دارد و خالی نیست،
می توانید از
filled
روش استفاده کنید:
if ($request->filled('name')) { //}
برای تعیین اینکه آیا کلید داده شده در درخواست وجود ندارد، می توانید از
missing
روش زیر استفاده کنید:
if ($request->missing('name')) { //}
ورودی قدیمی
لاراول به شما اجازه می دهد تا ورودی یک درخواست را در طول درخواست بعدی حفظ کنید. این ویژگی به ویژه برای پر کردن مجدد فرم ها پس از شناسایی خطاهای اعتبارسنجی مفید است. با این حال، اگر از ویژگیهای اعتبارسنجی لاراول استفاده میکنید ، بعید است که نیاز به استفاده دستی از این روشها داشته باشید، زیرا برخی از امکانات اعتبارسنجی داخلی لاراول آنها را بهطور خودکار فراخوانی میکنند.
چشمک زدن ورودی به جلسه
متد
flash
موجود در
Illuminate\Http\Request
کلاس ورودی فعلی را به
جلسه
فلش می کند تا در هنگام درخواست بعدی کاربر از برنامه در دسترس باشد:
$request->flash();
همچنین میتوانید از روشهای
flashOnly
و
flashExcept
برای فلش کردن زیرمجموعهای از دادههای درخواست در جلسه استفاده کنید.
این روش ها برای دور نگه داشتن اطلاعات حساس مانند رمزهای عبور از جلسه مفید
هستند:
$request->flashOnly(['username', 'email']); $request->flashExcept('password');
ورودی فلش و سپس تغییر مسیر
از آنجایی که اغلب می خواهید ورودی را به جلسه فلش کنید و سپس به صفحه قبلی
هدایت کنید، می توانید به راحتی با استفاده از روش زیر، ورودی زنجیره ای را روی یک تغییر مسیر چشمک زن کنید
withInput
:
return redirect('form')->withInput(); return redirect('form')->withInput( $request->except('password'));
بازیابی ورودی قدیمی
برای بازیابی ورودی فلش شده از درخواست قبلی، از
old
روش موجود در
Request
نمونه استفاده کنید.
این
old
روش داده های ورودی فلش شده قبلی را از
جلسه
خارج می کند :
$username = $request->old('username');
لاراول همچنین یک کمک کننده جهانی ارائه می دهد
old
.
اگر ورودی قدیمی را در قالب Blade
نمایش می دهید
، استفاده از
old
کمک کننده راحت تر است.
اگر ورودی قدیمی برای فیلد داده شده وجود نداشته باشد،
null
برگردانده می شود:
<input type="text" name="username" value="{{ old('username') }}">
بیسکویت ها
بازیابی کوکی ها از درخواست ها
تمام کوکی های ایجاد شده توسط فریم ورک لاراول رمزگذاری شده و با یک کد
احراز هویت امضا می شوند، به این معنی که اگر توسط مشتری تغییر داده شده باشند، نامعتبر تلقی می شوند.
برای بازیابی یک مقدار کوکی از درخواست،
cookie
از روش یک
Illuminate\Http\Request
نمونه استفاده کنید:
$value = $request->cookie('name');
از طرف دیگر، می توانید از
Cookie
نما برای دسترسی به مقادیر کوکی استفاده کنید:
use Illuminate\Support\Facades\Cookie; $value = Cookie::get('name');
پیوست کردن کوکی ها به پاسخ ها
Illuminate\Http\Response
با استفاده از این روش
میتوانید یک کوکی را به یک نمونه خروجی پیوست کنید
cookie
.
شما باید نام، مقدار و تعداد دقیقه هایی که کوکی باید معتبر در نظر گرفته
شود را به این روش ارسال کنید:
return response('Hello World')->cookie( 'name', 'value', $minutes);
این
cookie
روش همچنین چند آرگومان بیشتر را می پذیرد که کمتر مورد استفاده قرار می
گیرند.
به طور کلی، این آرگومان ها همان هدف و معنای آرگومان هایی را دارند که به
متد
setcookie
بومی PHP داده می شود :
return response('Hello World')->cookie( 'name', 'value', $minutes, $path, $domain, $secure, $httpOnly);
از طرف دیگر، میتوانید از
Cookie
نما برای «صف» کردن کوکیها برای پیوست کردن به پاسخ خروجی از برنامهتان
استفاده کنید.
متد
queue
یک
Cookie
نمونه یا آرگومان های مورد نیاز برای ایجاد یک
Cookie
نمونه را می پذیرد.
این کوکیها قبل از ارسال به مرورگر به پاسخ خروجی پیوست میشوند:
Cookie::queue(Cookie::make('name', 'value', $minutes)); Cookie::queue('name', 'value', $minutes);
ایجاد نمونه های کوکی
اگر میخواهید نمونهای ایجاد کنید
Symfony\Component\HttpFoundation\Cookie
که بتواند در زمان دیگری به یک نمونه پاسخ داده شود، میتوانید از
cookie
راهنمای جهانی استفاده کنید.
این کوکی به مشتری ارسال نمی شود مگر اینکه به یک نمونه پاسخ پیوست شده
باشد:
$cookie = cookie('name', 'value', $minutes); return response('Hello World')->cookie($cookie);
کوکیها زود انقضا میشوند
شما می توانید یک کوکی را با انقضای آن از طریق
forget
روش نما حذف کنید
Cookie
:
Cookie::queue(Cookie::forget('name'));
همچنین، میتوانید کوکی منقضی شده را به یک نمونه پاسخ پیوست کنید:
$cookie = Cookie::forget('name'); return response('Hello World')->withCookie($cookie);
فایل ها
بازیابی فایل های آپلود شده
شما می توانید از یک
Illuminate\Http\Request
نمونه با استفاده از
file
روش یا با استفاده از ویژگی های پویا به فایل های آپلود شده دسترسی داشته
باشید.
متد
file
نمونه ای از
Illuminate\Http\UploadedFile
کلاس را برمی گرداند که
SplFileInfo
کلاس PHP را گسترش می دهد و روش های مختلفی را برای تعامل با فایل ارائه می
دهد:
$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 کلاس را
بررسی کنید .
ذخیره سازی فایل های آپلود شده
برای ذخیره یک فایل آپلود شده، معمولاً از یکی از سیستم های فایل
پیکربندی شده خود استفاده می کنید
.
کلاس روشی
UploadedFile
دارد
store
که یک فایل آپلود شده را به یکی از دیسک های شما منتقل می کند، که ممکن است
مکانی در سیستم فایل محلی شما یا حتی یک مکان ذخیره سازی ابری مانند Amazon S3 باشد.
این
store
روش مسیری را میپذیرد که فایل باید نسبت به دایرکتوری ریشه پیکربندیشده
سیستم فایل ذخیره شود.
این مسیر نباید حاوی نام فایل باشد، زیرا یک شناسه منحصربفرد به طور خودکار
برای خدمت به عنوان نام فایل ایجاد می شود.
این
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');
پیکربندی پراکسی های مورد اعتماد
هنگامی که برنامه های خود را پشت یک متعادل کننده بار اجرا می کنید که گواهی های TLS / SSL را خاتمه می دهد، ممکن است متوجه شوید که برنامه شما گاهی اوقات پیوندهای HTTPS ایجاد نمی کند. معمولاً این به این دلیل است که برنامه شما در حال ارسال ترافیک از بار متعادل کننده شما در پورت 80 است و نمی داند که باید پیوندهای امن ایجاد کند.
برای حل این مشکل، میتوانید از
App\Http\Middleware\TrustProxies
میانافزاری استفاده کنید که در برنامه لاراول شما گنجانده شده است، که به
شما امکان میدهد به سرعت بار متعادل کنندهها یا پروکسیهایی را که باید مورد اعتماد برنامه شما باشند، سفارشی
کنید.
$proxies
پروکسی های مورد اعتماد شما باید به عنوان یک آرایه در ویژگی این میان افزار
فهرست شوند .
علاوه بر پیکربندی پراکسی های مورد اعتماد، می توانید پروکسی را
$headers
که باید قابل اعتماد باشد پیکربندی کنید:
<?php namespace App\Http\Middleware; use Fideloper\Proxy\TrustProxies as Middleware;use Illuminate\Http\Request; class TrustProxies extends Middleware{ /** * The trusted proxies for this application. * * @var string|array */ protected $proxies = [ '192.168.1.1', '192.168.1.2', ]; /** * The headers that should be used to detect proxies. * * @var int */ protected $headers = Request::HEADER_X_FORWARDED_ALL;}
اگر از AWS Elastic Load Balancing استفاده می کنید،
$headers
مقدار شما باید باشدRequest::HEADER_X_FORWARDED_AWS_ELB
. برای اطلاعات بیشتر در مورد ثابت هایی که ممکن است در ویژگی استفاده شوند$headers
، اسناد Symfony را در مورد پراکسی های قابل اعتماد بررسی کنید .
اعتماد به همه پروکسی ها
اگر از Amazon AWS یا یکی دیگر از ارائه دهندگان متعادل کننده بار «ابر»
استفاده می کنید، ممکن است آدرس IP متعادل کننده های واقعی خود را ندانید.
در این مورد، می توانید
*
برای اعتماد به همه پراکسی ها استفاده کنید:
/** * The trusted proxies for this application. * * @var string|array */protected $proxies = '*';