برنامه نویسی اندروید و وب
درباره Laravel Pipelines
با استفاده از laravel pipelines میتونید یه ابجک بین چند تا کلاس خیلی راحت پاس بدید و یه سری عمل روش انجام بدید و در آخر نتیجه رو به خروجی بفرستید.
واضح ترین مثال برای اینکه pipelines چطور کار میکنند. یکی از کامپوننتهای پر کاربرد لاراول یعنی Middleware هاست.
میدلور ها یه مکانیزم خیلی راحت برای فیلتر کردن ریکوئست های ورودی به برنامه ارائه میدن.
یه میدلور ساده شبیه این کد هست:
<?php
app(Pipeline::class)
->send($content)
->through($pipes)
->via(‘customMethodName’)
->then(function ($content) {
return Post::create(['content' => $content]);
});
میدلور ها در حقیقت Pipe هایی هستند که ریکوئست ها از طریق اونها ارسال میشن و متد مشخص شده داخل اون ها صدا می شه و متونید تشخیص بدید که مثلا یک درخواست HTTP هست یا نه ، یک درخواست JSON هست یا نه و یا کاربر لاگین کرده یا نه و همین طور چیزای دیگه.
اگر یه نگاه سطحی به کلاس Illuminate\Foundation\Http\Kernel بندازید متوجه میشید که میدلور ها با استفاده از Pipe ها اجرا میشن.
<?php
/** * Send the given request through the middleware / router.
* * @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
protected function sendRequestThroughRouter($request)
{
$this->app->instance('request', $request);
Facade::clearResolvedInstance('request');
$this->bootstrap();
return (new Pipeline($this->app))
->send($request)
->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware)
->then($this->dispatchToRouter());
}
از کد بالا میتونید یه همچین چیزی بفهمید: یه پایپ لاین جدید ایجاد شده و ریکوئست به لیستی از میدلور ها پاس داده میشه و در آخر به router ارسال میشه.
اگه یکم براتون گنگ بود نگران نباشید تویه مثال بعدی روشن ترش میکنیم.
کار کردن روی کلاسی که نیاز دارد چند تا تسک اجرا کند
این وضعیت رو در نظر بگیرد که میخواید یه انجمن(forum) بسازید که مردم بتونن موضوعات خودشون رو قرار بدن و همچنین کامنت بزارن. ولی مشتری ازت میخواد قبل از ذخیره کردن موضوعات و کامنت ها روی اون ها یه کارایی انجام بدی.
کارایی که باید انجام بدی به این صورت:
- جایگزین کردن تگ های لینک با نوشته ساده
- جایگزین کردن کلمات زشت با "*"
- حذف تگ های اسکریپت از کل محتوا
شما میاید و هر کدوم از این کارایی که باید انجام بدید رو براش یه کلاس ایجاد میکنید و احتمالا در اخر یه همچین چیزی دارید:
$pipes = [
RemoveBadWords::class,
ReplaceLinkTags::class,
RemoveScriptTags::class
];
حالا کاری که باید انجام بدید اینه که متنی که کاربر وارد کرده به هر کدوم از این کلاس ها پاس بدیم و خروجیشو به کلاس بعدی پاس بدیم. ما میتونیم اینکار رو با پایپلاین انجام بدیم.
<?php
public function create(Request $request)
{
$pipes = [
RemoveBadWords::class,
ReplaceLinkTags::clas,
RemoveScriptTags::class
];
$post = app(Pipeline::class)
->send($request->content)
->through($pipes)
->then(function ($content) {
return Post::create(['content' => 'content']);
}); // return any type of response
}
هر کدوم از این کلاس هایی که پیاده کردیم باید یه متد به اسم "handle" داشته باشن. شاید ایده خوبی باشه که یه اینترفیس براش بسازیم و داخل این کلاس ها پیادش کنیم.
<?php
namespace App;
use Closure;
interface Pipe
{
public function handle($content, Closure $next);
}
<?php
namespace App;
use Closure;
class RemoveBadWords implements Pipe
{
public function handle($content, Closure $next)
{
// Here you perform the task and return the updated $content
// to the next pipe
return $next($content);
}
}
متد پیاده سازی شده باید دو تا پارامتر دریافت کنه که اولی محتوایی هست که میخواد روش عمل انجام بده.
و پارامتر دوم باید closureی باشه قرار بعد از اجرای عمل به اون ریدایرکت بشیم.
راستی اگه میخوای بجای "handle" یه اسم دیگه برای متدتون بزارید باید تویه پایپ لاین اسمش رو مشخص کنید. مث این:
<?php
app(Pipeline::class)
->send($content)
->through($pipes)
->via(‘customMethodName’) // <---- اینجا اسم متد مورد نظر رو قرار بدید :)
->then(function ($content) {
return Post::create(['content' => $content]);
});
آخرش چی میشه؟
چیزی که در آخر باید اتفاق بیفته اینه که محتوای پست توسط هر کدوم از این pipes$ تغییر داده میشه و در آخر ذخیره میشه.
سخن پایانی
برای اینکه همچین چیزی رو پیاده کنید راه های زیادی هست شاید راه بهتر از این که ذکر شده هم وجود داشته باشه ولی هدف من این بود که با ابزاری که ممکنه در اختیار دارید و وجودش بیخبرید رو بهتون معرفی کنم. اگه میخواید در مورد پایپ لاین ها بیشتر بدونید میتونید به اینجا مراجعه کنید.
نکته: نوشتن کلمات انگلیسی وسط متن فارسی باعث به هم ریختگی میشد واسه همین مجبور شدم کلمات رو به فارسی بنویسم اگه کلمه ای رو نمیشناسید کامنت کنید.
مطلبی دیگر از این انتشارات
برای ورژن ۶ لاراول آماده شوید!
مطلبی دیگر از این انتشارات
چگونه در لاراول «بدنویسی» کنیم؟!
مطلبی دیگر از این انتشارات
افزونه من برای VSCode و لاراول