关于最佳实践

2016-02-26 18:58:32 +08:00
 precisi0nux
需求很简单,从数据库的一个表中抓数据,然后把取得的数据做成导航菜单。每一个页面都需要引用这个菜单,请问我应该把抓数据库的代码放在那里,我想着放到 View ,因为每个页面都会用到它,但这明显不是最佳实践,应该是放在 model 里面。可是放在 model 里面的话难道每个 function 都去执行一边抓数据库的代码,那不是重复代码了吗?抱歉水平不高,表达也不好,希望得到大家的帮助。
2455 次点击
所在节点    PHP
9 条回复
ershisi
2016-02-26 20:23:18 +08:00
你不想这样的话,应该是打算把导航数据放在初始化的对象里面?
opennet
2016-02-26 20:31:14 +08:00
用类继承?
raincious
2016-02-26 20:36:44 +08:00
你在什么地方初始化那条导航菜单的?

或许你可以给模板引擎设定一个钩子(如果模板引擎支持的话),在需要调用导航的时候执行这个钩子来进行操作。

如果上述方法不合适的话,或许你可以做一个 Base Controller ,然后在这个 Base Controller 的__construct 上写好 NavModel 的初始化和与 View 交互的过程,然后让所有需要用到这条导航的 Controller 全都变成这个 Controller 的子类。有点像:

class BaseController {
protected $view = null;

public function __construct() {
// build a view here or parent::__construct();
$this->view->assign('Nav', NavModel::getAll());
}

}

class HomePage extends BaseController {
public function get($request, $respond) {
$respond->write($this->view->render('Home'))
}
}

但是这样会做出一棵 Controller Three ,控制不好的话或许又是个不好的东西。
raincious
2016-02-26 20:38:47 +08:00
@raincious 抱歉,是 Tree 不是 Three 。
jsonline
2016-02-27 11:44:50 +08:00
生成文件
include
Clarencep
2016-02-27 14:23:02 +08:00
这个要看具体框架吧?你用的什么框架? 如果是 Yii 框架就简单了,直接封装个 widget 搞定~
realpg
2016-02-27 17:21:48 +08:00
我是放在 BASE_CONTROLLER 里的

需要导航的 Controller extends 这个 BASE CONTROLLER
不需要导航的去 extends 正常的 Controller 基类
dawniii
2016-02-28 15:21:32 +08:00
相信你没看 laravel 的手册

把数据共享给所有视图
view()->share('data', [1, 2, 3]);
precisi0nux
2016-02-28 15:57:08 +08:00
@dawniii 确实,刚从 CI 转过来。好多东西不习惯。谢谢指点。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/259371

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX