【问题标题】:Serve multiple pages from 1 PHP file?从 1 个 PHP 文件提供多个页面?
【发布时间】:2012-06-12 18:12:29
【问题描述】:

所以基本上我正在努力为我的一些项目优化我的代码。 目前我有像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 大师,我对 MVC 或任何其他模式没有太多经验。

谢谢。

【问题讨论】:

标签: php


【解决方案1】:

你可以发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 将其设为您的前端控制器。

【讨论】:

  • if ( ! isset($_GET['edit'])) 不应该是if ( ! isset($_GET['action'])) 吗?
【解决方案2】:

我总是喜欢对 $_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..

【讨论】:

    【解决方案3】:

    这是非常简单的东西。它应该看起来像这样:

    //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');
        }
    

    【讨论】:

      【解决方案4】:

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

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

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

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

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

        • Not secure enough。黑客可以包含任何 PHP 文件。另外,我认为他想使用 GET。
        • @alex 感谢您告诉我 - 方便的链接。
        • 不用担心 :) 请参阅 my answer 了解我在这种情况下是如何处理问题的。
        猜你喜欢
        • 2010-10-04
        • 1970-01-01
        • 1970-01-01
        • 2013-12-06
        • 2010-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-25
        相关资源
        最近更新 更多