Отношения в Zend_DB_Table_Abstract - PullRequest
1 голос
/ 10 июня 2009

Я использую код фреймворка по умолчанию, который был создан с помощью инструмента Zend Framework Application. Я добавил магию автозагрузчика, чтобы любые классы с именем Default_<*>_<*> автоматически загружались из правильного каталога, в данном случае Default_Model_TableName.

применение / модель / ProjectCategories.php:

<?php

class Default_Model_ProjectCategories extends Zend_Db_Table_Abstract {
    protected $_name = 'categories';
    protected $_dependentTables = array('Projects');
}

применение / модель / Projects.php:

<?php

class Default_Model_Projects extends Zend_Db_Table_Abstract {
    protected $_name = 'projects';

    protected $_referenceMap    = array(
        'Category' => array(
            'columns'           => 'cid',
            'refTableClass'     => 'ProjectCategories',
            'refColumns'        => 'id',
            'onUpdate'          => self::CASCADE,
            'onDelete'          => self::CASCADE,
        )
    );

}

Я пытаюсь сделать следующее:

<?php
$categories = new Default_Model_ProjectCategories();
$category = $categories->find('1');
$category->findProjects();

В этот момент я получаю сообщение об ошибке, что он не может найти Projects.php, или что файл может не содержать класс с именем Projects.

В этот момент я помещаю Projects.php в путь включения, который был задан фреймворком (/../library/), и файл найден, но теперь я теряю всю структуру каталогов и именую, потому что у меня переименовать Default_Model_Projects в Projects. Я могу заставить все работать, если я помещаю файл обратно в исходное местоположение и меняю

protected $_dependentTables = array('Projects');

до

protected $_dependentTables = array('Default_Model_Projects');

но это также означает, что мой ->findProjects() теперь становится ->findDefault_Model_Projects().

Есть ли способ сказать ему, что, когда я ищу findProjects(), он должен создать экземпляр Default_Model_Projects? Это что-то, чего не хватает в Zend Framework, или я пытаюсь запихнуть что-то таким образом, чтобы оно не принадлежало? Как вы решили эту проблему?

Ответы [ 3 ]

1 голос
/ 11 июня 2009

Эта проблема может быть введена новым автозагрузчиком и способом, которым он предпочитает загружать классы с пространством имен (например, те, которые имеют префикс, как у вас).

В моих приложениях я просто называю модели как «Проекты» и добавляю отдельную папку моделей в путь включения для этого приложения. Это одно из решений - к сожалению, я не знаю, как можно правильно загрузить модели пространства имен, но я бы посоветовал взглянуть на Zend_Loader более подробно и, возможно, на pluginLoaders.

0 голосов
/ 14 июня 2009

Раньше я мог делать что-то вроде

$resourceLoader = new Zend_Loader_Autoloader_Resource(array(
    'basePath'  => APPLICATION_PATH,
    'namespace' => 'App',
));
$resourceLoader->addResourceType('model', 'models/', '');

чтобы сжать мои классы моделей до App_TableName, но похоже, что он сейчас не работает ...

0 голосов
/ 14 июня 2009

Изменение

protected $_dependentTables = array('Projects');

до

protected $_dependentTables = array('Default_Model_Projects');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...