【问题标题】:PHP layout managerPHP 布局管理器
【发布时间】:2011-11-19 10:35:37
【问题描述】:

我不确定我是否可以在这里问一个更实际的问题,因为这个问题不像提供好的建议那样得到更多的支持。

我有一个带有简单布局管理器(没有更好的术语)的前端控制器,它有效地加载默认(或自定义,如果指定)html“布局”或骨架,并根据用户页面请求,将插入将另一个文件(称为视图文件)放入骨架内容区域。

骨架可能看起来像:

<div id="header">
    <h1>head goes here</h1>
<div id="content">
    <?php $this->insertContent(); ?>
</div>
<div id="footer">
    <p>footer goes here</p>
</div>

虽然很简单,但这使得以后的更新变得容易,因为如果客户现在希望我添加一个 jquery 滚动条,我可以将它添加到单个布局中,因为不必编辑多个文档来实现相同的目标.

然而,我的朋友说他认为这不是一个好的解决方案,并认为我不应该拆分我的“视图”文件和布局,而是坚持使用前端控制器,并且我的 html 页面应该使用 php include (include header and页脚)并将我的 html 页面保存为 1 个文件,因为:

  1. 布局管理器会降低我的应用程序的灵活性,因为我将自己绑定到一个布局(除非我创建一个新布局并在我的页面控制器文件中指定它应该使用不同的布局)。
  2. 其他开发人员很难理解其中的逻辑,而我正在创造比需要更多的工作
  3. 简单的 HTML 开发人员将无法进行适当的测试,因为他们只能真正在 sn-ps 上工作,与整个 HTML 文档相对应并看到更大的图景。
  4. 这更令人困惑,因为要对页面进行更改,我需要在视图文件或框架文件中进行修改,并且您需要知道何时编辑框架文件。

我将很快开始开发一个具有多个开发阶段的项目,对此做出决定对我来说至关重要,因为我希望应用程序尽可能灵活并创建尽可能少的工作,但是还构建它,以便我可以轻松地对站点进行修改、改进或更改。我真的很重视一些建议,因为这个论点现在是基于 2 个人的意见。任何需要考虑的问题,以及可能关于更大的主流框架和 CMS 工作的信息也将帮助我做出更好的决定。

【问题讨论】:

    标签: php layout front-controller


    【解决方案1】:

    你所做的是所谓的Two Step View Pattern

    这是一种常见的模式,如果您这样记录它,任何开发人员都很容易理解它。

    每种模式都有其优缺点,我建议阅读 Fowler 书中的相应章节,以获得很好的介绍和基础。

    布局这个术语更广泛,但开发人员也很好理解,但并不那么精确。

    【讨论】:

    • 最后是我努力解释的一个术语 :)
    【解决方案2】:

    Zend_Layout 是您进行布局管理时唯一需要的东西,非常有帮助。

    虽然你可以很容易地实现你自己的。像这样的:

    <?php
    
    class Layout
    {
    
        private $_data = array();
    
        public function __set($name, $value)
        {
            $this->_data[$name] = $value;
        }
    
        public function __get($name)
        {
            return array_key_exists($name, $this->_data) ? $this->_data[$name] : NULL;
        }
    
        public function __isset($name)
        {
            return isset($this->_data[$name]);
        }
    
        public function __unset($name)
        {
            unset($this->_data[$name]);
        }
    
    }
    
    // Usage
    
    $layout = new Layout();
    
    $layout->title = 'Welcome to my application mate!';
    
    $layout->content = load_content_from_template('template_file.php');
    
    $layout->scripts = array(
        'jquery',
        'jquery.plugin'
    );
    
    $layout->scripts[] = 'common';
    
    ?>
    
    // Inside the layout file, assuming that $layout variable is available in this scope.
    
    <html>
    <head>
        <title><php echo $layout->title ?></title>
    </head>
    <body>
    
        <div id="content">
            <php echo $layout->content ?>
        </div>
    
        <?php
            foreach ($layout->scripts AS $script)
                echo '<script type="text/javascript" src="/path/to/scripts/directory/' . $script . '.js"></script>';
        ?>
    
    </body>
    </html>
    

    【讨论】:

    • 这也是我通常做的,除了我还有一个方法可以从 layout/view 实例中包含 html 模板。这样您就可以以$this-&gt;varName 的身份访问模板中的变量,并且可以确保您只能访问布局实例的属性(当然也可以访问全局属性)。我想这也是采埃孚的做法。
    【解决方案3】:

    尝试使用https://github.com/mahadazad/php-layout-manager,它很简单,也可以与codeigniter集成。

    【讨论】:

      【解决方案4】:

      看看 Smarty。

      http://www.smarty.net/

      WordPress 使用 Smarty 的变体,我自己的 CMS 也是如此。我敢肯定其他大型 CMS 使用 Smarty 或做同样事情的替代品

      【讨论】:

      • Wordpress 不使用 Smarty 的变体。
      • 我最近没有在 Wordpress 上工作,但几年前我帮助 Donncha 完成了一些绝对是 Smarty 的工作 (verens.com/2004/08/12/…)
      • 有趣,但最终没有进入 wordpress。
      • 还不错 :-) 不过,我还是建议在 OP 中使用 Smarty
      • 哦不,和 smarty 一起走吧 ;)。 PHP 世界自推出以来发生了很大变化,我建议它仅出于遗留原因。例如,twig 现在在这里做得更好。
      猜你喜欢
      • 2018-06-12
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-06
      • 2012-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多