RXN(“反應”的縮寫)是一個框架,旨在削減PHP生成的視圖的複雜性和混亂 - 將視圖拆分到適合您的幻想的前端。
RXN背後的哲學很簡單:嚴格的後端 /前端脫鉤。
包括Beta的計劃功能(未檢查):
RXN根據允許和免費的MIT許可發布。
RXN使用的命名區結構明確匹配類文件的目錄結構。儘管也方便,但它主要用於實現一些非常酷的自動加載功能。
例如,例如,您創建了一個名為OrganizationProductModelMyAwesomeModel類。只需將文件放入遵循命名空間約定的目錄結構中(例如{root}/organization/product/model/MyAwesomeModel.php )。當您需要打電話時,只需直接調用課程即可調用。無需在任何地方提出require 。
之前(不使用自動加載):
<?php
require_once ( ' /organization/product/model/MyAwesomeModel.php ' );
use Organization Product Model MyAwesomeModel ;
$ object = new MyAwesomeModel()
// object gets created!之後(使用自動加載):
<?php
use Organization Product Model MyAwesomeModel ;
$ object = new MyAwesomeModel()
// object gets created! RXN的本地類也存在相同的模式。例如,在{root}/rxn/api/controller目錄中找到RxnFrameworkHttpResponse response )。自動加載是RXN降低開銷的眾多方式之一。
以下文件擴展名由自動加載功能支持(您還可以在RxnFrameworkConfig中定義自定義擴展):
RXN生活,呼吸和吃例外。考慮以下代碼段:
try {
$ result = $ databse -> query ( $ sql , $ bindings );
} catch ( PDOException $ exception ) {
throw new Exception ( " Something went terribly wrong! " , 422 );
}如果您在應用程序中的任何地方都拋出Exception ,則RXN會自我終止,回滾任何程序中的數據庫交易,然後使用JSON優雅地響應:
{
"_rxn" : {
"success" : false ,
"code" : 422 ,
"result" : "Unprocessable Entity" ,
"message" : "Something went terribly wrong!" ,
//...
}
} 您使用RXN的後端的API端點示例可能是這樣的:
https://yourapp.tld/v2.1/order/doSomething
在哪裡:
v2.1是端點versionorder是controllerdoSomething是控制器的action (一種公共方法)現在,如果您想將get鍵值對添加到id = 1234的請求中,則通常會這樣做:
前:
https://yourapp.tld/v2.1/order/someAction?id=1234
在RXN中,您可以使用前向斜杠( / )將鍵和值放在URL中來簡化這一點,就像這樣:
後:
https://yourapp.tld/v2.1/order/someAction/id/1234
version , controller和action之後的奇數參數將導致錯誤。
通過對端點URL(例如, v1.1 , v2.4等)進行版本處理,您可以輕鬆地知道,只要您改變後端端點行為,就不會意外地破壞前端。此外,版本控制還有助於使您的文檔保持秩序;前端開發人員只能為文檔構建,一切都會起作用。
因此,對於具有v2.1版本的端點,第一個數字( 2 )是控制器版本,第二個數字( 1 )是動作版本。下面的示例是我們將如何使用Action 1 2
namespace Organization Product Controller v2 ;
class Order extends Rxn Framework Http Controller
{
public function doSomething_v1 () {
//...
}
}這允許前端和後端開發人員都可以落後於前端和後端開發人員。
是否想通過您的新型後端體系結構進行實驗和探索?沒問題,只要您有一個數據庫模式,您就有一套腳手架的API!使用類似於以下的URI訪問腳手架端點(請注意api而不是版本號):
https://yourapp.tld/api/order/create
https://yourapp.tld/api/order/read/id/{id}
https://yourapp.tld/api/order/update/id/{id}
https://yourapp.tld/api/order/delete/id/{id}
https://yourapp.tld/api/order/search
腳手架API是無版本的API,旨在以創建,讀取,更新和刪除(CRUD)操作和搜索的形式使前端開發人員完全訪問後端。他們的主要好處是,您不必花費大量時間在應用程序開發的早期階段手動製作CRUD終點。 (因為在需求發生變化時,正是這些發展的早期階段,而且事情不斷變化。)
警告:由於腳手架的API是無版本的API,因此它們繼承了與無版本的API相關的所有問題。後端發生變化後,這些API也會改變。這可能會以意外或隱藏的方式破壞應用程序。因此,隨著開發過程接近完成,將無版本的API轉換為版本的API是明智的。
雖然大多數人甚至在不考慮它的情況下進行某種形式的依賴注入,但事實是,手動實例化和注射課程的依賴性很多可能會很麻煩。以下示例應有助於證明通過容器容器自動依賴注入的好處。
之前(手冊DI):
// instantiate the dependencies
$ config = new Config ();
$ database = new Database ( $ config );
$ registry = new Registry ( $ config , $ database );
$ filecache = new Filecache ( $ config );
$ map = new Map ( $ registry , $ database , $ filecache );
// call the action method
$ this -> doSomething_v1 ( $ registry , $ database , $ map );
public function doSomething_v1 ( Registry $ registry , Database $ database , Map $ map ) {
$ customer = new Customer ( $ registry , $ database , $ map );
//...
}之後(使用DI容器容器):
// call the action method
$ this -> doSomething_v1 ( $ app -> container );
public function doSomething_v1 ( Container $ container ) {
$ customer = $ container -> get (Customer::class);
//...
}希望您能看到好處。使用RXN,無需每次實例化先決條件!使用容器容器使您的生活更輕鬆。
只需將所需的類Typehint作為一個參數,而POOF ,DI容器容器就會猜測所有依賴關係,並自動加載並註入它們。沒有混亂的需要。您不必手動注入依賴項!
之前(手動實例化):
// require the dependencies
require_once ( ' /path/to/Config.php ' );
require_once ( ' /path/to/Collector.php ' );
require_once ( ' /path/to/Request.php ' );
public function doSomething_v1 () {
// instantiate the dependencies
$ config = new Config ();
$ collector = new Collector ( $ config );
$ request = new Request ( $ collector , $ config );
// grab the id from the request
$ id = $ request -> collectFromGet ( ' id ' );
//...
}之後(自動實例化和注射):
public function doSomething_v1 ( Request $ request ) {
// grab the id from the request
$ id = $ request -> collectFromGet ( ' id ' );
//...
}看到區別嗎?