درخواست های HTTP در لاراول

درخواست های HTTP در لاراول

درخواست های HTTP در لاراول یک از موضوعات پایه در فریم ورک لاراول می باشد و تمام برنامه نویسان این بخش باید به مدیریت درخواست های HTTP مسلط باشند. درخواست های HTTP از سمت کاربر کلاینت به سمت سرور ارسال می شود کلاینت ها همان مرورگر شما می باشد که با استفاده از پروتکل TCP/IP درخواست های خود را اعم از ویدئو ، تصاویر ، متن و ... در بستر اینترنت ارسال می کنند.

زمان مطالعه: 3 دقیقه
بازدید: 1163
پرسش و پاسخ: 0

دسترسی به درخواست ها در لاراول

برای دسترسی به درخواست فعلی از طریق HTTP با استفاده از کلاس Request در لاراول به راحتی انجام می شود شما می توانید از عملیات تزریق وابستگی در متد خود به درخواست های HTTP دسترسی داشته باشید در هنگام تزریق وابستگی کلاس Request به هدر های کلاس فعلی شما با آدرس Illuminate\Http\Request اضافه می شود به مثال ذیل که به روش service container (تزریق وابستگی) انجام شده توجه فرمایید

<?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');

        //
    }
}

تزریق وابستگی در مسیرهای دارای پارامتر ورودی

اگر متد کنترلر شما دارای پارمتر ورودی باشد باید این پارامتر ورودی را بعد از تمام تزریق وابستگی ها فراخوانی کنید مسیر ذیل را در نظر بگیرید که دارای پارامتر ورودی id می باشد

Route::put('user/{id}', 'UserController@update');

اگر بخواهید درخواست های HTTP دیگر را نیز در این متد دریافت کنید با استفاده از تزریق وابستگی قبل از پارامتر ورودی متد این کار را انجام دهید

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)
    {
        //
    }
}

دسترسی به درخواستها در فایل های مسیردهی لاراول

شما می توانید در فایل مسیر خود نیز به Request های HTTP  دسترسی داشته باشید تزریق وابستگی در مسیر نیز به صورت خودکار و جادویی درخواست ها را برای شما مدیریت می کند. 

use Illuminate\Http\Request;

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

آموزش لاراول (laravel) دوره جامع پروژه محور ساخت فروشگاه اینترنتی

اطلاعات پایه ای Request ها در فریم ورک لاراول

کلاس Illuminate\Http\Request یک مجموعه متد در اختیار ما قرار می دهد که به وسیله ی آن می توانید درخواست HTTP به اپلیکیشن را بررسی و معاینه نمایید. کلاس Illuminate\Http\Request لاراول از کلاسSymfony\Component\HttpFoundation\Request ارث بری دارد. در زیر تعدادی از متدهای این کلاس را با شرح کاربرد ذکر می کنیم

بازیابی URL یک درخواست

متد Path در کلاس Request اطلاعات URL را برمی گرداند مثلا اگر URL شما http://domain.com/foo/bar باشد با درخواست متد Path از Request خود خروجی foo/bar را مشاهده خواهید کرد

$uri = $request->path();

متد is نیز به شما کمک می کند تا تشخیص دهید که آیا متد درخواستی با الگوی خاصی برابر است یا نه. همچنین برای تشخیص قسمت هایی مثل id و مسیرهای طولانی که با prefix مشخص شده اند می توانید از کاراکتر *  استفاده کنید

به این مثال ها توجه کنید

if ($request->is('admin/*')) {
    //
}

برای درک این ویژگی ها مثلا در یک میدل ویر برای کنترل مسیرهای درخواستی یک کنترلر از نوع resource با نام Azmoon  از روش ذیل استفاده می کنیم

چک کردن درخواست متد index 

  if($request->is('Azmoon'))
        {
           //
        }

چک کردن درخواست متد create 

 if($request->is('Azmoon/create'))
        {
            //
        }

چک کردن درخواست متد show

if($request->is('Azmoon/*'))
        {
            //
        }

چک کردن درخواست متد edit

if($request->is('Azmoon/*/edit'))
        {
            //
        }

چک کردن درخواست متد Delete

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

بازیابی URL درخواستی

با استفاده از متد url یا fullurl می توانید آدرس کامل درخواست را بازیابی کنید متد url آدرس جاری را بدون قسمت کوئری برمی گرداند و متد fullurl آدرس را به صورت کامل همراه با قسمت کوئری برمی گرداند. (کوئری در url همان قسمت های بعد از علامت سوال می باشد)

// Without Query String...
$url = $request->url();

// With Query String...
$url = $request->fullUrl();

نوع متد درخواستی

انواع متد درخواستی مثل post , get , delete و می باشد که می توانید با استفاده از متد isMethod نوع آن را در درخواست ورودی تشخیص دهید

$method = $request->method();

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

درخواست های PSR-7

استاندارد PSR-7 رابط هایی (interface) را برای پیغام های HTTP از جمله درخواست ها و پاسخ ها طراحی کرده و در اختیار توسعه دهندگان قرار می دهد. برای دریافت نمونه ای از درخواست PSR-7، ابتدا می بایست تعدادی کتابخانه نصب نمایید. لاراول با بهره گیری از کامپوننت Symfony HTTP Message Bridge، درخواست ها و پاسخ های متعارف لاراول را به پیاده سازی های معادل آن در درخواست های PSR-7 (به درخواست های معادل PSR-7 آن ها) تبدیل می کند:

composer require symfony/psr-http-message-bridge
composer require zendframework/zend-diactoros

پس از نصب کتابخانه های لازم، می توانید با اعلان نوع درخواست (type-hint کردن نوع request) در route یا کنترلر خود، به راحتی یک درخواستPSR-7 دریافت نمایید:

use Psr\Http\Message\ServerRequestInterface;

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

پس از دریافت یک نمونه پاسخ از نوعPSR-7 از route یا کنترلر، آن درخواست به صورت خودکار به پاسخ از نوع متعارف در لاراول تبدیل شده و سپس توسط فریم ورک مورد نظر به نمایش در می آید.

دریافت و بازیابی ورودی ها در لاراول

لاراول در فایل kernel.php دو نوع میدل ویر با عناوین TrimStrings و ConvertEmptyStringsToNull تعریف کرده است که بر روی تمام درخواست های ورودی اعمال می شود که عملیات Trim (حذف فضاهای خالی قبل و بعد ورودی) و تبدیل انواع ورودی های خالی از نوع رشته به نوع null را انجام می دهند که کمک می کنند نوع ورودی ها نرمال شده و قابل پردازش دریافت کنید. برای غیرفعال کردن این ویژگی باید میدل ویر های یاد شده را از فایل kernel.php بخش middleware حذف کنید.

دریافت ورودی ها در لاراول

دریافت تمام ورودی ها (input)

برای دریافت تمام ورودی ها به صورت آرایه از متد all استفاده کنید

$input = $request->all();

دریافت فقط یک ورودی

اگر تا این قسمت دقت کرده باشید نوع متد ارسالی مثل post , get و ... با استفاده از کلاس Illuminate\Http\Request یا تزریق این کلاس در متد مربوطه، برای ما مهم نبوده است و فریم ورک قدرتمند لاراول این عملیات را برای ما انجام می دهد بدون اینکه متوجه آن باشیم. همچنین برای دریافت فقط یک ورودی از تمام ورودی های می توانید از متد input استفاده کنید

$name = $request->input('name');

نکته بدون استفاده از متد input نیز می توان ورودی مورد درخواست را با روش ذیل دریافت کرد

$name = $request->name;

گاهی ممکن است نوع ورودی شما مقداردهی نشده باشد و شما می خواهید مقداردهی پیش فرضی برای آن انجام دهید که آرگومان دوم مقدار پیش فرض خواهد بود در متد input:

$name = $request->input('name', 'behzad');

برای نوع ورودی های آرایه ای نیز می توانید از کاراکتر نقطه . استفاده کنید

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

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

اگر متد input را بدون نام استفاده کنید مثل متد all عمل خواهد کرد و تمام ورودی ها را بر می گرداند

$input = $request->input();

دریافت ورودی ها از نوع query string (همان کوئری های آدرس که با علامت سوال جدا شده اند)

نوع متد input تمام مقادیر را می توانست بازیابی کند اما گاهی شما می خواهید یک نوع وردی کوئری را فقط دریافت کنید پس از نوع متد query استفاده کنید

$name = $request->query('name');

گاهی ممکن است نوع ورودی شما مقداردهی نشده باشد و شما می خواهید مقداردهی پیش فرضی برای آن انجام دهید که آرگومان دوم مقدار پیش فرض خواهد بود در متد query:

$name = $request->query('name', 'behzad');

اگر متد query را بدون عنوان کردن مقداری به کار ببرید تمام ورودی های از نوع کوئری را دریافت خواهید کرد

$query = $request->query();

دریافت ورودی با استفاده از نام به صورت مستقیم

همانطور که قبلا اشاره کردیم شما می توانید بدون ذکر کردن نوع متد input نیز ورودی خود را با نام آن دریافت کنید

$name = $request->name;

بازیابی مقادیر وردی Json

هنگام ارسال درخواست های Json در پروژه خود که دارای هدر application/json هستند شما می توانید ورودی ها را با همان متد input دریافت کنید و برای یک ورودی آرایه ای نیز می توانید از کاراکتر نقطه . برای بازیابی یک مقدار در آرایه مورد نظر خود استفاده کنید

$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');

چک کردن وجود داشتن ورودی

برای چک کردن وجود داشتن یک ورودی می توانید از متد has استفاده کنید این متد در صورت وجود داشتن ورودی مقدار true برمی گرداند

if ($request->has('name')) {
    //
}

متد has می تواند به صورت آرایه ای نیز استفاده شود و اگر تمام ورودی ها مقداردهی شده باشند مقدار true برمی گرداند

if ($request->has(['name', 'email'])) {
    //
}

متد hasAny مقدار true برمی گرداند اگر یکی از ورودی ها مقدار دهی شده باشد.

if ($request->hasAny(['name', 'email'])) {
    //
}

اگر می خواهید مشخص کنید که یک ورودی خالی نیست یا پر شده است می توانید از متد filled نیز استفاده کنید

if ($request->filled('name')) {
    //
}

ورودی قدیمی old input در لاراول

لاراول به شما امکان نگهداری ورودی را تا زمان دریافت ورودی دیگر می دهد این ویژگی مخصوصا در اعتبارسنجی فرم ها بسیار مفید است اگر به درستی از این ویژگی استفاده کنید نیازی به استفاده به صورت دستی نخواهید داشت و خود لاراول خطای برگشتی را به قسمت پیش بینی شده انتساب می دهد اگر می خواهید مثال های کاملی از نحوه استفاده old input nv انواع نوع های input استفاده کنید حتما مقاله laravel old input را مطالعه کنید.

قرار دادن input در session با متد flash

متد flash در کلاس request ورودی فعلی را در یک session ذخیره می کند تا بتوان در طول درخواست بعدی به ورودی ها دسترسی داشت.

$request->flash();

شاید بخواهید از متد flashOnly یا flashExcept برای اینکار به صورت ذیل استفاده کنید 

$request->flashOnly(['username', 'email']);

$request->flashExcept('password');

قرار دادن ورودی Session و بازگشت (redirect)

متد withInput به شما کمک می کند تا ورودی های خود را در یک session ذخیره کنید و سپس به مسیر دلخواه خود بازگردید و اگر نیازی به ورودی های قبل داشتید به راحتی فراخوانی و استفاده کنید

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

return redirect('form')->withInput(
    $request->except('password')
);

بازیابی داده های قبلی در لاراول

اگر می خواهید به ورودی های قبلی دسترسی داشته باشید از متد old استفاده کنید مثلا برای نمایش username قبلی به صورت ذیل عمل کنید

$username = $request->old('username');

لاراول با استفاده از helper های global اجازه می دهد شما داده های قبلی را در blade ها نیز بازیابی کنید و اگر فیلد درخواستی شما مقداری نداشته باشد مقدار null خواهد بود

<input type="text" name="username" value="{{ old('username') }}">

کوکی ها در لاراول (Cookies)

بازیابی کوکی ها در Request

تمام کوکی ها در فریم ورک لاراول به صورت رمزنگاری و امضا شده به وسیله یک کد احراز هویت ایجاد می شوند و هرگونه تغییری در مقدار کوکی ها موجب نامعتبر شدن آنها خواهد شد برای دسترسی به یک کوکی می توانید از متد cookie در نمونه کلاس request استفاده کنید

$value = $request->cookie('name');

همچنین می توانید بدون استفاده از request و با نمونه facade به یک کوکی به شکل ذیل دسترسی پیدا کنید

use Illuminate\Support\Facades\Cookie;

$value = Cookie::get('name');

الحاق کوکی به یک پاسخ (response)

با متد cookie می توانید یک کوکی را به پاسخ (response) متد الصاق کنید این متد نام ، مقدار و عددی براساس دقیقه که زمان اعتبار کوکی شما خواهد بود را دریافت می کند

return response('Hello World')->cookie(
    'name', 'value', $minutes
);

متد cookie می تواند آرگومان های بیشتری دریافت کند این آرگومان ها همان آرگومان هایی می باشد که شما در php native استفاده می کردید

return response('Hello World')->cookie(
    'name', 'value', $minutes, $path, $domain, $secure, $httpOnly
);

همچنین می توانید کوکی ها را به صورت صف بندی به پاسخ های خود الصاق کنید متد queue یک نمونه کوکی یا آرگومان های لازم برای ایجاد یک نمونه کوکی را می پذیرد. این کوکی ها قبل از ارسال به مرورگر به پاسخ خروجی وصل می شوند:

Cookie::queue(Cookie::make('name', 'value', $minutes));

Cookie::queue('name', 'value', $minutes);

ایجاد نمونه کوکی در لاراول

اگر مایل هستید می توانید یک کوکی عمومی با استفاده از Symfony\Component\HttpFoundation\Cookie ایجاد کنید و بعدا به یک پاسخ آن را الصاق کنید این نوع کوکی برای کلاینت ست نمی شود مگر اینکه در پاسخ خود به کلاینت این نوع کوکی را نیز الحاق کنید

$cookie = cookie('name', 'value', $minutes);

return response('Hello World')->cookie($cookie);

فایل ها در لاراول

بازیابی فایل آپلودی

برای دسترسی به یک فایل ارسال شده از سمت کلاینت با استفاده از نمونه request ساخته شده از کلاس Illuminate\Http\Request می توانید از متد file استفاده کنید متد file یک نمونه از کلاس Illuminate\Http\UploadedFile را برمی گرداند که همان کلاس SplFileInfo در php را گسترش داده است همچنین می توانید با ذکر متد file یا بدون آن به فایل ارسالی دسترسی داشته باشید.

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

$file = $request->photo;

برای اینکه مطمئن باشید فیلد مورد نظرتان با یک فایل مقداردهی شده است یا نه از متد hasFile استفاده کنید

if ($request->hasFile('photo')) {
    //
}

اعتبارسنجی آپلود موفق در لاراول

علاوه بر بررسی وجود file، می توانید با متد isValid بررسی کنید که در آپلود فایل مشکلی وجود ندارد:

if ($request->file('photo')->isValid()) {
    //
}

بازیابی مسیر و پسوند فایل آپلودی

کلاس UploadedFile شامل متدهایی مثل دسترسی به مسیر کامل و پسوند فایل آپلودی می باشد متد extension سعی می کند پسوند فایل آپلودی در لاراول را از روی محتوای فایل تشخیص دهد که این پسوند احتمال دارد با پسوند واقعی فایل نیز متفاوت باشد.

$path = $request->photo->path();

$extension = $request->photo->extension();

سایر متدهای کار با فایل در لاراول

متدهای مختلف دیگری نیز در کلاس UploadedFile وجود دارد اگر کنجکاو به بررسی و مطالعه کامل متدهای کار با فایل در لاراول هستید به API documentation for the class  مراجعه نمایید.

ذخیره فایل های آپلودی در فریم ورک لاراول

برای ذخیره فایل های آپلودی یکی از روش های پیکربندی را از طریق فایل filesystems انتخاب کنید کلاس UploadedFile متدی با عنوان store دارد که فایل های آپلودی را در یکی از دیسک های ذخیره سازی شما انتقال می دهد محل ذخیره سازی ممکن است در دیسک محلی یا یک مکان ذخیره سازی ابری مثل Amazon S3 باشد. متد strore مسیری که فایل باید در آن ذخیره شود را از طریق تنظیمات فایل filesystems دریافت می کند این مسیر نباید شامل نام فایل باشد برای اینکه فایل ها با یک نام منحصر به فرد که به صورت خودکار تولید می شوند ذخیره خواهند شد متد Store یک آرگومان دوم اختیاری را به عنوان محل ذخیره سازی می تواند دریافت کند. با استفاده از این متد در برگشت مسیر کامل فایل آپلودی خود را می توانید بازیابی کنید.

$path = $request->photo->store('images');

$path = $request->photo->store('images', 's3');

اگر نمی خواهید که نام فایل به صورت اتوماتیک توسط این متد ایجاد شود می توانید از متد storeAs استفاده کنید این متد می تواند سه آرگومان مسیر ذخیره سازی، نام فایل ، محل ذخیره سازی (دیسک محلی یا ابری ) بعنوان ورودی دریافت کند.

آپلود معمولی فایل در لاراول

برای آپلود به روشهای قبل و بدون استفاده از متد store شما می تواید از متد move استفاده کنید در این روش شما فقط می توانید از دیسک محلی خود برای ذخیره سازی استفاده کنید.

$request->file('photo')->move($destinationPath);
  

$request->file('photo')->move($destinationPath, $fileName);
بهزاد میرزازاده
مسیر درست با پرسش های درست ساخته می شود

مشاهده تمام مطالب نویسنده