Я хочу создать поведение CakePHP, которое будет обрабатывать данные, прежде чем они будут сохранены в db.CakePHP 3: Как поведение обрабатывает несколько данных?
Например, у меня есть сообщения добавить форму как:
// Post title
echo $this->Form->input('title',['value'=>'aaa']);
// Post has many Photos (names)
echo $this->Form->input('photos.0.name',['value'=>'zzz']);
echo $this->Form->input('photos.1.name',['value'=>'hhh']);
echo $this->Form->input('photos.2.name',['value'=>'fff']);
PostsController:
public function add()
{
$post = $this->Posts->newEntity();
if ($this->request->is('post')) {
$post = $this->Posts->patchEntity($post, $this->request->data);
if ($this->Posts->save($post)) {
$this->Flash->success(__('The post has been saved.'));
return $this->redirect(['action' => 'index']);
} else {
$this->Flash->error(__('The post could not be saved. Please, try again.'));
}
}
$this->set(compact('post'));
$this->set('_serialize', ['post']);
}
Данные из формы правильно хранится в базе данных.
Далее, я испекаю новое поведение (например, MyBehavoir) и прикрепляю его к PhotosTable. Я хочу получить все три поля «имя», обработать их, например. конвертировать через метод ucfirst и отправить его обратно для хранения в базе данных.
public function beforeMarshal(Event $event, ArrayObject $data, ArrayObject $options)
{
$data['name'] = ucfirst($data['name']);
debug($data);
}
// debug return three outputs for every field
object(ArrayObject) {
name => 'Zzz' // Hhh, Fff
}
Но сохраняется только первый результат (Zzz).
Что мне делать, чтобы сохранить все поля после обработки в Поведении?
Кроме того,
public function beforeSave(Event $event, Entity $entity)
{
debug($entity);
return true;
}
отладки только данные из первых полей
object(App\Model\Entity\Photo) {
'name' => 'Zzz',
'post_id' => (int) 486,
...
Изменение данных запроса перед созданием объектов Если вам нужно изменить данные запроса до его преобразования в сущности, вы можете использовать событие Model.beforeMarshal. Это событие позволяет вам манипулировать данными запроса непосредственно перед созданием сущностей: http://book.cakephp.org/3.0/en/orm/saving-data.html#before-marshal – Salines
Маршаллинг - это преобразование данных запроса в сущности, вы хотите изменить данные сущности. Возможно, я не объяснил, но вам не нужно менять данные до создания сущностей. Вы можете сделать это внутри объекта. –
Благодарим вас за ответ, по моей вине, я включил метод exitSave и прекратил хранить несколько данных. У меня есть привычка бросать умирать или выходить после функции отладки. Я не знал, что модель и поведение неоднократно использовались при хранении нескольких данных. – Salines