مشخصات مقاله
-
1786
-
0.0
-
5163
-
0
-
0
آموزش Response (پاسخ) های HTTP در لاراول
Response های HTTP
فهرست محتوا
-
ساده ترین نوع پاسخ
- الحاق کردن header به پاسخ ها
- الحاق کردن Cookie به پاسخ ها
-
دیگر انواع پاسخ
- ارسال و بازگردانی یک view به عنوان پاسخ
- ارسال پاسخ به صورت JSON
- ارسال پاسخ به صورت دانلود
-
پاسخ های Redirect
- Redirect به route های نام گذاری شده
- Redirect به متدهای اکشن Controller
- Redirect به داده های قرار داده شده در session
- تعریف پاسخ های سفارشی با استفاده از macro
ساده ترین نوع پاسخ
طبیعتا تمامی route ها و controller ها بایستی نوعی پاسخ را برگدانند که در نهایت این پاسخ به مرورگر کاربر ارسال می شود. لاراول راه های مختلفی برای بازگرداندن پاسخ ارائه می دهد که ساده ترین نوع آن بازگردانی مقداری از داخل یک رشته از route یا controller می باشد:
Route::get('/', function () {
return 'Hello World';
});
رشته ی بازگشتی توسط فریم ورک لاراول به صورت خودکار به یک پاسخ HTTP تبدیل می شود.
اما در بیشتر موارد، route ها و متدهای اکشن کنترلر یک نمونه ی کامل از Illuminate\Http\Response یا یک view را برمی گردانند. بازگدرانی یک نمونه ی کامل Response به شما این امکان را می دهد تا کد وضعیتresponse HTTP و نیز header های آن را سفارشی تنظیم نمایید. یک نمونه ی Response از کلاس Symfony\Component\HttpFoundation\Response ارث بری کرده و متدهای مختلفی برای ایجاد و تنظیم پاسخ های HTTP فراهم می آورد.
use Illuminate\Http\Response;
Route::get('home', function () {
return (new Response($content, $status))
->header('Content-Type', $value);
});
برای راحتی بیشتر همچنین می توانید از متد کمکی response استفاده نمایید:
Route::get('home', function () {
return response($content, $status)
->header('Content-Type', $value);
});
الحاق کردن header به پاسخ ها
به یاد داشته باشید که بیشتر متدهای مربوط به response قابلیت اتصال زنجیره ای به هم را داشته که امکان ساخت روان پاسخ ها را به دنبال دارد. به عنوان مثال می توانید با استفاده از متد header یک سری هدر را به پاسخ ضمیمه کرده و سپس به کاربر بازگردانید:
return response($content)
->header('Content-Type', $type)
->header('X-Header-One', 'Header Value')
->header('X-Header-Two', 'Header Value');
الحاق کردن Cookie به پاسخ ها
متد کمکی withCookie که توسط نمونه ی response ارائه می گردد، به شما این امکان را می دهد تا به راحتی کوکی هایی را به پاسخ پیوست نمایید. به عنوان مثال می توانید از متد ذکر شده برای تولید یک کوکی و الحاق آن به نمونه ی response کمک بگیرید:
return response($content)->header('Content-Type', $type)
->withCookie('name', 'value');
متد withCookie تعدادی آرگومان اضافی بر سازمان که کاملا اختیاری هستند نیز می پذیرد. این آرگومان ها به شما اجازه می دهند تا property های کوکی را مطابق نیاز خود سفارشی تنظیم کنید:
->withCookie($name, $value, $minutes, $path, $domain, $secure, $httpOnly)
به صورت پیش فرض کوکی هایی که در چارچوب نرم افزاری لاراول ایجاد می شوند، همگی رمز گذاری و امضا شده تا بدین وسیله امکان خواندن و ویرایش اطلاعات آن برای سرویس گیرنده وجود نداشته باشد. اگر مایلید قابلیت رمزگذاری را برای برخی از کوکی های اپلیکیشن خود غیرفعال نمایید، در آن صورت توصیه می کنیم پراپرتی $except از App\Http\Middleware\EncryptCookies (که یک middleware هست) را بکار ببرید:
/** * The names of the cookies that should not be encrypted. * * @var array */ protected $except = [ 'cookie_name', ];
دیگر انواع پاسخ
متد کمکی response را می توان برای ایجاد دیگر انواع پاسخ (از جمله JSON، JSONP) از نمونه ی response مورد استفاده قرار داد. زمانی که متد کمکی response را بدون ارسال پارامتر به آن فراخوانی نمایید، در پاسخ یک پیاده سازی از کانترکت (contract)Illuminate\Contracts\Routing\ResponseFactory بازگردانده می شود. این contract توابع بسیار کارآمدی برای تولید پاسخ در اختیار ما قرار می دهد.
ارسال و بازگردانی یک view به عنوان پاسخ
اگر می خواهید بر header ها و وضعیت response ها کنترل داشته (از response و امکانات مربوط به آن همچون قابلیت دستکاری header هااستفاده نمایید) و همزمان بتوانید یک view به عنوان (محتوای)response برگردانید، متد view بهترین گزینه ی ممکن می باشد:
return response()->view('hello', $data)->header('Content-Type', $type);
چنانچه لزومی به ارسال کد وضعیت سفارشی HTTP یا header اختصاصی نمی بینید، در آن صورت می توانید از متد کمکی سراسری view بهره ببرید.
ارسال پاسخ به صورت JSON
متد json به صورت خودکار هدر Content-Type را با application/json مقداردهی می کند و همچنین آرایه ی ارائه شده را به وسیله ی تابع درون ساخته ی json_encode زبان PHP به فرمت JSON تبدیل می کند:
return response()->json(['name' => 'Abigail', 'state' => 'CA']);
حال چنانچه مایلید یک پاسخ به صورت JSONP ایجاد کنید، کافی است متد json را همراه با تابع setCallback بکار ببرید:
return response()->json(['name' => 'Abigail', 'state' => 'CA'])
->setCallback($request->input('callback'));
ارسال پاسخ به صورت دانلود
اگر متد download را در کد خود فراخوانی کنید یک پاسخ به مرورگر کاربر فرستاده می شود و آن را وادار می کند تا یک فایل مقیم در آدرس خاصی را بارگیری کند. متد نام برده به عنوان آرگومان دوم یک filename را می پذیرد که نشانگر اسم فایلی است که کاربر هنگام دانلود مشاهده می کند. به عنوان آرگومان سوم می توانید آرایه ای از هدرهای HTTP را به متد ارسال نمایید:
return response()->download($pathToFile); return response()->download($pathToFile, $name, $headers);
Symfony HttpFoundation که مدیریت دانلود و بارگیری فایل ها را بر عهده دارد، ایجاب می کند نام فایل دانلودی حاوی کاراکترهایASCII باشد.
پاسخ های Redirect
پاسخ های از نوع redirect در واقع نمونه های ایجاد شده از کلاس Illuminate\Http\RedirectResponse بوده و حاوی header های لازم برای ارجاع (redirect) کاربر به URL دیگر می باشند. راه های مختلفی برای تولید نمونه هایی از کلاس RedirectResponse وجود دارد که آسان ترین آن استفاده از متد کمکی سراسری redirect می باشد:
Route::get('dashboard', function () { return redirect('home/dashboard'); });
گاهی لازم است کاربر را به مسیر قبلی هدایت کنید، به عنوان مثال می توان به زمانی اشاره کرد که کاربر فرمی حاوی اطلاعات نامعتبر را به سرور ارسال می کند و شما مجبور می شوید وی را به صفحه ی قبلی بازگشت دهید. برای این منظور کافی است متد کمکی back را بکار ببرید:
Route::post('user/profile', function () {
// Validate the request...
return back()->withInput();
});
Redirect به route های نام گذاری شده
هنگامی که متد کمکی redirect را بدون ارسال پارامتر به آن فراخوانی کنید، چارچوب نرم افزاری لاراول یک نمونه از کلاسIlluminate\Routing\Redirector را برمی گرداند که به شما این امکان را می دهد تا هر متدی را در نمونه ی Redirector صدا بزنید. اگر بخاطر داشته باشید می توان به کمک متد route یک url برای route نام گذاری شده ایجاد کرد (با ارسال اسم route به عنوان پارامتر به این متد یک URLبرای آن ایجاد کنید). اکنون می خواهیم با ارسال اسم route به عنوان پارامتر به متد نام برده یک redirect برای آن ایجاد کنیم (یکRedirectResponse برای route مشخص بر اساس نام آن ایجاد کنیم):
return redirect()->route('login');
اگر route شما پارامترهایی داشته باشد، در آن صورت می توانید آرگومان دوم را به متد route ارسال کنید:
// For a route with the following URI: profile/{id}
return redirect()->route('profile', [1]);
برای ارجاع به یک route با پارامتر "ID" که از یک مدل Eloquent با داده پر می شود، کافی است خود مدل را به عنوان پارامتر ارسال کنید. فیلد IDبه صورت خودکار از مدل استخراج می شود:
return redirect()->route('profile', [$user]);
Redirect به متدهای اکشن Controller
همان طور که به یک route از طریق نام آن ارجاع دادید، به همین نحو نیز می توانید به controller action ارجاع (redirect) دهید. برای این منظور کافی است اسم کنترلر و اکشن را به متد action به عنوان آرگومان پاس دهید. از آنجایی که RouteServiceProvider فضای نام پیش فرضcontroller را خودکار تنظیم می کند، دیگری نیازی به مشخص کردن مسیر namespace به صورت کامل نیست:
return redirect()->action('HomeController@index');
البته اگر کنترلر شما نیاز به پارامتر ورودی داشته باشد، می توانید آن ها را به عنوان آرگومان دوم به متد action ارسال کنید:
return redirect()->action('UserController@profile', [1]);
redirect به همراه داده های قرار داده شده در session
فرایندهای ارجاع کار بر به یک url جدید و قرار دادن داده ها در session معمولا به طور همزمان صورت می گیرند. از این رو برای آسانی هر چه بیشتر، می توانید یک نمونه از RedirectResponse ایجاد کرده و همزمان داده ها را به وسیله ی متصل کردن متدها به یکدیگر در session قرار دهید. با استفاده از این روش می توانید به راحتی پیغام های نشانگر وضعیت (status message) را پس از اجرای action ذخیره کنید:
Route::post('user/profile', function () {
// Update the user's profile...
return redirect('dashboard')->with('status', 'Profile updated!');
});
البته پس از اینکه کاربر صفحه ی جدید ارجاع داده شد، می توانید پیغام های قرار داده شده در session را از آن واکشی کرده و به نمایش بگذارید. انجام این کار با استفاده از ساختار دستوری Blade در نمونه ی زیر نمایش داده شده:
@if (session('status'))
<div class="alert alert-success">
{{ session('status') }}
</div>
@endif
تعریف پاسخ های سفارشی با استفاده از macro
می توانید یک پاسخ سفارشی ایجاد کرده و سپس آن را در بخش های متفاوت برنامه خود از جمله در route ها و controller ها بکار برد. این کار را می توان با فراخوانی متد macro در پیاده سازی Illuminate\Contracts\Routing\ResponseFactory انجام داد.
برای مثال می توان macro را در تابع boot که از یک service provider در اختیار را قرار می گیرد، به صورت زیر فراخوانی کرد:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Contracts\Routing\ResponseFactory;
class ResponseMacroServiceProvider extends ServiceProvider
{
/**
* Perform post-registration booting of services.
*
* @param ResponseFactory $factory
* @return void
*/
public function boot(ResponseFactory $factory)
{
$factory->macro('caps', function ($value) use ($factory) {
return $factory->make(strtoupper($value));
});
}
}
تابع macro، یک اسم به عنوان اولین آرگومان و یک Closure به عنوان آرگومان دوم می پذیرد. Closure زمانی اجرا می شود که (اسم) macro از پیاده سازی ResponseFactory یا تابع کمکی response صدا زده شود:
return response()->caps('foo');