Модель Cakephp игнорирует настройки базы данных

Обновление: см. мой раздел 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 переменные с помощью методов, которые я написал выше.

Почему это происходит? Этого не происходит, если файл модели находится в папке по умолчанию...


person Albert    schedule 04.10.2014    source источник


Ответы (2)


Что ж, похоже, проблема была в том, что я не поставил завершающий / в пути App::build(). Правильный должен быть App::build(array('Model' => array(dirname(ROOT) . DS . '_shared/Cake_v2/Model/')));

Что мешало мне понять это, так это то, что Cake на самом деле находил модели в этой папке, даже без завершающего /, но по какой-то причине это не позволяло ему загружать внутреннее содержимое этих файлов моделей.

Во всяком случае, теперь это работает!

person Albert    schedule 06.10.2014

Насколько я могу судить, Cake НЕ загружает предоставленный вами файл модели! Вы можете узнать это, поместив вызов exit(); в первую строку этого (общего) файла и посмотреть, учитывает ли это ваше приложение (показывая белую страницу,-)).

Если нет, то ваш файл модели не будет принят cakephp.

Другой способ проверить, загружается ли ваш файл модели, — определить пользовательскую переменную-член, такую ​​как public $myModelTestVar = 'sharedModel';, в файле и просто проверить переменную в контроллере, который использует модель (только debug($this->EjercicioMultChoice) в действии).

Если вы можете подтвердить/подтвердить, что файл загружен, я бы вызвался настроить этот сценарий и попробовать сам, что там происходит, но я совершенно уверен, что прав.

debug(dirname(ROOT) . DS . '_shared/Cake_v2/Model')

чтобы доказать, что он указывает на то, где вы ожидаете.

person hmic    schedule 07.10.2014
comment
спасибо за вашу помощь, это было что-то вроде этого (см. мой ответ, где я объясняю, что происходит) - person Albert; 07.10.2014