从1个PHP文件服务多个页面?

时间:2010-09-24 01:08:59

标签: php

所以基本上我正在努力为我的某些项目优化我的代码。 目前我的网页有add_company.phpview_company.phpedit_company.php

我想做的是从1个PHP文件company.php提供所有内容。 所以说company.php?action=viewcompany.php?action=edit等。用大量的if else语句来做这个是唯一的方法吗?这会让我的company.php像巨型巨人一样。

或者甚至更好,我怎样才能使用index.php为所有页面提供服务?

那么最好的方法是什么呢?我不是php guru,我对MVC或任何其他模式没有太多经验。

感谢。

5 个答案:

答案 0 :(得分:3)

你可以company.php

<?php

$allowed = array('add', 'view', 'edit');

if ( ! isset($_GET['action'])) {
   die('missing param');
}

$action = $_GET['action'];

if ( ! in_array($action, $allowed)) {
   die('invalid');
}



require $action . '_' . __FILE__;

快速又脏,但应该可以工作:)您可以将此代码放在任何文件中,它会立即生效。

通过一些修改,您可以使用index.php将其作为前端控制器。

答案 1 :(得分:0)

这很简单。看起来应该是这样的:

//index.php
if (!isset($_GET['page']))
    {
    require('index_contents.php');
    }
else if ($_GET['page'] == 'company')
    {
    if (!isset($_GET['action']))
        {
        require('company_contents.php');
        }
    else if ($_GET['action'] == 'edit')
        {
        require('edit_company.php');
        }
    else if ($_GET['action'] == 'add')
        {
        require('add_company.php');
        }
    else
        {
        require('company_contents.php');
        }
    }
else
    {
    require('index_contents.php');
    }

答案 2 :(得分:0)

一个非常简单的解决方案就是使用包含。

if ($_GET["action"] == "view") {
  require("action_view.php");
} else if ...

(当然,如果你有很多不同的页面类型,你可能想要使用switch语句)

然后action_view.php只包含特定页面的代码。

更好,但也更复杂的解决方案,将是面向对象的方法(具有工厂模式的抽象页面类)或直接的良好框架和模板引擎。

答案 3 :(得分:0)

您可以使用POST而不是GET与index.php:

<?php

require($_POST['action'] . ".php");

?>

这会隐藏用户的操作类型,就好像它是单个页面一样。但是,它可能需要在导航中使用表单而不是直接链接到“company.php?action = edit”。

答案 4 :(得分:0)

我总是喜欢为$ _GET变量使用switch语句。我个人倾向于将所有与一个实体(在本例中为公司)的逻辑放在一个PHP文件中,因为我通常处理大量实体。如果你想要一个MVC模型,这可能不是你想要的。我的2美分。

// Common page header
// Other stuff common in the pages

$page_to_load = $_GET[view];

switch($page_to_load) {

case 'view':
//Logic to view or HTML for view
break;

case 'add':
//Logic to add or HTML for add
break;

}
// Common footer etc..