AhliuMVC 0.1 alpha
好遺憾, 在市面上framework充斥的世代, 我仍然自己寫左個 MVC framework, 仲要係用 PHP5 OO, 真冇陰公. 呢個 framework 的理念同精神係做返「Open/Closed Principle」
- 基本 action dispatcher, 咪又係例如D支援 RESTful, 總之你 extend 呢個 class 之後就任你改, 例如改到所有 output 都畀個 template engine wrap 住
- Declarative system flow, 用返 PHP 做 native language 去描述個 action 點做, exception 點 handle, transaction 點搞, 個 role 點 check 之類
- After/Before execute, 模擬類似 AOP, 但我冇整 around, 咁順勢可以將堆 logging, transaction, security check 抽返晒出黎
- Plugin, 超重要, 成功將 AhliuORM 同自行開發的 template function 以 plugin 方式嵌入始 framework, 大幅降低 coupling 同方便做 package update/3rd party module quick fix. 點 plug 個 module 入 AhliuMVC, 只係需要在各自 module 開返個「settings.php」, declaratively 咁講返你有咩變數要用, 堆 after/before 要插落 load 某個 PHP 之前或後, 行某個 method 之前或後, 或者 upon 某個 exception 時要做乜
- Filter, 係一種簡約版的 After/Before, 同樣分為 beforeFilter 同 afterFilter, 不過 Filter 所 wrap 住的 scope 係整個 ApplicationContext 的 scope, 類似人地 servlet container 的 filter, 建議用黎做 logging 或者放o係 afterFilter 做下 memory usage statistics
另外 AhliuMVC 會以「ModelSystem」這個 class, 作為 AhliuORM 的 adapter, 管理其 transaction 及 life cycle, 有效減少無謂的記憶體備用量, 以及支援 transaction scope, 大家只需要在「plugins/AhliuORM/conf/exception.php」加類似這些:
ModelSystem::$exceptionPolicies = array(
“/admin/*” => array(”-*Exception”),
“/user/login.php” => array(”+UserNotExistedException”, “-UserDisabledException”),
“/user/*” => array(”-*Exception”),
);
咁就可以控制到逢「/admin」的 action 在各種 Exception 下都要 rollback, 用「/user/login.php」時遇上「UserNotExistedException」時照 commit (呢個 case 係 for 我要將呢條撞 password 的粉腸 log 入 DB), 遇上「UserDisabledException」就可以 rollback, 諸如此類
而 transaction scope 的控制則是以呢種形式:
System::addBeforeActionExecute(”ModelSystem”, “beforeManagerExecute”, “*Manager”, “update*”);
System::addAfterActionExecute(”ModelSystem”, “afterAdminExecute”, “AdminCreateUserAction”, “create*”);
System::addBeforeActionExecute(”ModelSystem”, “defaultBeforeExecute”, “*”, “*”);
System::addBeforeActionExecute(”ModelSystem”, “defaultAfterExecute”, “*”, “*”);
遇到有野 call 相應的 class, 例如「UserManager」或「ItemManager」會 hit 中第一條 rule, 咁就會執行「ModelSystem::beforeManagerExecute( )」黎做你o既o野