2010-06-04 55 views
0

好的,这让我疯狂!Zend没有自动加载模型

我有一个目录结构如下:

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[] = 

应用程序似乎工作,如果我浏览到本地主机,它正确地去索引控制器。但是,由于某种原因,它拒绝加载任何模型。

致命错误:类'Model_Cachmapper'找不到.............................../application/modules /第26行的default/controllers/IndexController.php

想法?

感谢

+0

尝试命名您的类Default_Model_Cachmapper,看看是否有帮助 – Alistair 2010-06-04 15:17:33

+0

您是否正在初始化引导程序的_initAutoload()方法中的自动加载器? – Mark 2010-06-04 16:24:26

+0

@Alistair - 我试过这个,它给出了相同的结果 @Mark - 我认为这可能是问题所在。我还没有声明_initAutoload()方法,但我的印象是你不需要......? – Guy 2010-06-04 17:39:55

回答

2

这是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" 

,并在应用/ 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; 
} 
} 
+0

谢谢,这似乎有它的工作,我认为这是与自动装载机未被初始化有关。 在附注中,在.ini文件中,我必须删除resources.frontcontroller.defaultmodule =“default”,因为它产生了一个错误,指出没有指定控制器目录... – Guy 2010-06-05 16:15:09

3

我是新手用户ZF,所以这未必是“正确的”,但我不得不使用DB模式这种方式没有问题。 我的目录结构是这样的:

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

在我的应用程序/公/ 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'); 
... 

我的应用程序的命名空间是应用程序(如果你分不清楚) 。 我的数据库模型看起来像这样(位于应用程序/模型/ 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'; 
... 
} 

此外,应用程序/ 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" 
+0

对于那里的任何ZF专家:如果这是不正确的,或者不应该在index.php中,我会有兴趣知道如何去做'正确'。 – ashurexm 2010-06-04 19:18:16

+0

addResourceType行是我的关键。谢谢。 – xenon 2012-05-07 18:42:32

+0

为我工作过!非常感谢! – Djomla 2012-10-12 18:28:19

1

添加您的车型目录到您的的includepaths

我:

includePaths.models = APPLICATION_PATH "/models" 

我硝酸钾w,你的模型位于你的模块下,但应该可以做某种事情。也许在引导代替的application.ini

ATT:罗布

罗布嗨,

嗯,我很困惑。因为我真的买了你的书'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 
+0

您肯定不需要使用Zend加载器包含路径中的模型目录。 – 2010-06-05 08:01:57

+0

@Rob:请看看我对你评论的回复。 – Phliplip 2010-06-05 08:19:48

1

我想补充一个引导类的模块,否则模块加载器不知道它。

class Default_Bootstrap extens Zend_Application_Module_Bootstrap 
{ 
} 

而在应用/默认存储/ bootstrap.php中

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