Как использовать beforeSave в CakePHP 3? $event, $entity и $options должны быть всегда заполнены?

Я внутри "PostsTable.php" . Я пытаюсь получить данные формы для обработки файлов изображений.

В CakePHP 2 я использовал:

public function beforeSave($options = array())
{
if(!empty($this->data['Post']['picture']['name'])...

Кто-то может объяснить это в Cake 3:

beforeSave
Cake\ORM\Table::beforeSave(Event $event, Entity $entity, ArrayObject $options)

?

ADDED

Я пробую этот фрагмент кода, чтобы узнать, могу ли я сохранить это поле в базе данных так же, как тест, но кажется, что beforeSave игнорируется:

public function beforeSave($options)
{ 
if(!empty($entity->pic1['name'])) 
{ 
$entity->pic1 = 'jus a test';
}

Спасибо

Ответ 1

Начните с определения функции.

Cake\ORM\Table::beforeSave(Event $event, EntityInterface $entity, ArrayObject $options)

Поскольку CakePHP вызывает функцию автоматически, она вызывается именно так, поэтому создайте свою функцию идентично определению функции:

// In PostsTable.php
public function beforeSave($event, $entity, $options) {

}

Если вы не уверены, какие данные отправляются, используйте функцию CakePHP debug():

    debug($event); debug($entity); debug($options);

Как только вы найдете свои данные в $entity, используйте их, чтобы сделать то, что вы хотите сделать со своими данными:

    if (!empty($entity->picture['name'])) { ...

Ответ 2

Вот пример, который я использовал:

use Cake\Event\Event;
public function beforeSave(Event $event)
{
    $entity = $event->getData('entity');
    if(!empty($entity->picture['name']){
       // your action here
    }
}

Ответ 3

Позвольте мне прочитать руководство для вас:

Событие Model.beforeSave запускается перед сохранением каждого объекта. Остановка этого события прервет операцию сохранения. Когда событие остановлено, результат события будет возвращен.

также:

Model.beforeSave: будет запущен непосредственно перед вычислением списка сохраняемых полей. В качестве аргументов он получает как объект, так и параметры. Массив параметров передается как ArrayObject, поэтому любые изменения в нем будут отражаться в каждом слушателе и запоминаться в конце события, чтобы он мог использоваться для остальной операции сохранения. Возврат false в любом из слушателей отменяет процесс сохранения. Если событие прекращено с использованием API событий, возвращается свойство результата объекта события. Это может быть полезно, когда ваша собственная стратегия сохранения реализована внутри слушателя.

Чтобы сделать то, что вы делали раньше, в Cake2 вы можете просто изменить $entity, поскольку сущности заменили свойство Model::$data.

if(!empty($entity->picture['name'])

Если вы не знаете, как работают события читать о них. Также необходимо прочитать руководство по переносу. В нем перечислены все, что изменилось.