Ситуация
В этом веб-приложении, которое я создаю, есть последовательность «начальной загрузки», которая определяет (через константы) и инициирует расширенный контроллер. В настоящее время контроллер отслеживает активы (файлы сценариев, 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();
В итоге вы получите массив aryScriptFiles, содержащий 4 записи, и это прекрасно работает.
Проблема
Прежде чем читать дальше, обратите внимание, что я не хочу использовать магические методы, глобальные переменные или передавать ссылку на имя контроллера в функцию Helper.
Я хотел бы попытаться удалить строку в вспомогательном файле, которая вытягивает текущее имя контроллера в переменную из константы.
$objController = CONTROLLER; <-- I want this to shoo shoo
Если бы я просто попытался использовать следующее, файл сценария, который добавляется с помощью помощника, является частью исходного массива контроллеров, а не контроллера Home.
Controller::Add_Script('dominoes'); <-- Will not be part of the Home_Controller array
Вопрос
Пожалуйста, могу ли я узнать мнение сообщества SO о том, что, по вашему мнению, наилучшим подходом к решению этой проблемы будет учет того, что имя контроллера будет другим? Моими основными целями в этом упражнении являются:
- Держите файл просмотра ОЧЕНЬ простым
- Сохраняйте вспомогательные файлы простыми.
- Избегайте необходимости добавлять какой-либо код в Home_Controller сверх необходимого.
В настоящее время я думаю, что одним из лучших вариантов было бы размещение «активов» в отдельном классе, просто хочу знать, возможно ли это.
Спасибо за чтение.