CakePhp 2.x - модель плагина не загружается

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

Имя файла модели:
GamificationBadgeUnlockActionProgression.php

Содержание модели:

<?php
    App::uses('GamificationAppModel', 'Gamification.Model');

    class GamificationBadgeUnlockActionProgression extends GamificationAppModel {

    function __construct() {
        parent::__construct();
        echo 'oleej';
        exit;
    }

    public $belongsTo = array(
        'GamificationBadgeProgression' => array(
            'className' => 'GamificationBadgeProgression',
            'foreignKey' => 'gamification_badge_progression_id'
        ),
        'GamificationBadgeUnlockAction' => array(
            'className' => 'GamificationBadgeUnlockAction',
            'foreignKey' => 'gamification_badge_unlock_action_id'
        )
    );

    public function addMissingProgression($missingProgression)
    {
        /*$this->saveMany($missingProgression, array(
            'fieldlist' => array('gamification_badge_progression_id', 'gamification_badge_unlock_action_id')
        ));*/
    }
}

В контроллере плагина у меня есть:

public $uses = array('Gamification.GamificationBadge',
    'Gamification.GamificationBadgeProgression', 
    'Gamification.GamificationBadgeUnlockAction',
    'Gamification.GamificationBadgeUnlockActionProgression', 
    'Gamification.GamificationBadgeUnlockType');

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

Когда я вызываю функцию из модели с массивом в качестве параметра:

    $this->GamificationBadgeUnlockActionProgression->addMissingProgression($missingProgression);

Затем я получаю сообщение об ошибке

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'addMissingProgression' at line 1

Потому что модель не загружена.
Однако CakePhp создает волшебную модель с тем же именем, что приводит к указанной выше ошибке, потому что модель волшебным образом существует, но функция, конечно же, не существует, как и отношения.

Что мне здесь не хватает?


person DijkeMark    schedule 24.04.2014    source источник
comment
вы можете проверить загружена модель или нет ClassRegistry::isKeySet('Name of your model');   -  person Fazal Rasel    schedule 24.04.2014
comment
Это потому, что cakephp создает его волшебную версию.   -  person DijkeMark    schedule 24.04.2014


Ответы (1)


Такая ошибка возникает, когда модель загружена неправильно, она пытается выполнить метод как функцию SQL, которой явно не существует. В верхней части вашего контроллера проверьте, есть ли у него:

App::uses('GamificationBadgeUnlockActionProgression', 'Gamification.Model');

Этого в сочетании с Gamification.GamificationBadgeUnlockActionProgression в массиве $uses, который у вас уже есть, должно быть достаточно для загрузки. Если это все еще терпит неудачу, в крайнем случае вы можете вручную загрузить его в свой метод, используя запасной вариант, например:

if (!is_object($this->GamificationBadgeUnlockActionProgression)) {
    ClassRegistry::init('Gamification.GamificationBadgeUnlockActionProgression');
    $this->GamificationBadgeUnlockActionProgression = new GamificationBadgeUnlockActionProgression();
}

Это вручную загрузит модель и создаст для нее экземпляр под $this->GamificationBadgeUnlockActionProgression.

Также появляется ошибка в ассоциациях в модели, она должна включать префиксы плагинов, например:

public $belongsTo = array(
    'GamificationBadgeProgression' => array(
        'className' => 'Gamification.GamificationBadgeProgression',
        'foreignKey' => 'gamification_badge_progression_id'
    ),
    'GamificationBadgeUnlockAction' => array(
        'className' => 'Gamification.GamificationBadgeUnlockAction',
        'foreignKey' => 'gamification_badge_unlock_action_id'
    )
);
person Oldskool    schedule 24.04.2014
comment
Никак, если работает. И ручная загрузка тоже не работает, потому что CakePHP создает волшебную модель с таким же именем. Я могу использовать все функции по умолчанию, такие как $this->GamificationBadgeUnlockActionProgression->find('all'), но, конечно же, я не могу создать свою - person DijkeMark; 24.04.2014
comment
Еще лучше, когда я пытаюсь загрузить его вручную, как вы говорите, что должно работать, возвращается ошибка: класс «GamificationBadgeUnlockActionProgression» не найден - person DijkeMark; 24.04.2014
comment
@DijkeMark Возможно, это связано с ошибкой, которую я только что заметил в вашей модели, это может привести к тому, что модель не загрузится должным образом, потому что ассоциации кажутся отключенными. Смотрите мой обновленный ответ, чтобы исправить это. - person Oldskool; 24.04.2014
comment
Хорошо, кажется, теперь это работает. Добавление плагина до имени класса помогло. Это все еще странно, потому что другие модели в плагине не нуждались в этом, чтобы заставить его работать. - person DijkeMark; 24.04.2014