Re: [請益] 程式/檔案架構的問題

作者: GALINE (天真可愛CQD)   2018-04-01 13:32:09
※ 引述《kyowinner (mars)》之銘言:
: 各位好 想問一個好像有點蠢的問題
: 也是突然想到的,不知道跟執行效率有沒有什麼關係
: 就是在一個專案裡各位會大概怎麼安排檔案/程式架構
: 問題如下
: 1. 所有程式碼在同一個檔案下 ex:index.php
: index.php 用if 或是任何方式去判斷要執行的功能
: if(新增A頁面資料){
: }elseif(刪除A頁面資料){
: }elseif(.....)}
: }
: 諸如此類
以這年頭的 MVC framework 來考量,這是半個「正確」答案了
這樣的好處是你可以把全專案共通邏輯放在同一個地方
甚至連 render 畫面的邏輯都放在同一個地方
然而不共通邏輯也放在同一個地方會很難改
所以最好是把不共通邏輯拆出去
於是就會變成
index.php
// 載入共通功能
include __DIR__ . '/lib/lib.php';
// 用路徑跟 http method 決定要做什麼
// $action 是檔名
$method = $_SERVER['REQUEST_METHOD'];
$uri = rawurldecode($_SERVER['REQUEST_URI']);
$action = checkAction($url, $method);
// 執行功能,得到結果
$logicFile = __DIR__ . "/action/{$action}.php";
$result = include $logicFile;
// 印出結果畫面
render($action, $result);
雖然很土炮,但是 MVC framework 的樣子已經出來了
checkAction() 是 Router
/action 資料夾裡面的東西是 Controller
render() 處理 View
Model 在哪裡?在 controller 的邏輯裡面
系統核心主幹裡面原則上不該有
這是完全不使用 OOP 跟 Class autoloading 的前世代寫法
基本上一路 include 是能夠打天下,但系統要變大後問題還滿多的
可以參照 #1NHddLlC (Soft_Job)
用 OOP 的寫法大概會是這樣
// 載入 autoloader
include __DIR__ . '/vendor/autoload.php';
// 用路徑跟 http method 決定要做什麼
// $action 是 class name,例如 "\My\Controller\Article"
$method = $_SERVER['REQUEST_METHOD'];
$uri = rawurldecode($_SERVER['REQUEST_URI']);
$action = (new \My\Router())->route($url, $method);
$controller = (new $action());
// 執行功能,得到結果
$result = $controller->run();
// 印出結果畫面
$template = $controller->getTempate();
(new \My\View)->render($template, $result);
各 Framework 其實差不多就是這樣做出來的。
當然啦,比起各知名 framework 這依然相當土炮。
不過這樣的架構已經可以讓你用很久了
自己刻 framework 沒那麼難的啦(大拇指
: 2.各頁面相對應各自的程式檔
: A.html
作者: nacoyow (夢遊上班族)   2018-04-01 21:41:00
推一個!
作者: carrielis (Carrie)   2018-04-02 06:40:00
大推思維!
作者: gname ((′口‵)↗︴<><...<><)   2018-04-02 09:37:00
第2種方法的另一個好處是出問題是死一支,不是死一片
作者: kyowinner (mars)   2018-04-04 12:39:00
大感謝 好好研究學習一下
作者: JohnRoyer (Zero 日落)   2018-04-06 12:51:00
大大什麼時候要寫 framework? XD
作者: GALINE (天真可愛CQD)   2018-04-07 21:12:00
是有自己做輪子來玩沒錯啊... https://goo.gl/UnvfTc

Links booklink

Contact Us: admin [ a t ] ucptt.com