Обновление: см. мой раздел EDIT ниже, где я объясняю, что обнаружил после тестирования
Я работаю над веб-сайтом с CakePHP 2.5.1 и наблюдаю очень странное поведение: одна из двух имеющихся у меня моделей похоже отказывается использовать другая конфигурация базы данных (отличная от стандартной), если я не помещаю ее в папку Model Cake по умолчанию (если я помещаю ее туда, все работает отлично).
Обе модели находятся в одной папке, которая не является папкой моделей по умолчанию (это потому, что они доступны другим веб-сайтам, а у меня есть центральное место, куда я помещаю все общие модели).
Чтобы Cake нашел эти модели, я использую следующую строку кода в файле bootstrap.php: App::build(array('Model' => array(dirname(ROOT) . DS . '_shared/Cake_v2/Model')));
Две модели, которые у меня есть, называются Campanya и EjercicioMultChoice.
Вроде все настроено правильно:
- Если я напечатаю
App::objects('Model')
, я увижу обе перечисленные там модели, что означает, что Cake находит их во внешней папке. - Если я напечатаю
get_class_vars('DATABASE_CONFIG')
, я увижу обе конфигурации базы данных: по умолчанию, используемую Campanya, и пользовательскую (называемую BD_Contenidos ), используемый EjercicioMultChoice. - Обе модели включены в файл AppController.php с массивом переменных
$uses
.
Я могу без проблем вызывать модель Campanya в контроллере. Однако при вызове модели EjercicioMultChoice я получаю следующую ошибку:
MISSING DATABASE TABLE
Error: Table ejercicio_mult_choices for model EjercicioMultChoice was not found in datasource default.
Вот как выглядит файл модели EjercicioMultChoice:
class EjercicioMultChoice extends AppModel {
public $name = 'EjercicioMultChoice';
public $primaryKey = 'id';
public $useTable = 'ejercicios_multiple_choice';
public $useDbConfig = 'BD_Contenidos';
}
Как вы можете видеть, эта модель указывает на использование определенной конфигурации базы данных, о которой знает Cake, но в показанной выше ошибке говорится, что она не может найти таблицу в источнике данных default. Этого не может быть, потому что его там нет, конечно, он находится в другой таблице в другой базе данных (которая, кстати, находится на том же сервере, что и база данных по умолчанию, и я без проблем использую ее в других проектах).
Как я упоминал выше, если я перемещу тот же самый файл модели EjercicioMultChoice.php в папку Cake по умолчанию app/Model/, тогда у меня не будет никаких проблем.
Так что я немного потерялся здесь, я не знаю, что еще я могу проверить, чтобы найти, в чем проблема.
ИЗМЕНИТЬ
Итак, я считаю, что обнаружил, в чем проблема, и нашел обходной путь, но я все же хотел бы знать, почему это происходит и как я могу заставить ее работать должным образом.
Если я добавлю эти 2 строки кода (обе) перед вызовом модели, все будет работать нормально:
$this->EjercicioMultChoice->setDataSource('BD_Contenidos');
$this->EjercicioMultChoice->setSource('ejercicios_multiple_choice');
Это явно означает, что даже если Cake находит файл модели EjercicioMultChoice.php, в котором указаны имена базы данных и таблицы, он игнорирует эти 2 переменные ($useTable и $ использоватьDbConfig). Единственный способ заставить это работать — вручную установить эти 2 переменные с помощью методов, которые я написал выше.
Почему это происходит? Этого не происходит, если файл модели находится в папке по умолчанию...