這篇文章將為大家詳細講解有關如何在swoole中制作一款仿制laravel的框架,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
首先需要確定一下思路:我希望基于swoole的擴展開發的代碼在run起來的時候,在接收到ws或是tcp等消息時,自動路由到某個類上,同時類可以實現加載類的依賴注入功能。目前市面上占據主流的一款框架Laravel,其中有一個依賴注入的功能非常的便捷。一般在通常的框架中拉取Class是這樣做的:
class a { public $bClassInstance; public function __construct(Class b) { $classInstance = new b(); } public function doSth() { return $this->bClassInstance->xxx(); } } $b = new b(); $a = new a($b) $a->doSth();
而在Laravel中則可以省略一些實例化的步驟, 直接通過類型約束的語法在方法的形參上指定某類的命名空間就自動實例化該類進來了。
class a { public function doSth(b $b) { return $b->xxx(); } }
想要實現這一點,必須要了解php的反射機制。反射是一個比較冷門的類,他可以做到:使用namespace實例化一個類、調用類的方法等,利用這一點,可以構造一個自動裝箱的類。
<?php /*** * 依賴注入容器,若要執行依賴注入,請確保類包含構造函數! */ namespace App\Server; class Container { public $config; public $reflection; public function __construct($namespace) { try { $this->reflection = new \ReflectionClass($namespace); } catch (Exception $e) { echo $namespace; } } public function builderController($fn, $server, $frame, $userMessage) { //從route中得到的control名稱 $this->reflection->getMethod($fn)->invoke($this->autoBuilder(), $server, $frame, $userMessage); } public function builderTask($fn, $server, $userMessage) { $this->reflection->getMethod($fn)->invoke($this->autoBuilder(), $server, $userMessage); } public function autoBuilder() { #對構造函數賦值 return $this->batchInstantiation($this->getPrototypeController($this->reflection)#獲得字串 ); } protected final function getPrototypeController(\ReflectionClass $object) { $prototype = false; //批量從反射類中獲取原型字串 foreach ($object->getConstructor()->getParameters() as $parameter) { $prototype[] = $parameter->getClass()->name; } return $prototype ?: []; } protected final function batchInstantiation(array $prototypeArr) { foreach ($prototypeArr as $item) { $container = new container($item); $insArr[] = $container->autoBuilder();//進行遞歸注入 } return empty($prototypeArr) ? $this->reflection->newInstance() : $this->reflection->newInstanceArgs($insArr); } }
有了這個簡易的裝箱類后,可以著手實現類的路由功能,我們首先創建composer.json,鍵入如下內容。
{ "require": { }, "autoload": { "psr-4": { "App\\": "App/" } } }
下一步,我們需要創建一個處理路由的類,這個類在常規的框架中,一般用來映射http請求到對應的類的函數上,而在swoole里,請求會來自長連接。那么在route類中則需要做相應的處理。
class Route { public $websocketServer; public $model; public $cache; public function __construct() { $this->websocketServer = new \swoole_websocket_server("0.0.0.0", "8002"); } public function start_ws() { // 這里設置一些swoole的參數 ... // 最后執行啟動swoole $this->websocketServer->start(); } public function ws_onMessage(\swoole_websocket_server $server, $frame) { $userMessage = $this->filter_arr(json_decode($frame->data, true)); if (!$userMessage) { return false; } if (!$userMessage['type'] || !$userMessage['action']) { return $this->call_shell("Type or action not found! "); } //使用依賴注入容器做偽路由 $App = new Container('\App\Controller\\'.$userMessage['type']); return $App->builderController($userMessage['action'], $server, $frame,$userMessage); } }
最后一步,創建一個入口文件,引導路由類的執行。
<?php require "vendor/autoload.php"; use App\Server\Route; $App = new Route(); $App->start_ws();
關于“如何在swoole中制作一款仿制laravel的框架”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。