轻量级、基于PHP的布局框架...你知道有哪些吗?

4

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

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

有人知道有什么工具可以实现这个吗?我想使用Zend框架,但它对我想要实现的功能来说太过庞大了。

8个回答

33

我支持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中有什么?它是做什么的?谢谢!
这段代码是我私人网页开发框架的一小部分。我已经讨论过可能以双重许可证或作为商业使用捐赠软件发布,但是任何人都可以在短时间内(15-21天)编写出来。如果您想要,可以在GitHub上查看我的源代码...但请记住它仍然是alpha材料。 许可证是创意共享SA。

3
如果您想要超轻量级,可以使用自动预先加载文件,结合一些输出缓冲来构建您想要的内容。首先,您需要设置预先加载和附加文件-将以下行放入您的.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的固定映射,但这让我想...这是否适用于子目录? - Andrew
你可以在PHP.ini中设置prepend和append文件,而不是在htaccess中设置。如果你想改变布局,你可能可以通过另一层间接性来实现,并让每个页面定义一个$layout变量,以及一个页面标题,并让append文件require()你想要的特定布局。只要你正确设置了prepend和append文件的路径(手册上说“该文件被包含就像使用require()函数一样,所以使用include_path”),你在子目录中的文件就不会有问题。 - Sean McSomething

2

BareBones:一种适用于PHP5的单文件、无配置、MVC框架。


2
我实际上正准备在europaphp.org发布一个带有示例和完整文档的版本。它非常类似于Zend框架的约定和编码标准。完成后我会发布一些东西,可能会在下周内完成。
你可以在这里获取代码:[http://code.google.com/p/europa/source/browse/#svn/trunk/Sandbox - 默认][1]。
该链接将带出Sandbox的最新svn,您可以直接下载并开始使用,无需任何配置。
目前,它比其他大多数PHP框架都要快。
[1]: http://code.google.com/p/europa/source/browse/#svn/trunk/Sandbox - 默认

终于抽空去看了 europaphp.org。正是我想要的!看起来就像我喜欢使用 Zend Framework 的样子。 - Andrew

1

再提供一个框架的建议:CodeIgniter 是我个人认为非常好的,它采用 MVC 架构,因此您可以将文件作为视图输出,并且据说有很小的占用空间。它还内置了 template parser

祝好!


1

FryPHP 是最轻量级的框架之一。


1

Limonade 可能也很有用... 不完全是布局相关。


1

我已经使用Smarty很长时间了。 它非常成熟,得到积极维护,并且得到广泛支持。

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

如果你点击语言列,你将轻松看到PHP可用的内容以及引擎之间的比较。


3
对于Smarty来说,评分为负一。它太过古老了,现在有更好的引擎可供使用。 - Alex Weinstein
Smarty不太好用 - http://nosmarty.net/ - raspi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接