Обратный вызов модели CakePHP, особенно перед удалением - PullRequest
2 голосов
/ 16 июля 2010

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

Я знаю, что я определяю функцию до удаления в классе модели, но как получить доступ к данным в текущей модели или удаляемых зависимых моделях?

function beforeDelete() {

}

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

Edit: После добавления этого в родительскую модель, кажется, всегда возвращается false.

function beforeDelete() {
    if ($this->DependentModel->find('count', array('conditions' => array('DependentModel.parent_id' => $this->id))) == 1){  
        return true;
    } else{
        return false;
    }
}

Должно быть очевидно, что я пытаюсь сделать здесь. Если в таблице есть одна запись зависимой модели, верните true и продолжите удаление. Я убедился, что на самом деле есть одна запись таблицы, которая зависит от удаляемого объекта. Когда я выполняю действие удаления, оно всегда возвращает false. Что здесь происходит?

1 Ответ

9 голосов
/ 16 июля 2010

При использовании обратных вызовов вы можете обратиться к API для класса, который вы расширяете, чтобы проверить параметры, которые он принимает. Ваша реализация должна принимать, как минимум, те же параметры, что и методы, которые вы переопределяете.

Например, Model::beforeDelete реализовано так:

/**
 * Called before every deletion operation.
 *
 * @param boolean $cascade If true records that depend on this record will also be deleted
 * @return boolean True if the operation should continue, false if it should abort
 * @link http://book.cakephp.org/2.0/en/models/callback-methods.html#beforedelete
 */
    public function beforeDelete($cascade = true) {
        return true;
    }

А также, ModelBehavior::beforeDelete реализован следующим образом (т. Е. При создании поведения):

/**
 * Before delete is called before any delete occurs on the attached model, but after the model's
 * beforeDelete is called.  Returning false from a beforeDelete will abort the delete.
 *
 * @param Model $model Model using this behavior
 * @param boolean $cascade If true records that depend on this record will also be deleted
 * @return mixed False if the operation should abort. Any other result will continue.
 */
    public function beforeDelete(Model $model, $cascade = true) {
        return true;
    }

Далее, полезно знать, что при сохранении в модель и передаче данных контроллера (т. Е. $this->data в контроллере) эти данные устанавливаются для модели (т. Е. $this->data в модели). [Это происходит в Model::save(), в настоящее время в строке 1225 .]

В первом примере вы можете получить доступ к модели, используя $this, а во втором примере вы можете получить доступ к модели, используя $model (так как $this будет поведение в этом контексте). Таким образом, чтобы получить данные, вы хотите использовать $this->data или $model->data. Вы также можете получить доступ к связанным моделям этой модели, используя цепочку (т. Е. $this->RelatedModel или $model->RelatedModel).

Как указано в комментариях к докблоку, $cascade должен сообщить вам, происходит ли это каскадное удаление (true по умолчанию) в случае, если ваш код должен предпринять другие действия, если это так или нет. ; и ваша реализация метода должна вернуть false, если вы хотите прервать операцию сохранения (в противном случае верните true, когда вы закончите).

Существует Медиа-плагин для CakePHP, который реализует эту точную функциональность , которую можно использовать в качестве ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...