【问题标题】:If I don't use a template engine with my PHP, what should my code look like?如果我的 PHP 不使用模板引擎,我的代码应该是什么样的?
【发布时间】:2011-12-22 16:36:09
【问题描述】:

我不想使用 MVC 框架。我不想使用模板引擎。我是几个人店里的开发人员,那里的帽子全是,没有图形艺术家。我们做这一切(所有层)。我不希望代码与演示文稿混合,就像我在 Classic ASP 中所做的那样。

但是,我不知道我的代码在服务器端和实际演示之间应该是什么样子。

如果我没有在我的服务器端代码中发出 HTML,它如何到达 HTML 页面以便我可以执行<span><?= $myvar ?></span> 之类的操作?并在html页面中放置循环?

感谢您的建议。

【问题讨论】:

  • 无论你是否使用框架,MVC 都是一个很好的起点。
  • 我知道,但我并不总是拥有让每个人都这样做的奢侈,即使这是正确的方式。
  • 你真的没有不这样做的奢侈,因为适当的关注点分离可以极大地加速修改和调试。您将花费 90% 的时间在调试和维护上,只有 10% 的时间用于初始编码 - 问问自己您想在哪里节省开支。
  • @johnny 如果你不能让每个人都做你想让他们做的事,那么在这里寻求最佳实践没有多大意义;-)
  • @jeroen 我希望我至少可以让事情变得更美味。

标签: php templates


【解决方案1】:

为了使用循环和所有,我使用控制结构的替代语法。

一个例子:

<div id="messages"<?php if(!(isset($messages) && count($messages))): ?> class="hidden"<?php endif; ?>>
    <?php if(isset($messages)): ?>
    <?php foreach($messages as $message): ?>
    <div class="message"><?php echo $message; ?></div>
    <?php endforeach; ?>
    <?php endif; ?>
</div>

欲了解更多信息,请参阅:http://php.net/manual/en/control-structures.alternative-syntax.php

哦,还有,我使用的是半 MVC 结构,其中我有一个处理模板(视图)的类,基本上它只是一个我创建实例的类,传递一组变量,然后在实例被销毁。我在该类中有一个变量数组,然后使用 extract 传递包含中的所有变量,如下所示:

extract($this->variables, EXTR_SKIP);
include($this->file);

编辑:这是 Smarty 中的相同示例:

<div id="messages"{if isset($messages) && !count($messages)} class="hidden"{/if}>
    {if isset($messages)}
    {foreach from=$messages item=message}
    <div class="message">{$message}</div>
    {/foreach}
    {/if}
</div>

【讨论】:

  • 模板引擎目前看起来不错。这看起来很难维护。
  • 正如评论所说 - PHP 一个模板系统。它的问题是它太擅长做其他事情了,所以人们,尤其是初学者,最终会在表示层中混入大量业务代码,这是真正的问题——而不是表示层中的任何代码。 jValdron 写的是一个相当不错的模板,就像模板一样,一个专用的模板系统不会有太大帮助,恕我直言。 PHP 从模板引擎中获得的最大好处是它们限制了您在演示中可以做的事情,从而削弱了过度渴望的编码人员。
  • 我以前用过 Smarty,让我告诉你,这是一个更大的痛苦......首先,它会使我的代码减慢至少 2 倍,其次,你必须学习新语法。
  • @johnny 公平地说,上面的缩进不正确。你也可以用&lt;? ?&gt;代替&lt;?php ?&gt;,你也可以用&lt;?= $var ?&gt;代替&lt;?php echo $var; ?&gt;
  • @johnny 不幸的是,我几乎自己开发了所有东西,所以我并不是说这是最好的方法,远非如此。但是,我使用 MVC 的主体,但不是强类型,我没有定义每个模型,我在 PDO 之上有一个层,这使得获取信息更容易。对于我的观点,我已经解释了一点。至于控制器,几乎所有东西都是页面,但我的框架中有一些类,它们的作用类似于控制器。我不介意分享一些代码,但是,它确实适用于我的所有框架。
【解决方案2】:

简单的 PHP 项目通常就地生成完整的 HTML,而不是填充模板,因此您只需在 PHP 代码中将其 echo 输出即可。

这会变得一团糟,因此您最终会为任何中等复杂的网站编写某种模板系统。

一种可能的替代方法是将您的页面作为完全静态的 HTML/CSS 提供,并使用 AJAX 动态获取实际内容(JSON 将是一种很好的传输格式,它是 JS 的原生格式,并且可以很容易地从 PHP 生成)。这使您摆脱了散布在 PHP 代码中的所有 HTML。这是否是一个可行的替代方案取决于具体情况。

【讨论】:

    【解决方案3】:

    &lt;span&gt;&lt;?= $myvar ?&gt;&lt;/span&gt; 有效。

    一个循环看起来像:

    <html>
     <body>
    
    <?php
     for ($i=1; $i<=5; $i++)
       {
       echo "The number is " . $i . "<br />";
       }
     ?>
    
    </body>
     </html> 
    

    示例取自here

    【讨论】:

    • 伙计,太丑了。不是你,只是认为它看起来很糟糕,就像设计糟糕一样。
    • LMAO,谢谢哥们。我不是网络开发人员,所以对我来说它看起来很漂亮。 :)
    • 我不是故意的。我只是说我没想到会这样,它看起来很像我现在所做的。我只是没想到。谢谢。
    • 恕我直言,这是实现“内联 php”的最佳方式,而且就美观而言,它实际上与“最先进的”Microsoft MVC Razor 语法非常相似。
    【解决方案4】:

    我真的建议您使用php Template Inheritance 系统。 (别吓到你,它只是一个文件。)这是一组简单的函数,可帮助您构建可扩展的 PHP 视图,而没有手动包含的问题和限制。

    它仍然是纯 PHP,所以你不需要学习一些奇怪的模板语言。它可能看起来不多,但一旦开始使用它就真的很强大。

    【讨论】:

      【解决方案5】:

      可以肯定的是,您可以自己完成这一切 - 但您想要的仍然是 MVC 模式,或关注点分离(“我不希望代码与演示文稿混合”)。或者至少是 MV,对于非常简单的应用程序(尽管它仍然很脏,模型直接影响视图)。

      实现这一目标的最简单方法是首先收集和处理所有数据,然后将它们打印出来。 php 文件中不允许有复杂的代码直接暴露给网络。

      <?php
        require('model.inc');
        process_capuchin_monkey_order_form();
      ?>
      ...
      <h1>Thank you for your order of <?php echo $order->num_monkeys; ?> monkeys.</h1>
      ...
      

      【讨论】:

        【解决方案6】:

        通常,您只想确保 HTML 中的 PHP 越少越好。这意味着事先进行所有数据处理,并简单地将一组变量以一种或另一种方式传递给包含 HTML 的方法或函数。

        任何混合了 PHP 的 HTML 都可以被视为模板。这是一个简化的示例:

        // view class
        
        class View {
        
           public function render($html_template) {
              include('view_path/' . $html_template . '.php');
           }
        }
        
        // html template file 'view_path/main.php'
        
        <html>
           <body>
              <h1><?= $this->title ?></h1>
           </body>
        </html>
        
        // usage
        
        $view = new View();
        $view->title = 'Some Title';
        $view->render('main');
        

        【讨论】:

        • 虽然您希望在 HTML 中使用尽可能少的 PHP,但您绝对不希望在任何 PHP 代码中使用任何 HTML。变得很乱。
        • 您也可以使用 __set() 魔术方法只允许在视图类中设置已定义的属性。这需要一些额外的设置,但可以防止人们设置错误的属性等。您可以更进一步,并在渲染期间检查所有属性以确保已设置所有定义的属性。一百万种方法你可以用这个。
        【解决方案7】:

        无论您做什么,都应该使用类似 MVC 的关注点分离。这意味着:

        1. 至少有一个文件是 html 文件,并且有一些变量。 (视图/模板)
        2. 至少有一个文件是 php 并且只与数据库对话。 (型号)
        3. 至少有一个文件处理 http 请求,从数据库中提取数据并执行视图。

        每种 php 模板语言的核心是在函数内部使用 extract()include

        function render_template($___filename, $___data) {
            extract($___data, EXTR_SKIP);
            include $__filename;
        }
        

        您可以使用类接口(视图对象)或输出缓冲来美化它,但这是每个模板系统的核心。您的控制器的职责只是为给定视图组装 $__data 参数(通常带有来自数据库的数据)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-07
          • 1970-01-01
          • 1970-01-01
          • 2011-11-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多