# 路由器
[TOC]
http://localhost:8081/TestController/test
以上代碼會先在/app/Controllers目錄下尋找TestController控制器,如果沒有再去/Server/Controllers目錄下尋找,如果依舊沒有找到將返回404界面。
test是方法名,默認前綴名為‘http_’,可以通過修改ports.php配置設置不同端口的前綴。
所以以上url會訪問到/Server/Controllers下的TestController控制器的http_test方法并輸出helloworld。
```php
<?php
class TestController extends Controller
{
/**
* http測試
*/
public function http_test()
{
$this->http_output->end('helloworld',false);
}
}
```
## 多級路由
默認的NormalRoute支持多級路由
http://localhost:8081/V1/TestController/test
可以在app/Controllers目錄下添加V1目錄,這樣上面的URL將訪問V1目錄下的TestController類中的test方法。
可以添加更多級的文件夾。
## 自定義路由
自定義路由需要實現以下幾個方法
```php
interface IRoute
{
function handleClientData($data);
function handleClientRequest($request);
function getControllerName();
function getMethodName();
function getParams();
function getPath();
function errorHandle(\Throwable $e, $fd);
function errorHttpHandle(\Throwable $e, $request, $response);
}
```
1.(僅僅TCP)handleClientData 設置反序列化后的數據 Object
2.(僅僅HTTP)handleClientRequest 處理http request
3.getControllerName 獲取控制器名稱
4.getMethodName 獲取方法名稱
5.(僅僅HTTP)getPath 獲取url_path
6.(僅僅TCP)getParams 獲取參數/擴展
解析錯誤的回調
```php
function errorHandle(\Throwable $fd)
```
注意getParams是作為一個擴展,如果這里被返回了參數,那么這個參數會被直接當做調用Controller方法的傳入參數。
```php
class ProtoController extends Controller
{
public function makeMessageData(AbstractMessage $responseMessage)
{
//這里的$responseMessage就是getParams()獲取到的對象
}
}
```
## 自定義協議配置 route 舉例
和 Pack 中的例子對應, 將不同 `msg_type` 的消息分發到控制器中不同的方法下
```php
namespace Server\Route;
use Server\CoreBase\SwooleException;
class GameRoute implements IRoute
{
// 其他方法都可以保持不變
/**
* 獲取控制器名稱
* @return string
*/
public function getControllerName()
{
return 'GameController';
}
/**
* 獲取方法名稱
* @return string
*/
public function getMethodName()
{
$methodName = 'ping';
$msgType = $this->client_data->msg_type;
if ($msgType == 2) {
$methodName = 'pong';
}
return $methodName. 'Msg';
}
}
```
這樣, 不同類型的消息就分發到 `GameController` 下的對應 `method`, 使用 `$this->client_data` 即可獲取到 `unpack` 后的數據
- SD3.X簡介
- 捐贈SD項目
- VIP服務
- 基礎篇
- 搭建環境
- 使用Composer安裝/更新SD框架
- 啟動命令
- 開發注意事項
- 框架配置
- 配置文件夾
- server.php
- ports.php
- business.php
- mysql.php
- redis.php
- timerTask.php
- log.php
- consul.php
- catCache.php
- client.php
- 自定義配置
- 框架入口
- MVC架構
- 加載器-Loader
- 控制器-Controller
- 模型-Model
- 視圖-View
- 同步任務-Task
- 封裝器
- Swoole編程指南-EOF協議
- Swoole編程指南-固定包頭協議
- 封裝器-Pack
- 路由器
- TCP相關
- 綁定UID
- Send系列
- Sub/Pub
- 獲取服務器信息
- Http相關
- HttpInput
- HttpOutput
- 默認路由規則
- WebSocket相關
- 使用SSL
- 公共函數
- 進階篇
- 內核優化
- 封裝器路由器原理剖析
- 對象池
- 上下文-Context
- 中間件
- 進程管理
- 創建自定義進程
- 進程間RPC
- 自定義進程如何使用連接池
- 異步連接池
- Redis
- Mysql
- Mqtt
- HttpClient
- Client
- AMQP
- RPC
- 日志工具-GrayLog
- 微服務-Consul
- Consul基礎
- 搭建Consul服務器
- SD中Consul配置
- 微服務
- 選舉-Leader
- Consul動態配置定時任務
- 熔斷與降級
- 集群-Cluster
- 高速緩存-CatCache
- 萬物-Actor
- Actor原型
- Actor的創建
- Actor間的通訊
- 消息派發-EventDispatcher
- 延遲隊列-TimerCallBack
- 協程
- 訂閱與發布
- MQTT簡易服務器
- AMQP異步任務調度
- 自定義命令-Console
- 調試工具Channel
- 特別注意事項
- 日常問題總結
- 實踐案例
- 物聯網自定義協議
- Actor在游戲的應用
- Mongodb以及一些同步擴展的使用
- 自定義進程使用MQTT客戶端
- 開發者工具
- SDHelper