เว็บแมน (webman) เป็นเฟรมเวิร์ก PHP ที่มีประสิทธิภาพสูงที่สร้างขึ้นบน workerman ดังนั้นข้าพเจ้าได้รับหน้าที่ให้คำแนะนำด้านเทคโนโลยีและพัฒนาระบบก่อนที่จะเริ่มต้นการทำงานกับ Wokerman บนพื้นฐานของ PHP 7.1+
กรอบ (framework) ผลิตาจะย้ำในการบริการร่วมกับ Web Server ที่ต่ออยู่อย่างมีประสิทธิภาพ:
- ไม่ต้องการ Worker 的 PHP HTTP Server,แต่ก็สามารถใช้เมื่อต้องการ
- ไม่ต้องการ Kernel HTTP Server to PHP 如 PeachServer
- Web Server ASP.NET, ASP.NET Core, Node.js และอื่นๆ
- แชต (Chart) ด้วย Swoole Tracker
- ผาสะอันตรสื่จรขอมูลข้อควอนื่จงียนำ และบันทส่ม้้างขาทยาตขสอไลยังยัื่อููถุ้้ำ้ทบัตรต้อ้ง่ำำท (WebSocket + SSE)
- การจัดสตรางแบค เขว่แอใบปัดู๊ด้าบด้าตั5อ และขือ้ณุ้ับอใ้ำบดร้า้า
- หสีสูฉีั้ืงีด่็แีกีส่ีบแลป ้ีด่ิ้กียฉงีบเหีีฉ้ดการส่ีกี่็ีงดอูก534ียีดด้า็็ะดีบีแดุ-ุดรี้ด้ีด
กฎเส้นทางการเริ่มต้น
กฎเส้นทางการเริ่มต้นของ 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
(อ่านเพิ่มเติมที่ multiapp.html)
นอกจากนี้ 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
Route::any('/test', function ($request) {
return response('test');
});
โปรดทราบ
เนื่องจากฟังก์ชันปิดไม่ได้เกี่ยวข้องกับคอนโทรลเลอร์ใด ๆ ค่า$request->app
$request->controller
$request->action
จะเป็นสตริงว่างทั้งหมด
เมื่อเข้าถึง URL เป็น http://127.0.0.1:8787/test
จะคืนค่าเป็นสตริง test
โปรดทราบ
เส้นทางต้องเริ่มต้นด้วย/
เช่น
// ใช้ไม่ถูกต้อง
Route::any('test', function ($request) {
return response('test');
});
// ใช้ถูกต้อง
Route::any('/test', function ($request) {
return response('test');
});
เส้นทางคลาส
เพิ่มโค้ดเส้นทางต่อไปนี้ใน config/route.php
Route::any('/testclass', [app\controller\IndexController::class, 'test']);
เมื่อเข้าถึง URL เป็น http://127.0.0.1:8787/testclass
จะคืนค่าวิธีการทดสอบของคลาส app\controller\IndexController
พารามิเตอร์ของเส้นทาง
หากมีพารามิเตอร์ในเส้นทาง ใช้ {key}
เพื่อตรงคู่ค่า ผลลัพธ์ที่ตรงจะถูกส่งไปยังพารามิเตอร์ของวิธีควบคุมที่เกี่ยวข้อง (เริ่มจากพารามิเตอร์ที่สองขึ้นไปตามลำดับ) เช่น:
// ตรงกับ /user/123 และ /user/abc
Route::any('/user/{id}', [app\controller\UserController::class, 'get']);
namespace app\controller;
class UserController
{
public function get($request, $id)
{
return response('รับพารามิเตอร์ '.$id);
}
}
ตัวอย่างเพิ่มเติม:
// ตรงต่อ /user/123, ไม่ตรงต่อ /user/abc
Route::any('/user/{id:\d+}', function ($request, $id) {
return response($id);
});
// ตรง /user/foobar, ไม่ตรง /user/foo/bar
Route::any('/user/{name}', function ($request, $name) {
return response($name);
});
// ตรงทั้งหมดในคำร้องขอ options
Route::options('[{path:.+}]', function () {
return response('');
});
กลุ่มเส้นทาง
บางครั้งเส้นทางประกอบด้วยคำขึ้นต้นที่มีจำนวนมาก เราสามารถใช้กลุ่มเส้นทางเพื่อกำหนดให้ง่ายขึ้น เช่น:
Route::group('/blog', function () {
Route::any('/create', function ($request) {return response('create');});
Route::any('/edit', function ($request) {return response('edit');});
Route::any('/view/{id}', function ($request, $id) {return response("view $id");});
});
เทียบเท่ากับ:
Route::any('/blog/create', function ($request) {return response('create');});
Route::any('/blog/edit', function ($request) {return response('edit');});
Route::any('/blog/view/{id}', function ($request, $id) {return response("view $id");});
การซ้อนกลุ่มการใช้
Route::group('/blog', function () {
Route::group('/v1', function () {
Route::any('/create', function ($request) {return response('create');});
Route::any('/edit', function ($request) {return response('edit');});
Route::any('/view/{id}', function ($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.6 เมื่อใช้->middleware()
กลางเส้นทางสำหรับกลุ่มหลังจากนั้น เส้นทางปัจจุบันต้องอยู่ภายใต้กลุ่มปัจจุบัน
# ตัวอย่างที่ใช้ผิด (เมื่อ webman-framework >= 1.5.7 ใช้ได้)
Route::group('/blog', function () {
Route::group('/v1', function () {
Route::any('/create', function ($request) {return response('create');});
Route::any('/edit', function ($request) {return response('edit');});
Route::any('/view/{id}', function ($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) {return response('create');});
Route::any('/edit', function ($request) {return response('edit');});
Route::any('/view/{id}', function ($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 ใน URL ที่เป็นทั้ง any คือ /test/notify หรือ /test/notify/{id} ชื่อ routeName คือ test.notify
Route::resource('/test', app\controller\IndexController::class, ['index','create','notify']);
คำสั่ง | URI | การดำเนินการ | ชื่อเส้นทาง |
---|---|---|---|
GET | /test | ดึงข้อมูลทั้งหมด | test.index |
GET | /test/create | สร้าง | test.create |
POST | /test | บันทึกข้อมูล | test.store |
GET | /test/{id} | ดูข้อมูล | test.show |
GET | /test/{id}/edit | แก้ไข | test.edit |
PUT | /test/{id} | ปรับปรุง | test.update |
DELETE | /test/{id} | ลบ | test.destroy |
PUT | /test/{id}/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 ก็จะถูกสร้างขึ้นโดยอัตโนมัติ ซึ่งสามารถป้องกันการเปลี่ยนแปลงของไฟล์มุมมองที่เริ่มขึ้นจากการเปลี่ยนแปลงของเส้นทางได้
การรับข้อมูลเส้นทาง
หมายเหตุ
ต้องติดตั้ง webman-framework เวอร์ชัน 1.3.2 ขึ้นไป
ผ่าน $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()); // คุณลักษณะนี้ใช้ได้ก็ต่อเมื่อ webman-framework >= 1.3.16
}
หมายเหตุ
หากเส้นทางที่ร้องขอไม่ตรงกับเส้นทางใดที่ได้กำหนดไว้ใน config/route.php แล้ว$request->route
จะเป็นค่า null ซึ่งหมายความว่าเมื่อเข้าไปที่เส้นทางต้นสักเส้นทาง$request->route
จะเป็น nullการจัดการกับ 404
เมื่อไม่พบเส้นทาง ระบบจะส่งค่าสถานะ 404 และแสดงเนื้อหาของไฟล์
public/404.html
.
หากนักพัฒนาต้องการที่จะทำการกลับไปยังโหมดการทำงานเมื่อไม่พบเส้นทาง สามารถใช้ฟังก์ชันสำรองทางเส้นทาง $callback
ที่ webman มีให้ ตัวอย่างเช่น การเปลี่ยนเส้นทางที่ไม่พบไปที่หน้าแรก
Route::fallback(function(){
return redirect('/');
});
หรือเช่น ถ้าไม่พบเส้นทางจะส่งค่า JSON ซึ่งเป็นวิธีที่เหมาะสำหรับ webman เมื่อใช้สำหรับอินเตอร์เฟซ API
Route::fallback(function(){
return json(['code' => 404, 'msg' => '404 not found']);
});
ลิงค์ที่เกี่ยวข้อง การกำหนดหน้า 404 500
อินเทอร์เฟซเส้นทาง
// กำหนดเส้นทางที่ต้องการใดก็ได้ที่ $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);
// กำหนดเส้นทางที่มีการร้องขอหลายแบบพร้อมกัน
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 = '');
หากไม่มีเส้นทางที่เชื่อมโยง (รวมถึงเส้นทางตั้งตาย) และไม่ได้ส่งทางสำรองแล้ว จะคืนค่าสถานะ 404 ทันที
ไฟล์กำหนดเส้นทางหลายแบบ
หากคุณต้องการใช้งานไฟล์กำหนดเส้นทางหลายแบบในการจัดการเส้นทาง เช่น การประยุกต์ใช้หลายแอพ เมื่อแอพแต่ละตัวมีไฟล์กำหนดเส้นทางของตัวเอง ในกรณีนี้ คุณสามารถโหลดไฟล์กำหนดเส้นทางของภายนอกโดยวิธี require
.
ตัวอย่าง config/route.php
<?php
// โหลดไฟล์กำหนดเส้นทางที่ตั้งตาย
require_once app_path('admin/config/route.php');
// โหลดไฟล์กำหนดเส้นทางที่ตั้งตาย
require_once app_path('api/config/route.php');