Я разрабатываю приложение, в котором все объекты (статьи, поставщики, клиенты, контакты и т. д.) имеют специальный объект, называемый, ну... Объект (каждая строка каждой таблицы имеет столбец 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;
}
}
У меня есть три важных сущности...
Затем у меня есть другой вид объектов (я назвал их вторичным порядком), живые контакты, адреса, телефоны, электронные письма, города, страны и т. д.
Каждый объект каждой сущности (основной и вторичной) должен иметь свойство object_id, ссылающееся на объект Object(), это будет полезно, например, для журнала аудита. Итак, я планирую создать компонент под названием IdentificationComponent с этим содержимым...
public function create_and_object()
{
bla bla bla... Object->add($type_of_object);
return $generated_object_id;
}
Наконец, я хочу реализовать свой компонент в AppController (с конкретным исключением для ObjectController). Я надеюсь, что каждая сущность создает новый объект объекта при их создании.
С уважением,
🤔 А знаете ли вы, что...
С помощью CakePHP можно создавать приложения с авторизацией и управлением пользователями.
Что ж, наконец, я создал компонент (в 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 за ваше мнение и помощь.
Хорошего дня.