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