রুট
ডিফল্ট রুটিং নিয়ম
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 মেথডের ফলাফল পাঠানো হবে।
অ্যানোটেশন রুটিং
কন্ট্রোলার মেথডে অ্যানোটেশন ব্যবহার করে রুট সংজ্ঞায়িত করুন, config/route.php এ কনফিগার করার প্রয়োজন নেই।
লক্ষ্য
এই বৈশিষ্ট্যটির জন্য webman-framework >= v2.2.0 প্রয়োজন
মৌলিক ব্যবহার
namespace app\controller;
use support\annotation\route\DisableDefaultRoute;
use support\annotation\route\Get;
use support\annotation\route\Post;
use support\annotation\route\Route;
#[DisableDefaultRoute]
class UserController
{
#[Get('/user/{id}')]
public function show($id)
{
return "user $id";
}
#[Post('/user')]
public function store()
{
return 'created';
}
#[Route('/user/form', ['GET', 'POST'], 'user.form')]
public function form()
{
return 'form';
}
}
উপলব্ধ অ্যানোটেশন: #[Get] #[Post] #[Put] #[Delete] #[Patch] #[Head] #[Options] #[Any] (যেকোনো পদ্ধতি)। পাথগুলি / দিয়ে শুরু করতে হবে। দ্বিতীয় প্যারামিটার route() URL জেনারেশনের জন্য রুট নাম নির্দিষ্ট করতে পারে।
#[DisableDefaultRoute] এই কন্ট্রোলারের ডিফল্ট রুটিং নিষ্ক্রিয় করে (ঐচ্ছিক); শুধুমাত্র অ্যানোটেশন দ্বারা সংজ্ঞায়িত রুটগুলি অ্যাক্সেসযোগ্য।
#[Route] সম্পূর্ণ সিনট্যাক্স: #[Route(path, methods, name)]
path: রুট পাথ,/দিয়ে শুরু;nullহলে শুধুমাত্র ডিফল্ট রুটের HTTP মেথড সীমাবদ্ধ করে, নতুন রুট নিবন্ধন করে নাmethods: HTTP মেথড(গুলি), স্ট্রিং বা স্ট্রিং অ্যারে, যেমন'GET'বা['GET','POST']name:route('name')URL জেনারেশনের জন্য রুট নাম, বাদ দেওয়া যেতে পারে
প্যারামিটারবিহীন অ্যানোটেশন: ডিফল্ট রুটের HTTP মেথড সীমাবদ্ধতা
পাথ নির্দিষ্ট না করলে, শুধুমাত্র সেই অ্যাকশনের জন্য অনুমোদিত HTTP মেথড সীমাবদ্ধ করা হয়; ডিফল্ট রুট পাথ ব্যবহার করা হয়:
#[Post]
public function create() { ... } // শুধুমাত্র POST, পাথ এখনও /user/create
#[Get]
public function index() { ... } // শুধুমাত্র GET
বেশ কয়েকটি অ্যানোটেশন একত্রিত করে একাধিক মেথড অনুমোদন করা যায়:
#[Get]
#[Post]
public function form() { ... } // GET এবং POST অনুমোদন করে
অঘোষিত HTTP মেথড 405 ফেরত দেবে।
বহু পাথ অ্যানোটেশন পৃথক রুট হিসাবে নিবন্ধিত হয়: #[Get('/a')] #[Post('/b')] GET /a এবং POST /b উভয় রুট তৈরি করে।
রুট গ্রুপ প্রিফিক্স
ক্লাসে #[RouteGroup] ব্যবহার করে সমস্ত মেথড রুটে প্রিফিক্স যোগ করুন:
use support\annotation\route\RouteGroup;
use support\annotation\route\Get;
#[RouteGroup('/api/v1')]
class UserController
{
#[Get('/user/{id}')] // প্রকৃত পাথ: /api/v1/user/{id}
public function show($id) { ... }
}
কাস্টম HTTP মেথড এবং রুট নাম
#[Route] একাধিক HTTP মেথড এবং রুট নাম সমর্থন করে:
use support\annotation\route\Route;
#[Route('/user', ['GET', 'POST'], 'user.form')]
public function form() { ... }
// শুধুমাত্র পাথ এবং মেথড, রুট নাম ছাড়া
#[Route('/user/update', 'PUT')]
public function update() { ... }
পাথ প্যারামিটার এবং regex
অ্যানোটেশন রুট পাথগুলি config/route.php এর মতো একই প্যারামিটার সিনট্যাক্স সমর্থন করে, regex এবং ঐচ্ছিক প্যারামিটার সহ:
#[Get('/user/{id:\d+}')] // শুধুমাত্র সংখ্যাসূচক id
public function show($id) { ... }
#[Get('/user[/{name}]')] // name ঐচ্ছিক: /user বা /user/xxx
public function list($name = null) { ... }
#[Any('/user/[{path:.+}]')] // /user এবং /user/ যেকোনো প্রত্যয়ের সাথে মেলে
public function catchAll($path = null) { ... }
এই নথির「রুট প্যারামিটার」অধ্যায় দেখুন।
মিডলওয়্যার
কন্ট্রোলার বা মেথডে #[Middleware] অ্যানোটেশন রুটে প্রযোজ্য; support\annotation\Middleware এর মতোই ব্যবহার করুন:
use support\annotation\Middleware;
#[Middleware(\app\middleware\AuthMiddleware::class)]
class UserController { ... }
#[Get('/user/{id}')]
#[Middleware(\app\middleware\RateLimitMiddleware::class)]
public function show($id) { ... }
route() দিয়ে URL জেনারেশন
অ্যানোটেশনে রুট নাম নির্দিষ্ট হলে, URL জেনারেট করতে route('name', $params) ব্যবহার করুন:
#[Get('/user/{id}', 'user.show')]
public function show($id) { ... }
// ব্যবহার: route('user.show', ['id' => 123]) => /user/123
রুট প্যারামিটার
যদি রুটে প্যারামিটার থাকে, তবে {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) {return 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']);
// অনির্দিষ্ট সম্পদ রুট
// উদাহরণস্বরূপ নোটিফাই অ্যাক্সেস পথের যোকারী কোন প্যাথে /test/notify অথবা /test/notify/{id} হয় তবে রুটনেম হবে টেস্ট নোটিফাই
Route::resource('/test', app\controller\IndexController::class, ['index','create','notify']);
| Verb | URI | ক্রিয়া | রুট নেম |
|---|---|---|---|
| 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 উৎপন্ন করা
দ্য নোট
গ্রুপ গোডাউনেসেটেড রুটস জেনারেট করার জন্য প্রতারিত
উদাহরণ রুট:
Route::any('/blog/{id}', [app\controller\BlogController::class, 'view'])->name('blog.view');
আমরা এই রুটের URL তৈরি করতে নিম্নলিখিত পদক্ষেপগুলি অনুসরণ করতে পারি।
route('blog.view', ['id' => 100]); // ফলাফল /blog/100
রুটের 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->routenull হবে, অর্থাত্ বৈশিষ্ট্য অব্যাহত রাউটিং সময় ক্রোতা null
৪০৪ হ্যান্ডলিং
রুট পাওয়া না গেলে ডিফল্ট 404 স্ট্যাটাস কোড দেওয়া হবে এবং 404 বিষয়বস্তু প্রদর্শিত হবে।
ডেভেলপাররা যদি রুট পাওয়া না গেলের ব্যবসায়িক প্রসঙ্গে আসাতে চান, তাহলে webman সরবরাহ করা ফলব্যাপ্ত রুট ফল্ব্যাক রুট Route::fallback($callback) মেথড ব্যবহার করতে পারে। উদাহরণ হচ্ছে নিম্নের কোডটি যখন রুট পাওয়া যায়নি তাহলে হোমপেজে পুনর্নির্দেশ করা হবে ।
Route::fallback(function(){
return redirect('/');
});
আর এমনকি যখন রুট পাওয়া যায়নি তাহলে একটি জেসন ডাটা রিটার্ন করা হবে, এটি 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
// অ্যাডমিন অ্যাপের রাউট কনফিগারেশন লোড করুন
require_once app_path('admin/config/route.php');
// অ্যাপি অ্যাপের রাউট কনফিগারেশন লোড করুন
require_once app_path('api/config/route.php');