2015-10-07 4 views
0

Я хочу создать поведение 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, 
    ... 

ответ

1

Это злоупотребление функции beforeMarshall. То, что вы должны делать, это использовать метод сущностного мутатора, чтобы установить свойство так, как вы хотите, до его сохранения.

Создав такой способ, как protected function _setName(), в вашем PhotoEntity вы можете изменить имя до того, как объект будет сохранен.

You can find out more about Entity Mutators in the book.

+0

Изменение данных запроса перед созданием объектов Если вам нужно изменить данные запроса до его преобразования в сущности, вы можете использовать событие Model.beforeMarshal. Это событие позволяет вам манипулировать данными запроса непосредственно перед созданием сущностей: http://book.cakephp.org/3.0/en/orm/saving-data.html#before-marshal – Salines

+1

Маршаллинг - это преобразование данных запроса в сущности, вы хотите изменить данные сущности. Возможно, я не объяснил, но вам не нужно менять данные до создания сущностей. Вы можете сделать это внутри объекта. –

+0

Благодарим вас за ответ, по моей вине, я включил метод exitSave и прекратил хранить несколько данных. У меня есть привычка бросать умирать или выходить после функции отладки. Я не знал, что модель и поведение неоднократно использовались при хранении нескольких данных. – Salines