情况
在我正在构建的这个网络应用程序中,有一个“引导”序列,它定义(通过常量)并启动一个扩展控制器。目前,控制器通过一系列静态变量跟踪将在后期渲染阶段部署的资产(脚本文件、css 等)。我将在这里简化代码,将其视为伪 PHP。
/* CONTROLLER CLASS */
class Controller {
protected static $aryScriptFiles = array();
public function __construct() {
/* Behaviour */
/* Some logic that identifies/calls Home_Controller method Index */
}
public static function Add_Script($strFileName) {
static::$aryScriptFiles[] = $strFileName;
}
}
/* HOME_CONTROLLER CLASS */
class Home_Controller extends Controller {
protected static $aryScriptFiles = array('default', 'carousel', 'etc');
protected function Index() {
/* Behaviour */
/* Load the view as an include. It is "part" of the User_Controller */
}
}
/* EXAMPLE_HELPER */
class Example_Helper {
public static function Test() {
/* THE NEXT LINE IS IMPORTANT FOR THE QUESTION */
$objController = CONTROLLER;
$objController::Add_Script('dominoes');
}
}
/* INDEX VIEW FILE */
<h1>Welcome!</h1>
<?php
echo get_class(); <-- Would echo 'User_Controller'
Example_Helper::Test();
/* Simplification of render process */
foreach(static::$aryScriptFiles as $strFileName) {
/* Render the HTML script tag */
}
?>
流动
好的,鉴于上述情况,有一个引导程序最终会调用 User_Controller。例如,我只是简单地定义了它们,让您知道脚本将遵循什么状态。
$strControllerName = 'User_Controller';
define('CONTROLLER', $strControllerName);
$objController = new $strControllerName();
你最终得到的是具有 4 个条目的aryScriptFiles数组,这很好用。
问题
在继续阅读之前,请注意我不想使用魔法方法、全局变量或必须将控制器名称的引用传递给 Helper 函数。
我想尝试删除帮助文件中将当前控制器名称从常量中提取到变量的行。
$objController = CONTROLLER; <-- I want this to shoo shoo
如果我只是尝试使用以下内容,则通过 Helper 添加的脚本文件是原始Controller 数组的一部分,而不是 Home 控制器。
Controller::Add_Script('dominoes'); <-- Will not be part of the Home_Controller array
问题
请我从 SO 社区获得一些意见,您认为解决此问题的最佳方法是考虑到控制器名称会有所不同吗?我在这个练习中的主要目标是:
- 保持视图文件非常简单
- 保持 Helper 文件简单。
- 避免向 Home_Controller 添加任何不必要的代码
我目前认为最好的选择之一是将“资产”托管在一个单独的班级中,只是想知道这是否可能。
谢谢阅读。