سوال در مورد پیاده سازی global middleware

پرسیده شده
فعالیت 1059 روز پیش
دیده شده 428 بار
0

باسلام و عرض خسته نباشید

چند تا سوال داشتم

۱- این روش برای پیاده سازی Global Middleware ها درست است؟

داخل پوشه Middleware پوشه ای با نام Global ایجاد کنیم و کلاس های Global Middleware رو اونجا قرار بدیم و در فایل Router.php به این شکل پیاده کنیم:

private function globalMiddleware(){
    $global_middleware_files = glob('App/Middleware/Global/*.php');
    foreach ($global_middleware_files as $middleware_file_name){
        $middleware_class = str_replace('/','\\',rtrim($middleware_file_name,'.php'));
        $middle_ware_obj = new $middleware_class;
        $middle_ware_obj->handle();
    }
}

۲- این روش بهتره یا روشی که استاد داخل ویدیو تمرین گفتند؟

۳- اگر تعداد فایل کلاسهامون در یک دایرکتوری بیش از حد بشه (بدون پوشه بندی) اشکالی نداره؟ مثلا همین Middleware ها

فایل پیوست

محمد گازری
محمد گازری

8 خرداد 00

0
حذف شده

سلام و احترام

چیزی که الان به ذهنم میرسه برای داشتن global middleware ها اینکه شما یه فایل داشته باشید برای مثال به اسم GlobalMiddleware.php که محتوا داخل کلا یه آرایه بر میگردونه

<?php
return [
	'global' => [
		MiddlewareOne::class,
		MiddlewareTwo::class,
	]
]

به این شکل داشته باشید و include کنید و بعد یه foreach بزنید توی همون کلاس route و همشو اجرا کنید

 

middleware هاتون رو هم پوشه بندی کنید تا زیاد شلوغ نشه و بشه راخت middleware پیداشون کرد

 

 

فایل پیوست

امیر صالحی

توسط

امیر صالحی

8 خرداد 00

حذف شده
سوالات و ابهاماتم را به در پایین براتون نوشتم!
محمد گازری

9 خرداد 00

0
حذف شده

سلام امیر جان 

مرسی بابت پاسخگوییت،من خیلی ابهامات در مورد بهترین نحوه پیاده سازی global middleware ها دارم..

ممنون میشم اگر امکانش هست گزینه به گزینه پاسخ بدی.

۱- الان این روشی که گفتید بهترین روش برای تعریف middleware ها است؟

۲- روشی که بالا من گفتم بهتره یا روش شما یا روش استاد آوند در ویدیو تمرین؟ (حس میکنم روش خودم این مشکل رو داره که اگر یک زمان نخوایم یکی از global middleware ها فعال باشه باید فایل اون رو حذف کنیم یا پوشه رو عوض کنیم تا در دستور glob لیست نشه! این رو میشه یک ایراد دونست؟)

۳- برای اجرای middleware ها به روش شما باید در router.php و در constructor به این شکل مقدار دهی کنیم:

$this->global_middleware = require BASEPATH . '/App/Middleware/GlobalMiddleware/GlobalMiddleware.php';

۴- توی روش خودتون به جای این کار بیایم نام کامل کلاس هامون رو در یک متغیر global در فایل init.php درج کنیم بهتر نیست؟ 

5- یا به جای این دو روش یه property توی constructor تعریف کنیم و همونجا نام کلاس ها رو مقدار دهی کنیم!

6- وقتی از MiddlewareOne::class استفاده میکنیم باز باید بالاش namespase رو use کنیم که میشه همون نام کامل کلاس، خب بهتر نیست کلا از اول همون نام کامل رو بنویسیم؟

فایل پیوست

محمد گازری

توسط

محمد گازری

9 خرداد 00

0
حذف شده

سلام و احترام

۱ - من روش استاد رو ندیدم و اگه استاد روشی گفتند حتما از اون استفاده کنید، روشی که من گفتم شبیه به لاراول بود که تمامی middleware ها رو توی یه آرایه بزاریم

۲ - روش خودتون همون glob میتونست مشکل ساز باشه بعدا که زیاد جالب نیست استفاده ازش

۳- بله میتونید به همون شکل محتوای فایل رو داشته باشید

۴ و ۵ - ۶ - کلاس های middleware ها رو با namespace کاملشون داخل فایل قرار بدید به شکل زیر:

 


$middleware = [
        // \App\Http\Middleware\TrustHosts::class,
        \App\Http\Middleware\TrustProxies::class,
        \Fruitcake\Cors\HandleCors::class,
        \App\Http\Middleware\PreventRequestsDuringMaintenance::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    ];

پیشنهاد بعدی اینکه این متغیر middleware رو ببرید داخل یک کلاس و به عنوان پراپرتی داشته باشید تا دردسر include کردن به صورت آدرسی هم نداشته باشید و راحت از کلاس یه new بگیرید و به property درسترسی داشته 

.باشید و همه کلاس های لیست  شده داخلشو استفاده کنید

مثال:

<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;
use App\Http\Middleware\CheckUsrHadTheSecondRegistrationStep;

class Middlewares 
{
    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array
     */
    protected $globalMiddleware = [
        // \App\Http\Middleware\TrustHosts::class,
        \App\Http\Middleware\TrustProxies::class,
        \Fruitcake\Cors\HandleCors::class,
        \App\Http\Middleware\PreventRequestsDuringMaintenance::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    ];


	public function getGlobalMiddlewares()

	{

		return $this->globalMiddleware ;

	}
}
فایل پیوست

امیر صالحی

توسط

امیر صالحی

9 خرداد 00

حذف شده
ممنون امیر جان، اما الان که نام کامل رو آوردیم چرا هنوز از ::class استفاده کردیم؟
محمد گازری

9 خرداد 00

حذف شده
سلام امیرجان، اگر امکانش هست سوالاتم رو جواب بدین. تقریبا 2 هفته از آخرین سوالم میگذره....
محمد گازری

21 خرداد 00

0
حذف شده

سلام

ممنون بابت پاسخگوییتون

۳ تا سوال

۱- الان که نام کامل رو آوردیم چرا هنوز از ::class استفاده کردیم؟

۲- اگر توی constructor فایل router.php بخوایم از این کلاس new کنیم مشکلی ندارد و اصول solid نقض نمیشه؟

۳- بهتر نیست این کلاس و پراپرتی هاش را به صورت abstract تعریف می‌کردیم؟

فایل پیوست

محمد گازری

توسط

محمد گازری

9 خرداد 00

0
حذف شده

سلام و احترام

۱ - با گذاشتن ::class ما به آدرس کامل کلاس دسترسی داریم

 

۲ - میتونید یک آبجکت ساخته شده ازش رو پاس بدید به کلاس route و دیگه ازش شی داخل construt نسازید 

 

۳ - فکر نکنم چون قرار نیست جایی ازش ارث برده بشه قراره فقط این یه وظیفه رو داشته باشه که همین global middleware هارو بر گردونه

فایل پیوست

امیر صالحی

توسط

امیر صالحی

24 خرداد 00