#cakephp #cakephp-3.0
#cakephp #cakephp-3.0
Вопрос:
Я создал свой собственный компонент CakePHP 3. Я включаю его в контроллер, используя $this->loadComponent()
, и он работает нормально; однако мне также нужно включить его в ячейку, в которой нет loadComponent()
метода.
Как я могу включить компонент в ячейку?
Ответ №1:
Не сказал бы, что это лучшая практика, но вот быстрый обходной путь, если вам нужно получить доступ к компоненту из ячейки.
В вашем AppController
use CakeCoreConfigure;
class PageController extends AppController
{
public function initialize()
{
Configure::write('controller', $this);
}
}
В вашей ячейке
<?php
namespace AppViewCell;
use CakeCoreConfigure;
class ExampleCell extends Cell
{
public function getController(){
return Configure::read('controller');
}
public function display()
{
$data = $this->getController()->ComponentName->method();
$this->set('data', $data);
}
}
Комментарии:
1. Никогда не знал, что вы можете записывать полные классы в конфигурацию, интересно.
Ответ №2:
Вы не используете там компонент. Потому что ячейка — это ячейка, а не контроллер. Ячейка даже не знает о контроллере, проверьте источник. http://api.cakephp.org/3.3/source-class-Cake.View.Cell.html
Я думаю, что ваша архитектура спроектирована неправильно, если вам нужно / хотите каким-либо образом использовать компонент внутри ячейки. Поскольку вы «забыли» поделиться кодом, невозможно дать какие-либо дополнительные советы. Реорганизуйте архитектуру вашего приложения для всего, что вы пытаетесь там сделать.
Комментарии:
1. У меня есть ячейка с корзиной покупок; У меня также есть контроллер каталога товаров. В обоих этих местах необходимо выполнить некоторые вычисления цен на продукты (например, проверить, зарегистрирован ли пользователь, и выбрать одну из ценовых групп, управлять скидками и т. Д.), Поэтому, на мой взгляд, компонент здесь подойдет. Какой альтернативный подход вы бы предложили? Должен ли я перенести это вычисление в модель продукта?
2. ну, @burzum, в руководстве говорится, что ячейки — это мини-контроллер. Поэтому бывают случаи, когда наличие компонента может быть полезным.
3. @arilia Ячейка фактически не допускает калибровки
loadModel()
— вам нужно обойти это с помощью TableRegistry.4. @Rytis api.cakephp.org/3.3/class-Cake.View.Cell.html#_loadModel и book.cakephp.org/3.0/en/views/cells.html#implementing-the-cell
5. @Rytis github.com/burzum/cakephp-cart-plugin У меня также есть версия Cake3, над которой я работаю. Ваша корзина должна быть «глупым» хранилищем данных, данные можно сделать доступными, установив для них всегда режим просмотра. Любая модификация данных корзины должна происходить в модели. Итак, все, что должен сделать ваш компонент, это установить уже рассчитанную корзину для вашего представления. Нужно еще многое объяснить, но это неподходящее место для этого.