【问题标题】:Zend not autoloading modelsZend 不自动加载模型
【发布时间】:2010-06-04 14:25:32
【问题描述】:

好吧,这让我发疯了!

我的目录结构如下:

application
- modules
-- default
--- controllers
--- models
---- DbTable
---- Cachmapper.php
--- views

我的配置文件是这样的

[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.modules[] =

应用程序似乎可以工作,如果我导航到 localhost,它会正确地转到索引控制器。但是,由于某种原因,它拒绝加载任何模型。

致命错误:在 ....................../application/modules/default 中找不到类“Model_Cachmapper” /controllers/IndexController.php 第 26 行

想法?

谢谢

【问题讨论】:

  • 尝试命名你的类 Default_Model_Cachmapper 看看是否有帮助
  • 您确定要在引导程序的 _initAutoload() 方法中初始化自动加载器吗?
  • @Alistair - 我已经尝试过了,它给出了相同的结果@Mark - 我认为这可能是问题所在。我没有声明 _initAutoload() 方法,但我的印象是你不需要...?

标签: php zend-framework autoloader


【解决方案1】:

这是一个适用于 ZF 1.10.x 的工作版本(至少是其中一个),也可能更早。

index.php

<?php
// Define path to application directory

defined('APPLICATION_PATH') || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
// Define application environment
defined('APPLICATION_ENV') || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));
// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    get_include_path(),
)));
require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance();
/** Zend_Application */
require_once 'Zend/Application.php';
// Create application, bootstrap, and run
$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);
$application->bootstrap()
            ->run();

application.ini - 相关部分

autoloadernamespaces[] = Zend_
includePaths.library = APPLICATION_PATH "/../library"

; Where will Zend_Application find the Bootstrap file
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"

; Where are all the modules
resources.frontcontroller.moduledirectory = APPLICATION_PATH"/modules"
resources.modules[] = ""
; And which is the default module
resources.frontcontroller.defaultmodule = "default"

在 application/Bootstrap.php 中

<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {

/**
 * Autoloader for the "public" module
 * 
 * @return Zend_Application_Module_Autoloader
 */
public function _initPublicAutoload()
{
    $moduleLoader = new Zend_Application_Module_Autoloader(
                            array(
                                'namespace' => '',
                                'basePath' => APPLICATION_PATH . '/modules/default'
                            )
                        );

    return $moduleLoader;
}
}

【讨论】:

  • 谢谢,这似乎让它工作了,我认为这与自动加载器未初始化有关。附带说明一下,在 .ini 文件中,我必须删除 resources.frontcontroller.defaultmodule = "default" 因为它产生了一个错误,指出没有指定控制器目录...
【解决方案2】:

我是一名 ZF 新手,所以这可能不“正确”,但我以这种方式使用 DB 模型没有任何问题。 我的目录结构如下:

/
--/application
----/configs
----/controllers
----/forms
----/layouts
----/models
------/DbTable

在我的 application/public/index.php 我有以下代码:

...
require_once 'Zend/Loader/Autoloader.php';
$loader = Zend_Loader_Autoloader::getInstance();
$loader->registerNamespace('Application_');

require_once 'Zend/Loader/Autoloader/Resource.php';
$resources = new Zend_Loader_Autoloader_Resource(array(
    'namespace' => 'Application',
    'basePath' => APPLICATION_PATH
));

$resources->addResourceType('form','forms','Form');
$resources->addResourceType('model','models','Model');
$resources->addResourceType('dbtable','models/DbTable','Model_DbTable');
...

我的应用程序命名空间是 Application(如果你不知道的话)。 我的数据库模型如下所示(位于 application/models/DbTable:

class Application_Model_DbTable_User extends Zend_Db_Table_Abstract
{

    protected $_name = 'User';
    protected $_primary = 'username';
}

class Application_Model_DbTable_WinLossTieScore extends Zend_Db_Table_Abstract
{

    protected $_name = 'WinLossTieScore';
    protected $_primary = 'id';
...
}

另外,application/configs/application.ini 的相关部分:

appnamespace = "Application"

includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"

resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"

【讨论】:

  • 致所有 ZF 专家:如果这是不正确的,或者不应该在 index.php 中,我会很想知道如何“正确”地做到这一点。
  • addResourceType 行对我来说是关键。谢谢。
【解决方案3】:

我会为模块添加一个引导类,否则模块加载器不知道它。

class Default_Bootstrap extens Zend_Application_Module_Bootstrap
{
}

并存储在applications/default/Bootstrap.php中

http://akrabat.com/modules 有更多信息。

【讨论】:

    【解决方案4】:

    将你的模型目录添加到你的 includePaths

    我有:

    includePaths.models = APPLICATION_PATH "/models"
    

    我知道,您的模型位于您的模块之下,但应该可以以某种方式完成。也许在引导程序而不是 application.ini 中

    收件人:Rob

    嗨,罗伯,

    嗯,我很困惑。因为我实际上买了你的书“Zend Framework In Action”。

    在源代码中“Places”应用的引导程序中,您有以下内容。

        set_include_path(get_include_path()
            . PATH_SEPARATOR . ROOT_DIR . '/library/'
            . PATH_SEPARATOR . ROOT_DIR . '/application/models/'
            . PATH_SEPARATOR . ROOT_DIR . '/application/forms/'
        );
    
        include 'Zend/Loader.php';
        Zend_Loader::registerAutoload();
    

    我知道源代码是为较旧的 ZF 版本编写的。我正在开发的当前应用程序基于 Zend_Application,如果我从 includePaths 中删除模型文件夹,加载程序将找不到我的模型。

    Warning: include_once(Users.php) [function.include-once]: failed to open stream: No such file or directory in C:\Programmer\wamp\include\Zend\Loader.php on line 146
    

    【讨论】:

    • 您当然不需要 Zend 加载器的包含路径中的模型目录。
    • @Rob:请看看我对您的评论的回复。
    猜你喜欢
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多