Я использую CakePHP для создания приложения, которое, помимо прочего, генерирует десятки графиков.Чтобы упростить загрузку этих графиков, я следую заводскому шаблону с использованием компонентов.Существует один ChartComponent, который отвечает за загрузку компонентов для генерации отдельных графиков, и эти отдельные графики, в свою очередь, могут использовать компоненты для подготовки своих данных.
Образец GraphComponent:
class ChartComponent extends Object {
var $name = 'Chart';
function getChart($category, $chart, $node) {
// Build the name we expect to find the component as.
$component_name = Inflector::camelize("{$category}_{$chart}_graph");
$component_class = "{$component_name}Component";
// Import the component, making sure it actually exists.
if (! App::import('Component', $component_name)) {
return false;
}
$chart = new $component_class();
return $chart->getData($node);
}
}
Образецкомпонент для отдельного графика:
class StoreRevenueGraphComponent extends Object {
var $name = 'StoreRevenueGraph';
var $components = array('Calculations');
function getData($node) {
var_dump(isset($this->Calculations));
}
}
Однако, когда я запускаю этот код, компонент Calcluations не загружается успешно, и isset ($ this-> Calculations) возвращает false.
Я предполагаю,это потому, что я где-то пропускаю какой-то код инициализации.Кто-нибудь знает, какие еще шаги я должен предпринять, чтобы использовать компоненты внутри другого компонента через App :: import, или это то, что я пытаюсь сделать невозможным внутри торта?
Решение
Как отметил Эндрю, при создании экземпляров компонентов вручную массив var $ components никогда не обрабатывается, в результате чего они никогда не загружаются.Решение состоит в том, чтобы вручную сделать это так:
function startup(&$controller) {
foreach ($this->components as $component_name) {
App::import('Component', $component_name);
$component_class = "{$component_name}Component";
$this->$component_name = new $component_class();
$this->$component_name->startup($this);
}
}