ТОРТ. Как вызвать метод контроллера в контроллере?

Я разрабатываю приложение, в котором все объекты (статьи, поставщики, клиенты, контакты и т. д.) имеют специальный объект, называемый, ну... Объект (каждая строка каждой таблицы имеет столбец object_id). Я так подумал, потому что существует множество общих моделей поведения и отношений, которые можно вызывать для всех сущностей одинаковым образом (например, контрольный журнал, object_id=32665, user_id=312, detail=update_field, бла-бла).

Итак, я хочу создать компонент с методом (возможно, create_new_object), который будет вызывать метод добавления из контроллера объектов (я изменил этот метод, чтобы создать новый объект без участия человека, мой код ниже).

Это хорошая идея? Как я могу вызвать метод контроллера из компонента?

Версия

Я забыл поставить свой код, мои извинения.

Это мой объектный контроллер

<?php
namespace App\Controller;

use App\Controller\AppController;

class ObjectsController extends AppController
{
   public function add($type = null)
    {       
        if ($type)
        {
            $object = $this->Objects->newEntity();

            $object = $this->Objects->patchEntity($object, $this->request->getData());

            $object->type = $type;

            if ($this->Objects->save($object)) {
                $this->Flash->success(__('The object has been saved.'));

                $resultJ = json_encode(array('result' => 'success',
                                             'object_id' => $object->id));
            }
            else
            {
                $resultJ = json_encode(array('result' => 'error',
                                             'message' => 'The object could not be save. Please, try again.'));
            }
        }
        else
        {
            $resultJ = json_encode(array('result' => 'error',
                                         'message' => 'An object type is necessary. Please, try again.o'));
        }

        $this->response->type('json');

        $this->response->body($resultJ);

        return $this->response;
    }
}

У меня есть три важных сущности...

  1. Статьи.
  2. Клиенты.
  3. Поставщики.

Затем у меня есть другой вид объектов (я назвал их вторичным порядком), живые контакты, адреса, телефоны, электронные письма, города, страны и т. д.

Каждый объект каждой сущности (основной и вторичной) должен иметь свойство object_id, ссылающееся на объект Object(), это будет полезно, например, для журнала аудита. Итак, я планирую создать компонент под названием IdentificationComponent с этим содержимым...

public function create_and_object()
{
    bla bla bla... Object->add($type_of_object);

    return $generated_object_id;
}

Наконец, я хочу реализовать свой компонент в AppController (с конкретным исключением для ObjectController). Я надеюсь, что каждая сущность создает новый объект объекта при их создании.

С уважением,

🤔 А знаете ли вы, что...
С помощью CakePHP можно создавать приложения с авторизацией и управлением пользователями.


78
1

Ответ:

Решено

Что ж, наконец, я создал компонент (в CookBook указано, что это правильный способ написания повторно используемого кода для контроллеров).

С одной стороны, это код моего компонента...

<?php
    namespace App\Controller\Component;

    use Cake\Controller\Component;

    use App\Controller\ObjectsController;


    class ObjectToolsComponent extends Component
    {
        public function getNewObjectId($object_type)
        {   
            return (new ObjectsController())->add($object_type);
        }
    }
?>

С другой стороны, это вызов метода контроллера...

public function add()
{
    $article = $this->Articles->newEntity();
    if ($this->request->is('post')) {
        $article = $this->Articles->patchEntity($article, $this->request->getData());


        /* The call */
        $article->object_id = $this->ObjectTools->getNewObjectId(Inflector::underscore($this->name));

        if ($this->Articles->save($article)) {
            $this->Flash->success(__('The article has been saved.'));

            return $this->redirect(['action' => 'index']);
        }
        $this->Flash->error(__('The article could not be saved. Please, try again.'));
    }
    $objects = $this->Articles->Objects->find('list', ['limit' => 200]);
    $articleStatuses = $this->Articles->ArticleStatuses->find('list', ['limit' => 200]);
    $suppliers = $this->Articles->Suppliers->find('list', ['limit' => 200]);
    $this->set(compact('article', 'objects', 'articleStatuses', 'suppliers'));
}

Как видите, я вызвал метод getNewObjectId с именем контроллера как параметр.

Я надеюсь, что это будет полезно для кого-то в будущем.

Спасибо @GregSchmidt и @ndm за ваше мнение и помощь.

Хорошего дня.