根据$ _GET变量内容加载模板或视图

时间:2011-04-07 09:23:43

标签: php apache mod-rewrite

我正在设计Q&一个网站使用PHP。这是目录结构:

+include
  db.php
  user.php
  template.php
  ...
  question.php
+public
  +images
  +styles
.htaccess
index.php
...

我想使用index.php的REQUEST_STRING来加载模板。

例如:index.php?page=signin会在get_signin_template()中加载函数template.php。并会向访问者显示http://example.com/signin/等网址。

以下是我的问题:

  1. 如何在index.php中加载不同的模板(该文件应该做什么)?
  2. 如何重写网址(使用apache mod_rewrite)?

2 个答案:

答案 0 :(得分:1)

回答问题1

$valid_templates = array('signin', 'logout', 'home');
if(isset($_GET['page'])
   and in_array($_GET['page'], $valid_templates)) {
    $function_name = 'get_' . $_GET['page'] . '_template';
    $template = call_user_func($function_name);
}

请参阅call_user_func() in the PHP manualin_array() function in the PHP manual

我认为值得一提的是,我不会这样做。将URL直接映射到函数是一种不灵活的处理方式。

我添加$valid_templates数组的原因是为了确保用户不会尝试更改URL以尝试调用不存在的函数等。您需要将每个页面/模板函数添加到其中

如果您真的喜欢这种工作方式,那么我建议您查看Limonade,因为它使用与您尝试设置的方法类似的调度方法(以下示例来自their official site) :

require_once 'vendors/limonade.php';
dispatch('/', 'hello');
  function hello()
  {
      return 'Hello world!';
  }
run();

但在我看来,这样做更安全,更容易管理。此外,所有“硬”管道工作已经完成,您可以专注于添加页面。

另一个类似的选项是Slim,如下所示:

require 'Slim/Slim.php';
Slim::init();
Slim::get('/hello/:name', function ($name) {
    echo "Hello $name";
});
Slim::run();

来自their site

的示例

回答问题2

.htaccess文件中的这些内容应该可以满足您的重写需求。

RewriteEngine On
RewriteBase /
RewriteRule ^(.*)$ index.php?page=$1 [QSA,L]

答案 1 :(得分:-2)

1.for index.php?page = signin

$urlEnd=$_GET['page'];
require('path_to_file'.$urlEnd);//Require your file
header('Location: index.php?/$urlEnd');//WARNING!!! HEADER MUST go befor any echo's