🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۵ Mehrzad Tajkarimi
solution for route group AND gate policy
امیر صالحی حل شده توسط امیر صالحی

سلام خسته نباشید 
دوتا سوال داشتم 
اول اینکه راهکارتون میخواستم در مورد ایجاد یک گروه از مسیر‌ها رو بدونم 
مثلا گروه پنل ادمین یا گروه پروفایل
دوم هم برای ایجاد سطوح دستری بهترین راهکار چی هست
متشکرم,’’

سلام و احترام

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

Route::middleware(['first', 'second'])->group(function () {
    Route::get('/', function () {
        // Uses first & second middleware...
    });
    Route::get('/user/profile', function () {
        // Uses first & second middleware...
    });
});

متد group رو از کلاس Route صدا میزنید و داخلش یک callback function دریافت میکنه، بعد میتونید روت‌های خودتو داخلش تعریف کنید، حالا اگه راهنمایی هم درباره پیاده سازیش هم خواستید بگید تا کمکتون کنم.

 

برای داشتن سطح دسترسی باید یک جدول داشته باشید به اسم Role که داخل این جدول نقش‌های مختلفی میشینه(مثلا نویسنده، مدیر و..)، یه جدول دیگه باید داشته باشید به اسم Permissions که دسترسی‌ها مختلف داخلش میشینه (مثلا add-post، delete-post و از این جور دسترسی ها)

حالا شما برای اینکه بخواید این دسترسی‌ها را به نقش‌ها ربط بدید باید یه جدول داشته باشید با رابطه چند به چند به اسم role_permissions که فیلدهای این جدول permission_id و role_id هستش که بشه برای هر Role چندین دسترسی مشخص کرد

 

حالا برای اینکه مشخص کنید که یک کاربر نقش داشته باشه میتونید یک جدول دیگه بسازید به اسم user_roles که داخل این یک user_id و role_id میخوره که هر کاربر میتونه role‌ها مختلفی داشته باشه

بهترین پاسخ
امیر صالحی ۱۴ خرداد ۱۴۰۰، ۱۷:۴۰

سلام و احترام

اگه دارید از api استفاده میکنید برای فرانت پروژه میتویند یه فایل به اسم api بسازید و روت‌های api رو داخل همون قرار بدید اما اگه دارید به صورت view لود میکنید هم میتونید از همون فایل web.php استفاده کنید و هم میتونید یه فایل دیگه بسازید به اسم web-front.php و بیایید این روت‌های فرانتتون رو داخل اون هندلش کنید. پیاده سازی این مورد هم سادست شما فقط فایل رو جدا میکنید و از همون کلاس Route استفاده میکنید که داخلش همه روت‌ها هستش.

 

درباره middleware دقیقا چه موردی رو توضیح بدم؟

 

برای درست کردن group هم یه فرصت به بنده بدید تا یه راه حل مناسب پیدا کنم و ارائه بدم

 

امیر صالحی ۲۹ خرداد ۱۴۰۰، ۱۷:۵۳

سلام خسته نباشید 

ببینید در خصوص  route پیاده سازیش به صورت مجزا 

من از این روش استفاده کردم داره کار میکنه ولی اگه راه بهتری هست که بفرمایید
$uri_separator


private function dispatch($route)
    {
        $action = $route['action'];
        if (is_null($action) || empty($action)) {
            return;
        }
        if (is_callable($action)) {
            $action();
        }
        if (is_string($action)) {
            $action = explode('@', $action);
        }
        if (is_array($action)) {
            $uri_separator = explode('/',$route['uri']);
            $routing = $uri_separator[1] =='admin' ? 'backend\' : 'frontend\';
            $class_name  = self::BASE_CONTROLLER .$routing. $action[0];
            $method_name = $action[1];
            if (!class_exists($class_name)) {
                throw new \Exception("class $class_name Not Exists");
            }
            if (!method_exists($class_name, $method_name)) {
                throw new \Exception("method  $method_name not exist in class $class_name");
            }
            $controller = new $class_name();
            return $controller->{$method_name}();
        }
    }

درخصوص group
در کلاس Route

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

 


    public static function group($callback)
    {
        if (is_callable($callback)) {
            $callback();
        }
        return;
    }
    

در خصوص middleware 
 در واقع مثلا لاراول میخوام به این صورت انجام بشود؟


Route::group(function () {
    Route::get('/admin', 'HomeController@index');
    Route::get('/admin/users', 'UserController@index')->middleware('auth.admin');
})->middleware('auth');

 

Mehrzad Tajkarimi ۳۰ خرداد ۱۴۰۰، ۰۳:۵۵

سلام و احترام

برای روت هاتون هم خوبه مشکلی نیست، میتونید حالا بعدا برای مثال از فایل جدا هم استفاده کنید، ولی زیاد مشکلی نیست میتونید توی یه فایل هم روت‌های فرانت و بک اندتون رو هم داشته باشید

 

برای به اجرا در آوردن callable‌ها میتونید از تابع call_user_func استفاده کنید

https://www.php.net/manual/en/function.call-user-func.php

 

برای اینکه بتونید middlware هارتون رو به شکلی که نوشتید پاس بدید باید داخل متد group آجکت اون کلاس رو $this رو return کنید و داخل اون کلاس باید متدی به اسم middlware داشته باشید که بتونید وقتی آبجکت بر میگرده از متد استفاده کنید

امیر صالحی ۳۰ خرداد ۱۴۰۰، ۱۹:۲۲

یکی از دانشجو‌ها سون لرن یک پکیج روتینک مثل لاراول نوشته میتونید یه سری بهش بزنید و با نحوه پیاده سازی آشنا بشید

https://github.com/rabpack/routing

امیر صالحی ۳۰ خرداد ۱۴۰۰، ۱۹:۲۷