2016-02-26 2 views
1

Я использую интерфейсы и черты для структурирования более сложных компонентов в CakePHP 3.x. Можно ли ставить Классы компонентов в отдельный вложенную как:CakePHP 3.x Компоненты в подпапках

-Controller ---Component ----Comp1 -----Comp11Component.php -----Comp12Component.php -----Comp13Component.php -----Comp1Interface.php ----Comp2 -----Comp21Component.php -----Comp22Component.php -----Comp2Interface.php ...

Официальный документ ничего не говорит об этом моих тестах ничего не удастся. Существует ли потенциальный лучший способ структурирования сложных компонентов в CakePHP 3.x?

+1

Почему вы хотите, чтобы сделать это. Если у вас больше компонентов, используйте плагины для группировки их вместе с IMO. – mark

+0

@mark Спасибо, четыре вашего ответа! Обратите внимание, что каждый 'Com1xComponent.php' реализует интерфейс' Comp1Interface'. В папке 'Comp2' это одно и то же. Я думаю, что в «Плагинах» у меня такая же проблема с использованием такой папки-структуры. – Niklas

ответ

1

Отложив в сторону возможность использования такой структуры, вы можете легко использовать опцию className при загрузке компонента, если он автозагружаемый, вы можете загрузить любой класс из любого места, где захотите.

Таким образом, учитывая соответствующее пространство имен для компонентов, как App\Controller\Component\Comp1 и App\Controller\Component\Comp2, вы можете загрузить компонент, как это:

$this->loadComponent('Comp1', [ 
    'className' => '\App\Controller\Component\Comp1\Comp11Component' 
]); 

Смотрите также Cookbook > Controllers > Components > Aliasing Components

+0

К сожалению, похоже, что вы не можете ввести путь к атрибуту 'classname'-Attribute, но только имя класса. CakePHP не может найти компонент, если вы введете полное пространство имен. – Niklas

+0

@Niklas Я протестировал его, и он отлично работает, если ваш класс не найден, вы либо указали неправильный FQN, либо не автозагружаетесь из-за какой-либо другой ошибки. – ndm

+0

Спасибо! Я боролся с этой проблемой в течение нескольких дней. Я просто забыл добавить суффикс 'Component' к имени класса. – Niklas

Смежные вопросы