代码之家  ›  专栏  ›  技术社区  ›  arma Mandip Darji

从一个php文件服务多个页面?

php
  •  4
  • arma Mandip Darji  · 技术社区  · 14 年前

    因此,基本上,我在为我的某个项目优化代码的需要而苦苦挣扎。 目前我有这样的页面 add_company.php , view_company.php , edit_company.php .

    我想做的是只提供一个PHP文件中的所有内容 company.php . 可以这么说 company.php?action=view , company.php?action=edit 等等,唯一的方法是用大量的if-else语句来实现这一点吗?那会使我 公司.php 就像巨型的。

    或者更好,我如何使用index.php服务所有页面?

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

    谢谢。

    5 回复  |  直到 12 年前
        1
  •  3
  •   alex    14 年前

    你可以做 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 .

        2
  •  0
  •   Randy the Dev    14 年前

    这很简单。它应该是这样的:

    //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');
        }
    
        3
  •  0
  •   ChrisM    14 年前

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

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

    (当然,如果您有许多不同的页面类型,那么可能需要使用switch语句)

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

    更好但更复杂的解决方案是面向对象的方法(带有工厂模式的抽象页面类),或者直接使用一个好的框架和模板引擎。

        4
  •  0
  •   tjk    14 年前

    您可以使用post而不是get with index.php:

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

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

        5
  •  0
  •   navinvarma    14 年前

    我总是喜欢使用switch语句来处理$\u get变量。我个人倾向于将与一个实体(在本例中是公司)相关的所有逻辑放在一个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..