Компонент CakePHP 3 в ячейке

#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, над которой я работаю. Ваша корзина должна быть «глупым» хранилищем данных, данные можно сделать доступными, установив для них всегда режим просмотра. Любая модификация данных корзины должна происходить в модели. Итак, все, что должен сделать ваш компонент, это установить уже рассчитанную корзину для вашего представления. Нужно еще многое объяснить, но это неподходящее место для этого.