V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
precisi0nux
V2EX  ›  PHP

关于最佳实践

  •  
  •   precisi0nux · 2016-02-26 18:58:32 +08:00 · 2376 次点击
    这是一个创建于 2983 天前的主题,其中的信息可能已经有所发展或是发生改变。
    需求很简单,从数据库的一个表中抓数据,然后把取得的数据做成导航菜单。每一个页面都需要引用这个菜单,请问我应该把抓数据库的代码放在那里,我想着放到 View ,因为每个页面都会用到它,但这明显不是最佳实践,应该是放在 model 里面。可是放在 model 里面的话难道每个 function 都去执行一边抓数据库的代码,那不是重复代码了吗?抱歉水平不高,表达也不好,希望得到大家的帮助。
    第 1 条附言  ·  2016-02-28 06:09:18 +08:00
    抱歉忘了说框架,是 Laravel 。从评论中看到很多好的想法,打算今天来实践以下。当然有更加 Laravel 的方法也可以指出,谢谢大家。
    9 条回复    2016-02-28 15:57:08 +08:00
    ershisi
        1
    ershisi  
       2016-02-26 20:23:18 +08:00   ❤️ 1
    你不想这样的话,应该是打算把导航数据放在初始化的对象里面?
    opennet
        2
    opennet  
       2016-02-26 20:31:14 +08:00   ❤️ 1
    用类继承?
    raincious
        3
    raincious  
       2016-02-26 20:36:44 +08:00   ❤️ 1
    你在什么地方初始化那条导航菜单的?

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

    如果上述方法不合适的话,或许你可以做一个 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
        4
    raincious  
       2016-02-26 20:38:47 +08:00   ❤️ 1
    @raincious 抱歉,是 Tree 不是 Three 。
    jsonline
        5
    jsonline  
       2016-02-27 11:44:50 +08:00 via Android   ❤️ 1
    生成文件
    include
    Clarencep
        6
    Clarencep  
       2016-02-27 14:23:02 +08:00   ❤️ 1
    这个要看具体框架吧?你用的什么框架? 如果是 Yii 框架就简单了,直接封装个 widget 搞定~
    realpg
        7
    realpg  
       2016-02-27 17:21:48 +08:00   ❤️ 1
    我是放在 BASE_CONTROLLER 里的

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

    把数据共享给所有视图
    view()->share('data', [1, 2, 3]);
    precisi0nux
        9
    precisi0nux  
    OP
       2016-02-28 15:57:08 +08:00 via iPhone
    @dawniii 确实,刚从 CI 转过来。好多东西不习惯。谢谢指点。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3004 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 13:34 · PVG 21:34 · LAX 06:34 · JFK 09:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.