การกำหนดเส้นทาง
กฎการกำหนดเส้นทางเริ่มต้น
กฎการกำหนดเส้นทางเริ่มต้นของ webman คือ http://127.0.0.1:8787/{ตัวควบคุม}/{การกระทำ}
。
ตัวควบคุมที่เริ่มต้นคือ app\controller\IndexController
และการกระทำเริ่มต้นคือ index
。
ตัวอย่างการเข้าถึง:
http://127.0.0.1:8787
จะเข้าถึงวิธีindex
ในคลาสapp\controller\IndexController
โดยอัตโนมัติhttp://127.0.0.1:8787/foo
จะเข้าถึงวิธีindex
ในคลาสapp\controller\FooController
โดยอัตโนมัติhttp://127.0.0.1:8787/foo/test
จะเข้าถึงวิธีtest
ในคลาสapp\controller\FooController
โดยอัตโนมัติhttp://127.0.0.1:8787/admin/foo/test
จะเข้าถึงวิธีtest
ในคลาสapp\admin\controller\FooController
โดยอัตโนมัติ (ดูที่ หลายแอปพลิเคชัน)
นอกจากนี้ 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
จะส่งคืนค่าผลลัพธ์จากวิธี test
ในคลาส app\controller\IndexController
。
พารามิเตอร์เส้นทาง
หากมีพารามิเตอร์ในเส้นทาง สามารถใช้การจับคู่ได้โดยใช้ {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 ทั้งหมด : หลังจากกรอกกฎ regex แสดงถึงกฎ regex ของพารามิเตอร์ที่ตั้งชื่อ
Route::options('[{path:.+}]', function () {
return response('');
});
สรุปการใช้ขั้นสูง
[]
คำสั่งในเส้นทาง Webman ใช้เพื่อจัดการกับส่วนของเส้นทางทางเลือกหรือจับคู่เส้นทางแบบไดนามิก ช่วยให้คุณสามารถกำหนดโครงสร้างเส้นทางที่ซับซ้อนและกฎการจับคู่เพิ่มเติมได้
:ใช้เพื่อกำหนดกฎ regex
กลุ่มเส้นทาง
บางครั้งเส้นทางประกอบด้วยพรีฟิกที่ซ้ำกันจำนวนมาก ในกรณีนี้เราสามารถใช้กลุ่มเส้นทางเพื่อลดความซับซ้อนในการกำหนด。例如:
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");});
การใช้ group ซ้อนกัน
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 ที่อยู่การเข้าถึงคือเส้นทางประเภท any /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。
หากนักพัฒนาต้องการเข้าแทรกกระบวนการทางธุรกิจเมื่อไม่พบเส้นทาง สามารถใช้เส้นทางสำรองที่ 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');
// ปิดการใช้งานเส้นทางเริ่มต้นของแอปพลิเคชัน admin ของปลั๊กอิน foo ไม่กระทบกับโปรเจ็กต์หลัก
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';
}
}
อินเทอร์เฟซเส้นทาง
// ตั้งค่าเส้นทางสำหรับวิธีคำขอใด ๆ ของ $uri
Route::any($uri, $callback);
// ตั้งค่าเส้นทางคำขอ get สำหรับ $uri
Route::get($uri, $callback);
// ตั้งค่าเส้นทางคำขอ post สำหรับ $uri
Route::post($uri, $callback);
// ตั้งค่าเส้นทางคำขอ put สำหรับ $uri
Route::put($uri, $callback);
// ตั้งค่าเส้นทางคำขอ patch สำหรับ $uri
Route::patch($uri, $callback);
// ตั้งค่าเส้นทางคำขอ delete สำหรับ $uri
Route::delete($uri, $callback);
// ตั้งค่าเส้นทางคำขอ head สำหรับ $uri
Route::head($uri, $callback);
// ตั้งค่าเส้นทางคำขอ options สำหรับ $uri
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');