Что на самом деле означает эта ошибка?

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

Cannot use modParams with indexes that do not exist.

Может ли кто-нибудь более подробно объяснить, что означает эта ошибка, к чему она относится (например, к поведению, компоненту, контроллеру и т. Д.), Наиболее распространенным причинам и как ее исправить?

Чтобы начать расследование, вы можете найти ошибку здесь. https://github.com/cakephp/cakephp/blob/master/lib/Cake/Utility/ObjectCollection.php

2 ответа

Условия Layman
CakePHP говорят применить массив параметров к коллекции объектов, чтобы каждый конкретный объект мог изменять параметры, отправляемые следующему объекту. Существует ошибка в том, как CakePHP сказано сделать это.

Глубоко
Как правило, это вытекает из механизма публикации событий CakePHP. Где-то в вашем коде есть экземпляр ObjectCollection, который запускается с определенными параметрами. То есть метод вызывается для каждого объекта в этой коллекции.

Каждый метод обратного вызова имеет параметры. Первоначально параметры передаются в trigger(), В обычных случаях (где modParams ложно), каждый обратный вызов получает одинаковые параметры. Но когда modParams не является строго ложным, результат каждого обратного вызова перезаписывает параметр, указанный modParams,

Таким образом, если в коллекции два объекта, modParams равен 1, а params[1] изначально равен 'a', тогда обратному вызову дается первый объект с params[1] == a. Этот обратный вызов возвращает "b", поэтому при вызове следующего обратного вызова второй объект получает params[1] == b.

Исключение возникает, когда modParams данное значение не существует в первоначально заданном params, Например, если modParams это 2 и params является array (0 => 'a', 1 => 'b') Вы получите это исключение.

В твоем случае
В частности, отладка должна выполняться на низком уровне, потому что это метод универсального класса. Обратный след из исключения должен привести вас к trigger() позвонить на конкретный конкретный класс. Этот вызов дается не ложным modParams и params это не имеет данного modParams, Это может быть ошибка кода в конкретном классе, расширяющая ObjectCollection или это может быть просто общее сообщение, полученное из метода, которому не даны ожидаемые аргументы.

Вы пробовали читать документацию?

/*
 * - `modParams` Allows each object the callback gets called on to modify the parameters to the next object.
 *    Setting modParams to an integer value will allow you to modify the parameter with that index.
 *    Any non-null value will modify the parameter index indicated.
 *    Defaults to false.
 */

Вы не вставляли никакой код, поэтому я думаю, что ваш третий аргумент метода содержит что-то не так.

Другие вопросы по тегам