gpt4 book ai didi

php - 前端 Controller 将参数链接到应用程序逻辑的最佳方式?

转载 作者:可可西里 更新时间:2023-10-31 22:50:22 26 4
gpt4 key购买 nike

我正在构建一个使用前端 Controller 设计模式的应用程序,只有一个页面 index.php 所有用户请求都通过该页面作为参数传递(与常规设计中的不同页面/ Controller 相比)。

如何将这些参数连接到应用程序逻辑?

例如我有两个不同的操作:

index.php?action=userLogin&username=admin&password=qwerty //process user login

index.php?action=displayUsersTable //show registered users

目前我有一个array,其中包含系统接受的所有操作(以及预期的参数),我比较action 参数从URL 到key 该数组,然后检查此操作所需的参数。

//1 = optional, 2=required
$systemActions = [
"userLogin" => [
"login" => 2,
"password" => 2
],
"displayUsersTable" => []
];

显然,随着系统的增长,这将成为一个怪物阵列。

是否有更好的方法将发送到前端 Controller 的参数绑定(bind)到系统操作?

最佳答案

由于代码是“固定的”(即不是从数据库驱动的),因此无需泵入数组(以及它所需的所有处理/内存开销。所以是的,它可以改进。

但是根据项目的增长程度,有很多选择。

最简单

最简单的是简单的“if”语句或开关。我将从这里开始,以保​​持简单。

更复杂

您说其他项目有不同的页面/ Controller - 但这是有原因的。当您要求改进时,特别是如果您期望项目增长到您正在寻求优化的程度,那么您真的应该考虑这些原因(并拆分成文件)。

另一方面,您可以将所有调用拆分为文件/类并自动加载文件/类。

这样您就可以只执行您需要的代码(较小的文件大小),非常模块化并且易于协作。如果您添加一个新 Action ,您不需要修改索引或数组 - 您只需修改您正在处理的 Action 文件。

示例(从我目前使用此方法处理的项目中大大简化):

1) 创建一个“baseAction”基类,所有操作都将从该基类扩展。您可以添加常用功能,例如清理/预处理参数、日志记录、验证 header 等。

abstract class baseAction {
protected $aExpectedParams = [];
protected $aParams = [];
protected $validParams = true;

function __construct() {
foreach (self::$aExpectedParams as $name=>$aParam) {
if (isset($_GET[$name]))
if ($aParam['type'] == 'string') {
self::$aParams[$name] = $_GET[$name];
} elseif ($aParam['type'] == 'int') {
self::$aParams[$name] = (int)$_GET[$name];
}
} elseif ($aParam['required']) {
self::$validParams = false;
}
}
}

// This is the called function
abstract function execute();

}

2) 通过扩展基本 Action 创建“ Action ”类。将它们保存在单独的文件中(这样其他人就可以在不干扰的情况下协作完成该项目)。

// put in 'actions/userLogin.php
class userLogin extends baseAction {
protected $aExpectedParams = [
'login' => ['type' => 'string', 'required' => true]
'password' => ['type' => 'string', 'required' => true] // NOTE: you should never actually pass password unencrypted through "get" as they'll get stuck in user logs!
];

public function execute() {
// Do Whatever
}
}

.

// put in 'actions/displayUsersTable.php
class displayUsersTable extends baseAction {
public function execute() {
// Do Whatever
}
}

3) 创建一个自动加载器来拉入那些单独的文件。

function myAutoloader($className) {
if (file_exists(__DIR__ . '/actions/' . $className . '.php')) {
require_once(__DIR__ . '/actions/' . $className . '.php');
}
}
spl_autoload_register ('myAutoloader');

4) 然后你的 index.php 就干净了

$action = $_GET['action'] ?? '';
if (strlen($action) > 0 && class_exists($action) && method_exists($action, 'execute')) {
$oAction = new $action();
$oAction->execute();
} else {
// Oopsie
}

(关于最后一个片段的注释:“class_exists”触发自动加载器。“method_exists”用于检查是否有人请求了一个常见的 php 类,例如“object”;如果你为了安全起见,你应该命名空间或添加额外的验证。这只是一个例子!)

关于php - 前端 Controller 将参数链接到应用程序逻辑的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41082748/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com