3

我一直在用 PHP 编写一个小页面,它不需要背后的成熟框架的力量。我之前在 Ruby-on-Rails 的工作中真正缺少的一件事是使用“content_for”有效地将内容传递到页面的能力。

我想知道的是,您如何创建一个在 PHP 中实现同样效果的页面生命周期?

所以,这里有一个简单的例子:

假设您有一个定义索引页面的模板,只是一个您想在所有页面上使用的重复标题和菜单。所以你的index.php文件看起来基本上是这样的:

...header stuff...
<body>
<?php include $file.'.php'; ?>
</body>
...footer stuff...

编辑:感谢有关 URL 安全性的提示,但我们假设我正在安全地获取用户请求:)

现在,让我们在标题中说你想把这个:

<head>
<title><?php echo $page_title; ?></title>
</head>

能够在包含的文件中指定标题会很好,因此在http://example.com/index.php?p=test您正在加载的 urltest.php中,该文件如下所示:

<?php $page_title = 'Test Page'; ?>
... rest of content ...

现在,显然这不起作用,因为包含页面(index.php)是在设置变量之前加载的。

content_for在 Rails 中,您可以使用该函数将内容“向上”传递。

我的问题是:在 PHP 中实现这种“content_for”功能的最简单、最精简的方法是什么?

理想情况下,我希望不涉及捆绑某些大型框架的建议,而是一些可用于许多不同应用程序的相对较轻的样板代码。

4

3 回答 3

4
  1. 永远不要include $_GET['p']。这会在您的站点中打开一个巨大的安全漏洞,因为 include 接受文件名和 URL,因此任何人都可以读取您站点上的任何文件并执行您服务器上的任何代码。您可能需要先检查并清理该值。
  2. 如果您需要一些简单的东西,您可以将页眉和页脚放在单独的文件中,执行您的设置变量,使用输出缓冲test.php捕获其输出,然后包含页眉,输出中间部分并包含页脚。例子:

    <?php ob_start(); ?>
    <body>
    <?php include $filename.'.php'; ?>
    </body>
    <?php $content = ob_get_clean(); 
     include 'header.php';
     echo $content;
     include 'footer.php';
     ?>
    
于 2010-12-15T05:09:44.057 回答
1

如果我理解正确(我没有广泛使用 RoR),您可以将数据放入变量或函数中。如果你的内容在一个变量中,你的“test.php”可以简单地保存你所有的变量,你可以在索引文件的最开始加载它(同样的函数取决于你的需求有多复杂;如果你是做很多额外的工作,您可能需要使用函数作为变量不起作用)。

例如,您的 test.php 看起来像这样:

<?php
$page_title = "Test Page";
$page_content = "Some sort of content";

// Or

function page_content()
{
    // Run some functions and print content at the end
}

?>

然后,在你的 index.php

<?php include $_GET['p'].'.php'; ?>
...header stuff...
<title><?php print $page_title; ?></title>
<body>
<?php print $page_content; ?>
<!-- OR if function -->
<?php page_content(); ?>
</body>
...footer stuff...

这样,一切都应该正确加载。您也可以将事情分开,但这会使您的结构复杂化(特别是如果不需要复杂的框架,这将是不必要的)。

祝你好运!
丹尼斯 M。

于 2010-12-15T05:08:42.420 回答
1

你担心 XSS 吗?还是您要从查询字符串中过滤/白名单“文件名”?

我的回答是使用 mod_rewrite ——如果您使用的是 PHP,那么您很可能使用的是 Apache!

您可以使用 RewriteCond 过滤掉文件,您的 RewriteRule 可以是:

RewriteRule /index.php?p=(.*)$ $1 [L,QSA]

这可能是与您正在寻找的 PHP 功能不同的方法,但我想到了......

于 2010-12-15T05:15:09.177 回答