所以基本上我正在努力为我的某些项目优化我的代码。
目前我的网页有add_company.php
,view_company.php
,edit_company.php
。
我想做的是从1个PHP文件company.php
提供所有内容。
所以说company.php?action=view
,company.php?action=edit
等。用大量的if else语句来做这个是唯一的方法吗?这会让我的company.php
像巨型巨人一样。
或者甚至更好,我怎样才能使用index.php为所有页面提供服务?
那么最好的方法是什么呢?我不是php guru,我对MVC或任何其他模式没有太多经验。
感谢。
答案 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..