【问题标题】:Lightweight, PHP based, layout framework...know of any? [closed]轻量级、基于 PHP 的布局框架……你知道吗? [关闭]
【发布时间】:2010-10-31 12:29:10
【问题描述】:

我正在寻找一个轻量级的、基于 PHP 的布局框架。就像 Zend 框架如何使用布局一样,我想创建一个布局模板并只包含必要页面的内容。

<html>
<head>
<title><?= $pageTitle ?></title>
</head>
<body>
<?= $content ?>
</body>
</html>

有人知道这样做的吗?我会使用 Zend 框架,但它对于我想要实现的目标来说太过分了。

【问题讨论】:

    标签: php layout frameworks


    【解决方案1】:

    我投票给 PHP。 (PHP 一个模板引擎。)

    function template($file, $vars) {
      ob_start();
      if(count($vars) > 0) { extract($vars); }
      include 'views/'.strtolower($file).'.php';
      return ob_get_clean();
    }
    

    顺便说一句,它可以让您执行以下操作。

    echo template('layout', array( 'content' => template('page', $myData) ));
    

    当 PHP 本身只需要 6 行代码就足够时,您还应该使用另一个模板/布局引擎吗?

    编辑:

    也许我不清楚这是如何工作的。

    template() 使用模板的名称(也用于组织工作的子目录)调用,并将数组对象作为第二个参数。如果给定的变量不是空的,比如template('index',null),那么这个数组就被当作一个关联数组:每个键都变成一个包含值的变量。

    所以逻辑变成:

    template('my_template', array(
      'oranges' => 'apples'
    ));
    

    而“views/my_template.php”是:

    <html>
    <head>
      <title>Are apples == <?= $oranges ?>?</title>
    </head>
    <body>
      <p style="color: <?= $oranges == 'oranges' ? 'orange" : 'darkgreen' ?>">
        Are apples == oranges?
      </p>
    </body>
    </head>
    

    因此,每次使用变量$oranges 时,PHP 都会获取从数组$vars['oranges'] 导出的数据。

    所以所有的输出都被ob_get_clean() 获取并作为字符串返回。要仅输出此字符串echoprint,或将其分配给要作为内容传递给布局的数组。如果你理解了这一点,那么就很容易把我写的东西拿来做一个布局,或者甚至可以输出 JSON 的逻辑页面。

    我建议您在丢弃它之前尝试一下这个答案。它有一种在你身上生长的趋势。

    编辑 2:

    根据要求,我将展示我的项目将使用的目录布局。请注意,其他 MVC 框架使用不同的结构。但是,我喜欢我的简单。

    index.php
    application/
      framework.php
      controllers/
        welcome.php
    views/
      template.php
      index.php
    

    出于安全目的,我有一个.htaccess 文件,它将除js/css/ 之外的每个请求路由到index.php 脚本,从而有效地隐藏了我的目录。如果您愿意,您甚至可以通过模板制作 CSS,我已经这样做了,用于使用变量等。

    因此,对template('template', array()) 的任何调用都会自动加载文件./views/template.php。如果我在名称中包含斜杠,它将成为路径的一部分,如下所示:./views/posts/view.php

    编辑 3:

    感谢您的更新。因此,您的 index.php 文件中必须有一些代码将请求的 url 路由到适当的控制器,对吗?你能展示一些吗?此外,您的视图看起来不像您的控制器目录。你能解释一下 url 如何映射到控制器和/或视图吗?你在framework.php中有什么?它有什么作用?谢谢!

    我展示的代码是我用于 Web 开发的私有框架的一小段摘录。 I've talked already about potentially releasing it 具有双重许可,或作为商业用途的捐赠软件,但它不是任何人都不能在短时间内(15-21 天)编写的。如果你愿意,你可以read my source code on GitHub... 但请记住它仍然是 alpha 材料。

    许可证是Creative Commons SA

    【讨论】:

      【解决方案2】:

      如果你想要超轻量级,你可以使用auto-prepend 文件,混合一些output buffering 来构建你想要的东西。对于初学者,您需要设置您的前置和附加文件 - 将以下行放入您的 .htaccess 文件中(您可能也希望使前置和附加文件对访问者不可读):

      php_value auto_prepend_file prepend.php
      php_value auto_append_file  append.php
      

      然后在您的 prepend.php 文件中,您需要打开输出缓冲:

      <?php
      ob_start();
      

      append.php 中,您需要获取输出缓冲区的内容,清除缓冲区并对您想要的内容进行任何其他处理(在此示例中,我设置了默认值)页标题)。

      <?php
          if (!isset($page_title)) {
              $page_title = 'Default Page Title';
          }
      
          $content = ob_get_contents();
          ob_end_clean();
      ?>
      <html>
          <head>
              <title><?php echo $page_title; ?></title>
          </head>
      
          <body>
              <?php echo $content ?>
          </body>
      </html>
      

      在此之后,您可以正常编写每个页面。这是一个示例 index.php

      <?php
          $page_title = "Index Page!";
      ?>
      
      <h1>This is the <?php echo __FILE__; ?> page</h1>
      

      ...还有一个例子 other.php 做了一些有趣的事情:

      <?php
          $page_title = "Secondary Page!";
      ?>
      
      <h1>This is the <?php echo __FILE__; ?> page</h1>
      <p>enjoy some PHP...</p>
      
      <ol>
          <?php for ($i = 1; $i <= 10; $i++) : ?>
              <li><?php echo "$i $i $i"; ?></li>
          <?php endfor ?>
      </ol>
      

      你就完成了。您可以在此基础上进行一些扩展,例如在 prepend 中初始化 DB 连接,但在某些时候,您可能希望转移到一个更抽象的系统,该系统打破了 URL 到路径和文件的固定映射。

      【讨论】:

      • 我喜欢这个。它很简单,使用我能理解的 PHP,并按照我想要的方式工作。我的问题:有没有办法在不使用 htaccess 的情况下实现这一目标?另外...我假设 append.php 是“布局”。这假设我总是想使用这个布局。有没有办法用多个布局做到这一点?还是没有布局?我不介意 URL 的固定映射,但这让我想知道……这是否适用于子目录?
      • 您可以在 PHP.ini 中而不是在 htaccess 中设置前置和附加文件。如果您想更改布局,您可以使用另一个间接级别来做到这一点,并让每个页面定义一个 $layout 变量以及页面标题,并让附加文件 require() 具有您想要的特定布局。只要您正确设置了前置和附加文件的路径(手册上说“文件被包含,就好像它是用 require() 函数调用的,所以使用了 include_path”),你应该对文件没有问题在子目录中。
      【解决方案3】:

      实际上,我将在 europaphp.org 上发布一个示例以及完整的文档。它在约定和编码标准方面与 Zend 框架非常相似。完成后我会发布一些东西;可能在下周内。

      您可以在以下位置获取代码:[http://code.google.com/p/europa/source/browse/#svn/trunk/Sandbox - 默认][1]。

      该链接将为沙盒带来最新的 svn,您无需任何配置即可下载并开始使用。

      目前,它比大多数其他 PHP 框架都快。

      [1]:http://code.google.com/p/europa/source/browse/#svn/trunk/Sandbox - 默认

      【讨论】:

      • 终于有时间去看看 europaphp.org。正是我想要的!看起来就像我喜欢使用 Zend 框架。
      【解决方案4】:

      BareBones: 一个单一文件,无配置,PHP5 的 MVC 框架

      【讨论】:

        【解决方案5】:

        FryPHP 几乎是轻量级的。

        【讨论】:

          【解决方案6】:

          Limonade 也可能有用...不是严格的布局。

          【讨论】:

            【解决方案7】:

            我已经使用Smarty 很多年了。 它成熟、积极维护并得到广泛支持。

            无论如何,您可以在这里找到各种模板引擎: http://en.wikipedia.org/wiki/Template_engine_(web)

            如果您单击语言列,您将很容易看到 PHP 有哪些可用的内容,以及引擎的比较情况。

            【讨论】:

            • -1 表示聪明。太古老了,有更好的引擎可用。
            • 是的,Smarty 不好 - nosmarty.net
            【解决方案8】:

            只是加入另一个框架:CodeIgniter 恕我直言,它非常好,使用 MVC 方法,因此您可以将文件输出为视图并说占用空间很小。它还有一个template parser

            干杯,

            【讨论】:

              猜你喜欢
              • 2016-06-01
              • 2011-05-19
              • 1970-01-01
              • 1970-01-01
              • 2011-10-22
              • 2010-09-09
              • 2010-10-27
              • 2011-02-18
              • 2023-04-09
              相关资源
              最近更新 更多