WedX - журнал о программировании и компьютерных науках

вызов afterSaveCommit в вызове link()

Когда я связываю сущности, принадлежащие многим, через соединительную таблицу с помощью функции appendToMany->link(), событие afterSaveCommit в соединительной таблице не срабатывает. Кажется, что функция link() всегда вызывает save() внутри транзакции, и я не могу найти, где она будет вызывать afterSaveCommit, поскольку от объекта нет вызова save() верхнего уровня.

Это недосмотр или так задумано?

05.06.2017

Ответы:


1

После нескольких шагов по коду и остановившись на нем, я думаю, что вопрос о том, что это «должно быть», имеет аргументы с обеих сторон.

Я публикую свое решение в надежде, что оно поможет кому-то еще.

Я храню денормализованную копию логических записей в репозитории ElasticSearch для анализа, и цель состоит в том, чтобы автоматически синхронизировать ES при изменении любого из участвующих реляционных объектов. Все соответствующие объекты подключили триггер afterSave для синхронизации ES. Базовая логическая запись имеет множество отношений ownToMany со списками статических данных, поэтому множество таблиц соединений и вызовов link(). Запись ES обновлялась после каждого, что занимало слишком много времени.

Я прибегнул к событию afterSave, которое всегда запускается, а затем создал поведение, размещенное во всех соответствующих таблицах, со следующим кодом, который зависит от поведения параметра _primary, установленного в значение true, при сохранении объекта верхнего уровня. Действительно, это одна из подсказок, которую Cake использует, чтобы определить, когда запускать событие afterSaveCommit.

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

class ElasticSyncBehavior extends Behavior
{   
    private static $_suspend_flag = false;

public function suspend_elastic_sync() {
    self::$_suspend_flag = true;
}

public function resume_elastic_sync() {
    self::$_suspend_flag = false;
}

public function afterSave($event, $entity, $options) {
    if($options["_primary"]!=true || self::$_suspend_flag==true) {
        return $entity;
    }

    // do synchronization here

    return $entity;
}
public function afterDelete(Event $event, EntityInterface $entity, ArrayObject $options) {
    if($options["_primary"]!=true || self::$_suspend_flag==true) {
        return $entity;
    }

    // do synchronization here

    return $entity;
}
}

Это приводит к такому же поведению, когда синхронизация выполняется только после сохранения верхнего объекта, который в случае link() является таблицей соединения.

Я также добавил туда событие удаления, как для обработки вызовов unlink(), так и для каскадных удалений.

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

25.09.2017
Новые материалы

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


Для любых предложений по сайту: [email protected]