রাউটিং

ডিফল্ট রাউটিং নিয়ম

webman-এর ডিফল্ট রাউটিং নিয়ম হল http://127.0.0.1:8787/{কন্ট্রোলার}/{অ্যাকশন}

ডিফল্ট কন্ট্রোলার হল app\controller\IndexController এবং ডিফল্ট অ্যাকশন হল index

উদাহরণস্বরূপ:

  • http://127.0.0.1:8787 ডিফল্টরূপে app\controller\IndexController ক্লাসের index পদ্ধতি অ্যাক্সেস করবে
  • http://127.0.0.1:8787/foo ডিফল্টরূপে app\controller\FooController ক্লাসের index পদ্ধতি অ্যাক্সেস করবে
  • http://127.0.0.1:8787/foo/test ডিফল্টরূপে app\controller\FooController ক্লাসের test পদ্ধতি অ্যাক্সেস করবে
  • http://127.0.0.1:8787/admin/foo/test ডিফল্টরূপে app\admin\controller\FooController ক্লাসের test পদ্ধতি অ্যাক্সেস করবে (তথ্যসূত্র হিসেবে বহু অ্যাপ্লিকেশন)

এছাড়াও, webman 1.4 থেকে আরো জটিল ডিফল্ট রাউটিং সমর্থন করে, যেমন

app
├── admin
│   └── v1
│       └── v2
│           └── v3
│               └── controller
│                   └── IndexController.php
└── controller
    ├── v1
    │   └── IndexController.php
    └── v2
        └── v3
            └── IndexController.php

যখন আপনি কোনও অনুরোধ রাউট পরিবর্তন করতে চান, তখন কনফিগারেশন ফাইল config/route.php পরিবর্তন করুন।

যদি আপনি ডিফল্ট রাউট বন্ধ করতে চান, কনফিগারেশন ফাইল config/route.php এর শেষ লাইনে নিচের কনফিগারেশনটি যুক্ত করুন:

Route::disableDefaultRoute();

ক্লোজার রাউট

config/route.php এ নিচের রাউট কোড যুক্ত করুন

use support\Request;
Route::any('/test', function (Request $request) {
    return response('test');
});

মনে রাখবেন
যেহেতু ক্লোজার ফাংশন কোনও কন্ট্রোলারের অন্তর্গত নয়, তাই $request->app $request->controller $request->action সবগুলোই শূন্য স্ট্রিং।

যখন অ্যাক্সেস ঠিকানা http://127.0.0.1:8787/test হবে, তখন এটি test স্ট্রিং ফেরত দেবে।

মনে রাখবেন
রাউটের পথ অবশ্যই / দিয়ে শুরু হতে হবে, যেমন

use support\Request;
// ভুল ব্যবহার
Route::any('test', function (Request $request) {
    return response('test');
});

// সঠিক ব্যবহার
Route::any('/test', function (Request $request) {
    return response('test');
});

ক্লাস রাউট

config/route.php এ নিচের রাউট কোড যুক্ত করুন

Route::any('/testclass', [app\controller\IndexController::class, 'test']);

যখন অ্যাক্সেস ঠিকানা http://127.0.0.1:8787/testclass হবে, তখন এটি app\controller\IndexController ক্লাসের test পদ্ধতির ফলাফল ফেরত দেবে।

রাউট প্যারামিটার

যদি রাউটে প্যারামিটার থাকে, তাহলে {key} ব্যবহার করে ম্যাচ করুন, ম্যাচের ফলাফল সংশ্লিষ্ট কন্ট্রোলার পদ্ধতির প্যারামিটার হিসাবে পাঠানো হবে (দ্বিতীয় প্যারামিটার থেকে শুরু করে পর্যায়ক্রমে পাঠানো হবে), যেমন:

// ম্যাচ করে /user/123 /user/abc
Route::any('/user/{id}', [app\controller\UserController::class, 'get']);
namespace app\controller;
use support\Request;

class UserController
{
    public function get(Request $request, $id)
    {
        return response('প্যারামিটার গ্রহণ করা হয়েছে'.$id);
    }
}

আরও উদাহরণ:

use support\Request;
// ম্যাচ করে /user/123, /user/abc ম্যাচ করে না
Route::any('/user/{id:\d+}', function (Request $request, $id) {
    return response($id);
});

// ম্যাচ করে /user/foobar, /user/foo/bar ম্যাচ করে না
Route::any('/user/{name}', function (Request $request, $name) {
   return response($name);
});

// ম্যাচ করে /user /user/123 এবং /user/abc   [] দৃষ্টান্ত
Route::any('/user[/{name}]', function (Request $request, $name = null) {
   return response($name ?? 'tom');
});

// ম্যাচ করে যে কোনও রিকোয়েস্ট যা /user/ দিয়ে শুরু হয়
Route::any('/user/[{path:.+}]', function (Request $request) {
    return $request->path();
});

// ম্যাচ করে সবoptions রিকোয়েস্ট   :এর পরে নিয়মিত বিশ্লেষণ চিহ্ন যথাযথভাবে উল্লেখ করা হয়
Route::options('[{path:.+}]', function () {
    return response('');
});

প্রগতিশীল ব্যবহার সংক্ষেপ

[] সিনট্যাক্স Webman রাউটে মূলত ঐচ্ছিক পথের অংশগুলি বা গতিশীল রাউট সামঞ্জস্য করতে ব্যবহৃত হয়, এটি আপনাকে রাউটের জন্য আরও জটিল পথের কাঠামো এবং ম্যাচিং নিয়ম সংজ্ঞায়িত করতে দেয়।

:নিয়মিত বিশ্লেষণের জন্য ব্যবহৃত

রাউট গ্রুপ

কখনও কখনও রাউটে প্রচুর একসাথে থাকা পূর্বনির্ধারিত অংশ থাকে, তখন আমরা রাউট গ্রুপ ব্যবহার করে সংজ্ঞায়নকে সাবলীল করতে পারি। উদাহরণস্বরূপ:

Route::group('/blog', function () {
   Route::any('/create', function (Request $request) {return response('create');});
   Route::any('/edit', function (Request $request) {return response('edit');});
   Route::any('/view/{id}', function (Request $request, $id) {return response("view $id");});
});

সমতুল্য:

Route::any('/blog/create', function (Request $request) {return response('create');});
Route::any('/blog/edit', function (Request $request) {return response('edit');});
Route::any('/blog/view/{id}', function (Request $request, $id) {return response("view $id");});

গ্রুপের অভ্যন্তরে ব্যবহার

Route::group('/blog', function () {
   Route::group('/v1', function () {
      Route::any('/create', function (Request $request) {return response('create');});
      Route::any('/edit', function (Request $request) {return response('edit');});
      Route::any('/view/{id}', function (Request $request, $id) {return response("view $id");});
   });  
});

রাউট মিডলওয়্যার

আমরা একটি বা একটি গ্রুপের জন্য রাউট মিডলওয়্যার সেট করতে পারি।
যেমন:

Route::any('/admin', [app\admin\controller\IndexController::class, 'index'])->middleware([
    app\middleware\MiddlewareA::class,
    app\middleware\MiddlewareB::class,
]);

Route::group('/blog', function () {
   Route::any('/create', function () {return response('create');});
   Route::any('/edit', function () {return response('edit');});
   Route::any('/view/{id}', function ($request, $id) {response("view $id");});
})->middleware([
    app\middleware\MiddlewareA::class,
    app\middleware\MiddlewareB::class,
]);
# ভুল ব্যবহার উদাহরণ (webman-framework >= 1.5.7 তে এই ব্যবহার কার্যকর)
Route::group('/blog', function () {
   Route::group('/v1', function () {
      Route::any('/create', function (Request $request) {return response('create');});
      Route::any('/edit', function (Request $request) {return response('edit');});
      Route::any('/view/{id}', function (Request $request, $id) {return response("view $id");});
   });  
})->middleware([
    app\middleware\MiddlewareA::class,
    app\middleware\MiddlewareB::class,
]);
# সঠিক ব্যবহার উদাহরণ
Route::group('/blog', function () {
   Route::group('/v1', function () {
      Route::any('/create', function (Request $request) {return response('create');});
      Route::any('/edit', function (Request $request) {return response('edit');});
      Route::any('/view/{id}', function (Request $request, $id) {return response("view $id");});
   })->middleware([
        app\middleware\MiddlewareA::class,
        app\middleware\MiddlewareB::class,
    ]);  
});

রিসোর্স টাইপের রাউট

Route::resource('/test', app\controller\IndexController::class);

//নির্দিষ্ট রিসোর্স রাউট
Route::resource('/test', app\controller\IndexController::class, ['index','create']);

//অনৈতিক রিসোর্স রাউট
// যেমন notify অ্যাক্সেস ঠিকানা হলে /test/notify অথবা /test/notify/{id} উভয়ই হতে পারে routeName হল test.notify
Route::resource('/test', app\controller\IndexController::class, ['index','create','notify']);
Verb URI Action Route Name
GET /test index test.index
GET /test/create create test.create
POST /test store test.store
GET /test/{id} show test.show
GET /test/{id}/edit edit test.edit
PUT /test/{id} update test.update
DELETE /test/{id} destroy test.destroy
PUT /test/{id}/recovery recovery test.recovery

url তৈরি

মনে রাখবেন
বর্তমানে গ্রুপে রাউট নেস্ট করার সময় url তৈরি সমর্থিত নয়

যেমন রাউট:

Route::any('/blog/{id}', [app\controller\BlogController::class, 'view'])->name('blog.view');

আমরা নিচের পদ্ধতি ব্যবহার করে এই রাউটের url তৈরি করতে পারি।

route('blog.view', ['id' => 100]); // ফলাফল হবে /blog/100

দৃষ্টিশীল রূটে রাউটের url ব্যবহার করতে, আপনি এই পদ্ধতি ব্যবহার করতে পারেন, এভাবে রাউটের নিয়মগুলি যেহেতু পরিবর্তিত হয়, url স্বয়ংক্রিয়ভাবে তৈরি হবে, যার ফলে রাউট ঠিকানা সামঞ্জস্য করার কারণে অনেক দৃষ্টিশীল ফাইল পরিবর্তনের অবস্থা অতিক্রম করা যাবে।

রাউট তথ্য পাওয়া

$request->route অবজেক্টের মাধ্যমে আমরা বর্তমান অনুরোধের রাউটের তথ্য পেতে পারি, যেমন

$route = $request->route; // সমতুল্যের $route = request()->route;
if ($route) {
    var_export($route->getPath());
    var_export($route->getMethods());
    var_export($route->getName());
    var_export($route->getMiddleware());
    var_export($route->getCallback());
    var_export($route->param());
}

মনে রাখবেন
যদি বর্তমান অনুরোধের সাথে config/route.php এ কনফিগার করা কোনো রাউট মেলে না, তবে $request->route হবে null, অর্থাৎ ডিফল্ট রাউট ব্যবহার করার সময় $request->route হবে null

404 হ্যান্ডলিং

যখন রাউট পাওয়া যাচ্ছে না, তখন ডিফল্টরূপে 404 স্ট্যাটাস কোড ফেরত দেওয়া হয় এবং 404 সম্পর্কিত বিষয়বস্তু আউটপুট হয়।

যদি ডেভেলপার 404 রাউট পাওয়া না গেলে ব্যবসায়িক প্রক্রিয়ায় হস্তক্ষেপ করতে চান, তাহলে webman প্রদত্ত রিজার্ভ রাউট Route::fallback($callback) পদ্ধতি ব্যবহার করতে পারেন। যেমন নীচের কোড যুক্তিযুক্তভাবে এখন রাউট পাওয়া না গেলে হোমপেজে রিডাইরেক্ট হবে।

Route::fallback(function(){
    return redirect('/');
});

আরেকটি উদাহরণ হল যখন রাউট বিদ্যমান নেই, তখন একটি json ডেটা ফেরত দেয়, যা webman একটি api ইন্টারফেস হিসেবে খুবই কার্যকর।

Route::fallback(function(){
    return json(['code' => 404, 'msg' => '404 not found']);
});

404-এ মিডলওয়্যার যোগ করা

ডিফল্ট 404 অনুরোধ কোন মিডলওয়্যার পরিদর্শন করবে না, যদি 404 অনুরোধে মিডলওয়্যার যোগ করার প্রয়োজন হয়, তবে নীচের কোডটি অনুসরণ করুন।

Route::fallback(function(){
    return json(['code' => 404, 'msg' => '404 not found']);
})->middleware([
    app\middleware\MiddlewareA::class,
    app\middleware\MiddlewareB::class,
]);

সম্পর্কিত লিংক কাস্টোমাইজড 404 500 পৃষ্ঠা

ডিফল্ট রাউট নিষ্ক্রিয় করা

// মূল প্রকল্পের ডিফল্ট রাউট নিষ্ক্রিয় করুন, অ্যাপ্লিকেশন প্লাগিনগুলির কোনো প্রভাব ফেলে না
Route::disableDefaultRoute();
// প্রধান প্রকল্পের admin অ্যাপ্লিকেশনের রাউট নিষ্ক্রিয় করুন, অ্যাপ্লিকেশন প্লাগিনগুলির কোন প্রভাব ফেলে না
Route::disableDefaultRoute('', 'admin');
// foo প্লগিনের ডিফল্ট রাউট নিষ্ক্রিয় করুন, প্রধান প্রকল্পের কোন প্রভাব ফেলে না
Route::disableDefaultRoute('foo');
// foo প্লাগিনের admin অ্যাপ্লিকেশনের ডিফল্ট রাউট নিষ্ক্রিয় করুন, প্রধান প্রকল্পের কোন প্রভাব ফেলে না
Route::disableDefaultRoute('foo', 'admin');
// কন্ট্রোলার [\app\controller\IndexController::class, 'index'] এর ডিফল্ট রাউট নিষ্ক্রিয় করুন
Route::disableDefaultRoute([\app\controller\IndexController::class, 'index']);

অ্যানোটেশন দ্বারা ডিফল্ট রাউট নিষ্ক্রিয় করা

আমরা নির্দিষ্ট একটি কন্ট্রোলারের ডিফল্ট রাউট নিষ্ক্রিয় করতে অ্যানোটেশন ব্যবহার করতে পারি, যেমন:

namespace app\controller;
use support\annotation\DisableDefaultRoute;

#[DisableDefaultRoute]
class IndexController
{
    public function index()
    {
        return 'index';
    }
}

একইভাবে, আমরা একটি নির্দিষ্ট কন্ট্রোলারের ডিফল্ট রাউট নিষ্ক্রিয় করতে অ্যানোটেশন ব্যবহার করতে পারি, যেমন:

namespace app\controller;
use support\annotation\DisableDefaultRoute;

class IndexController
{
    #[DisableDefaultRoute]
    public function index()
    {
        return 'index';
    }
}

রাউট ইন্টারফেস

// 任何方法请求的路由
Route::any($uri, $callback);
// get请求的路由
Route::get($uri, $callback);
// post请求的路由
Route::post($uri, $callback);
// put请求的路由
Route::put($uri, $callback);
// patch请求的路由
Route::patch($uri, $callback);
// delete请求的路由
Route::delete($uri, $callback);
// head请求的路由
Route::head($uri, $callback);
// options请求的路由
Route::options($uri, $callback);
// 同时设置多种请求类型的路由
Route::add(['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'], $uri, $callback);
// 分组路由
Route::group($path, $callback);
// 资源路由
Route::resource($path, $callback, [$options]);
// 禁用路由
Route::disableDefaultRoute($plugin = '');
// 回退路由,设置默认的路由兜底
Route::fallback($callback, $plugin = '');
// 获取所有路由信息
Route::getRoutes();

যদি uri এর জন্য কোনও সম্পর্কিত রাউট (ডিফল্ট রাউট সহ) না পাওয়া যায় এবং রিজার্ভ রাউটও সেট করা না হয়, তবে এটি 404 ফেরত দেবে।

একাধিক রাউট কনফিগারেশন ফাইল

যদি আপনি রাউট ম্যানেজমেন্টের জন্য একাধিক রাউট কনফিগারেশন ফাইল ব্যবহার করতে চান, যেমন বহু অ্যাপ্লিকেশন এ প্রতিটি অ্যাপ্লিকেশনের নিজস্ব রাউট কনফিগারেশন থাকে, তবে আপনি require মাধ্যমে বাইরের কনফিগারেশন ফাইলগুলি লোড করতে পারেন।
যেমন config/route.php

<?php

// admin অ্যাপ্লিকেশনের নিচে রাউট কনফিগারেশন লোড করুন
require_once app_path('admin/config/route.php');
// api অ্যাপ্লিকেশনের নিচে রাউট কনফিগারেশন লোড করুন
require_once app_path('api/config/route.php');