Route Pattern عمومی برای همه کنترللر ها

- 4 ماه پیش
توسط iSafari آپدیت شد
iSafari ( 139 تجربه )
4 ماه پیش

سلام
بعضی مواقع توی پروژه های بزرگ گاهی ممکنه حداقل 20-30 کنترللر داشته باشیم که فرضا بطور میانگین توی هر کدوم از کنترللر های ، حداقل 10تا اکشن داشته باشیم که مثلا چیزی حدود 200-300 آدرس میشه که قراره کاربر باهاش درگیر بشه و به عبارتی براشون Route تعریف بشه!

توی فریم ورک CakePHP ما موضوعی داریم به اسم Route Elements که میشه ی Route تعریف کرد که همه آدرس ها از اون پترن یا الگو پیروی کنند و آدرس دهی ها بر اساس اون انجام بشه(البته که Route با الگو های خاص هم میشه ایجاد کرد). به مثال توجه کنید :

$routes->connect(
    '/:controller/:action/*'
);

من خیلی گشتم تا همچین قابلیتی رو برای لاراول پیدا کنم که تا الگو بدم و هر آدرس کاربر درخواست کرد طبق اون الگو مسیریابی بشه و مجبورم به ازای هر Action ی روتر بدم.
راه حلی ، روشی ، نظری چیزی ؟

بهترین پاسخ انتخاب شده توسط iSafari
Alimotreb
4 ماه پیش

سلام
@adeveloper

ببینید توی لاراول قابلیتی هست توی صفحه روت ها که شما میتونید resource بزنید

وقتی نوع resource رو انتخاب میکنید و کنترلر رو براش انتخاب میکنید
میاد انواع اکشن هارو خودش میسازه و قابلیت استفاده براش میزاره
در صورتی که شما یه خط نوشتی

یه مثال میزنم
شما توی web.php در لاراول :

Route::resource('category', 'CategoryController');

این رو بزنید
توی کنترلرتون

class CategoryController extends Controller
{
    public function index(Request $request)
    {

    }

    public function create()
    {

    }

    public function store(Request $request)
    {

        }

        $category = Category::create($cat_data);
        if ($category instanceof Category) {
            return redirect('modir/category/create');
        }

    }

    public function show($id)
    {
        //
    }

    public function edit($id)
    {

    }

    public function update(Request $request, $id)
    {

    }

   public function destroy($id)
    {

   }

}

به تمامی این متد ها با url های مشخص دسترسی دارید

این هم مشخصات روت ها :

|        | GET|HEAD  | modir/category                  | category.index  | App\Http\Controllers\Admin\CategoryController@index         | web          |
|        | POST      | modir/category                  | category.store  | App\Http\Controllers\Admin\CategoryController@store         | web          |
|        | GET|HEAD  | modir/category/create           | category.create | App\Http\Controllers\Admin\CategoryController@create        | web          |
|        | POST      | modir/category/delete/{id}      | category.delete | App\Http\Controllers\Admin\CategoryController@delete        | web          |
|        | PUT|PATCH | modir/category/{category}       | category.update | App\Http\Controllers\Admin\CategoryController@update        | web          |
|        | GET|HEAD  | modir/category/{category}/edit  | category.edit   | App\Http\Controllers\Admin\CategoryController@edit          | web          |

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

http://uupload.ir/files/386x_route.png

همه اینا با 1 خط کد!
و حالا آپشن های زیادی هم داره
میتونید بعضی متد هارو بگید ، همه رو بگید و.....

حسام موسوی ( 204334 تجربه )
4 ماه پیش
تخصص : طراح و برنامه نویس

لاراول Route محور هست و نیاز به تعریف روت ها دارید ولی با یک سری از ترفند ها میتونید کارو ساده تر کنید مثلا استفاده از resource .

iSafari ( 139 تجربه )
4 ماه پیش

در موردش بیشتر توضیح میدید؟ براتون مقدور هست یک مثال عملی در الگوی که مطرح کردم بزنید؟ اگر لاراول چنین موضوع با اهمیتی رو دربر نمیگیره پس برای پروژه های بزرگی که گاهی ممکنه تا 700-800(برای یکی از شرکت هایی که کار میکردم واقعا پروژشون به همین بزرگی بود) اکشن داشته باشیم چطور باید عمل کرد؟

Alimotreb ( 166882 تجربه )
4 ماه پیش
تخصص : کانفیگ سرور و برنامه نویس

سلام
@adeveloper

ببینید توی لاراول قابلیتی هست توی صفحه روت ها که شما میتونید resource بزنید

وقتی نوع resource رو انتخاب میکنید و کنترلر رو براش انتخاب میکنید
میاد انواع اکشن هارو خودش میسازه و قابلیت استفاده براش میزاره
در صورتی که شما یه خط نوشتی

یه مثال میزنم
شما توی web.php در لاراول :

Route::resource('category', 'CategoryController');

این رو بزنید
توی کنترلرتون

class CategoryController extends Controller
{
    public function index(Request $request)
    {

    }

    public function create()
    {

    }

    public function store(Request $request)
    {

        }

        $category = Category::create($cat_data);
        if ($category instanceof Category) {
            return redirect('modir/category/create');
        }

    }

    public function show($id)
    {
        //
    }

    public function edit($id)
    {

    }

    public function update(Request $request, $id)
    {

    }

   public function destroy($id)
    {

   }

}

به تمامی این متد ها با url های مشخص دسترسی دارید

این هم مشخصات روت ها :

|        | GET|HEAD  | modir/category                  | category.index  | App\Http\Controllers\Admin\CategoryController@index         | web          |
|        | POST      | modir/category                  | category.store  | App\Http\Controllers\Admin\CategoryController@store         | web          |
|        | GET|HEAD  | modir/category/create           | category.create | App\Http\Controllers\Admin\CategoryController@create        | web          |
|        | POST      | modir/category/delete/{id}      | category.delete | App\Http\Controllers\Admin\CategoryController@delete        | web          |
|        | PUT|PATCH | modir/category/{category}       | category.update | App\Http\Controllers\Admin\CategoryController@update        | web          |
|        | GET|HEAD  | modir/category/{category}/edit  | category.edit   | App\Http\Controllers\Admin\CategoryController@edit          | web          |

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

http://uupload.ir/files/386x_route.png

همه اینا با 1 خط کد!
و حالا آپشن های زیادی هم داره
میتونید بعضی متد هارو بگید ، همه رو بگید و.....

iSafari ( 139 تجربه )
4 ماه پیش

@Alimotreb
ممنون بابت وقتی که گذاشتید و پاسخی که دادید.
با توجه به قابلیتی که فرمودید اگه نام تابع نام هایی غیر از نام های عمومی باشه (مثلا serachArea یا مثلا acceptOne) هم این قابلیت Resource براش جواب میده ؟
اگر جوابتون بله هستش ، چجوری باید مشخص کنید این تابع برای Read هست یا Write هست یا هر دو ؟

Alimotreb ( 166882 تجربه )
4 ماه پیش
تخصص : کانفیگ سرور و برنامه نویس

سلام مجدد
@adeveloper

با resource در تعریف روت ها شما میایید و اصول پیاده سازی روت ها برای انجام عملیات CRUD رو پیاده سازی میکنید و کوتاه ترش میکنید
4 عملیات رو شما میایید و با resource پیاده میکنید
کنترلرشو بهش پاس میدید و ....
با این کار به جای اینکه شما برای کنترلر و متد ها بیایید برای هر کدوم یه روت بنویسید که عملیات crud رو انجام بدید
با resource میایید و اینا رو در یک مجموعه طبق مثالی که زدم براتون مینویسید

برای هر متدی قابلیت resource جواب میده
قابلیت کاستوم کردن داره
وارد صفحه لاراول بشید
ریز ریزشو که چه قابلیت هایی داره اونجا نوشته میتونید استفاده کنید

iSafari ( 139 تجربه )
4 ماه پیش

بررسی کردم و احساس میکنم کار رو پیچیده کرده و اجازه نمیده به راحتی پترن هایی که مدنظرمون هستش رو برای Route پیاده سازی کنیم. ممنون بابت پیگیری

برای ارسال پاسخ باید وارد سایت شوید