В моем приложении CakePHP 1.2.5 у меня есть модель Profile
, которая принадлежит модели User
. Модель пользователя имеет поле username
, а при выполнении find()
в модели профиля я хочу всегда автоматически получать значение User.username
. Я полагаю, что имеет смысл модифицировать метод модели beforeFind()
модели профиля, чтобы автоматически содержать нужное поле.Изменение допустимых полей, требуемых для обратного вызова beforeFind?
Вот что я пытался сделать:
public function beforeFind($queryData) {
// determine if the username data was already requested to be included in the return data via 'User.username' or 'User' => array('username').
$hasUserData = isset($queryData['contain']) && in_array("User.{$this->User->displayField}", $queryData['contain']);
$hasUserData |= isset($queryData['contain']['User']) && in_array($this->User->displayField, $queryData['contain']['User']);
// request the the username data be included if it hasn't already been requested by the calling method
if (!$hasUserData) {
$queryData['contain']['User'][] = $this->User->displayField;
}
return $queryData;
}
Я могу видеть, что значение $queryData['contain']
правильно обновляется, но данные имени пользователя не будет получен. Я просмотрел основной код CakePHP для метода find()
, и я обнаружил, что обратный вызов beforeFind()
вызывается после всех обратных вызовов Behaviors, что означает, что Containable уже сделал то, что ему нужно было сделать со значением $queryData['contain']
, прежде чем я смог его изменить ,
Как я могу обойти это без взлома ядра?
Спасибо! Я тоже задумывался над этим, задаваясь вопросом, была ли модификация beforeFind() «слишком поздней». Действительно, это было так. – Wayne