在(基于zend)include_path中找不到php类

时间:2012-07-11 12:30:17

标签: php zend-framework zend-autoloader

我有一个类,它位于zend-project中我的library-folder的子目录中。所以假设我的应用程序在/ Library / WebServer / Foo /中,那么php的include路径是:

<?php echo get_include_path(); ?>
  

/库/ Web服务器/富/应用/../库:/库/ Web服务器/富/库:在/ usr /共享/ Zend的框架/库/

所以现在我想创建这个类,忽略随机逻辑,我应该能够通过说“new MyValidator_Usernameunique()”或类似的东西来达到它:

  

/Library/WebServer/Foo/library/MyValidator/Usernameunique.php

class MyValidator_Usernameunique extends Zend_Validate_Abstract
{
     const USERNAME_ALREADY_EXISTS = 'usernameAlreadyUsed';
     const DATABASE_FAILED = 'userDatabaseFailure';

     protected $_messageTemplates = array(
         self::USERNAME_ALREADY_EXISTS => "De gebruikersnaam '%value%' is al in gebruik, gebruik een andere."
         self::DATABASE_FAILED => "Er ging iets mis bij het verbinden met de database."
     );

    public function isValid($value)
    {
        $magic = rand(0,3)
        if($magic==0) {
            $this->_error(self::USERNAME_ALREADY_EXISTS);
            return false;
        }
        if($magic==1) {
            $this->_error(self::DATABASE_FAILED);
            return false;
        }
        return true;
    }
}

所以我做到了这一点:

  

/Library/WebServer/Foo/library/Form/Register.php

class Form_Register extends Form_FooForm 
{
    public function __construct() 
    {
        parent::__construct();
        $username = $this->createText('username', 'Gebruikersnaam')->setRequired(true);
        $username->addValidator(new MyValidator_Usernameunique());
    }
}

给出了: -

  

[Wed Jul 11​​ 14:07:41 2012] [错误] [client 127.0.0.1] PHP致命错误:在/Library/WebServer/Foo/library/Form/Register.php上找不到类'MyValidator_Usernameunique' 14,引用者:http://foo/

忽略行号,因为我稍微简化了代码。

当然,这很自然,因为/ Library / WebServer / Foo / library / MyValidator /不在我的php include_path中,我没有'require'或'include'或'require_once'这个文件。然而,据我所知,zend框架应该通过用/替换_并搜索include_path来自动加载文件。这似乎适用于寄存器形式,但验证器失败。现在,这是为什么?这几乎是相同的情况。此外,当我尝试使用相同的错误消息直接在控制器类中创建MyValidator_Usernameunique时,它也会失败。

对于为什么会发生这种情况的任何想法或指示都非常感激。此外,请注意,我不是要尝试修复此错误,我想更好地了解zend中的自动加载。因此,请不要提出使我的验证器冗余使用的解决方案。

2 个答案:

答案 0 :(得分:3)

出于这个答案的目的,我将忽略你路径中“Foo”之上的所有内容,因为它是无关紧要的。

为了让你的验证器自动加载,你需要做几件事。

首先,您需要创建一个文件夹`Foo / library / My',然后将以下行添加到您的application.ini文件中: -

autoloadernamespaces[] = "My_"

这将告诉Zend Framework在哪里查找你的课程。

接下来创建文件夹'Foo / library / My / Validator'然后在该文件夹中创建'Usernameunique.php',它应该如下所示: -

class My_Validator_Usernameunique extends  Zend_Validate_Abstract
{
    //All your class stuff goes here.
}

然后当你这样做: -

$username->addValidator(new My_Validator_Usernameunique());

它将自动加载。

有关详细信息,请参阅manual

自动加载适用于您的表单的原因是“Forms”目录会自动添加到框架的自动加载器包含路径中,因此它知道在哪里找到它。

自动加载的工作原理正如您所猜测的那样,将'_'替换为'/',然后从生成的路径中加载类。但是,默认路径以外的路径需要在application.ini中“注册”,如我的示例所示。看看Zend / Loader / Autoloader.php中的代码,了解实际发生的情况。

答案 1 :(得分:1)

查看你的代码,我可能会错过它,但它并不是真正的“标准”zend布局

我希望跟随 在您的webapp路径(/ Library / WebServer / Foo /)

  • 应用
    • CONFIGS
    • 控制器
  • 文库
  • 公共

现在你要将验证器添加到你的库我会像

那样

文库

  • MyApp的
    • 验证
      • Validator.php

Inside Validator.php

class MyApp_Validate_Validator extends Zend_Validate_Abstract
{
    //Do stuff here
}

既然我们在库中有这个额外的部分,我们需要告诉zend我们有一个额外的命名空间,里面有我们自己的代码

所以在application.ini中你可以像这样配置它

autoloaderNamespaces.0 = MyApp_

现在应用程序(zend)应该知道在哪里查找验证器

所以您现在可以执行以下操作

创建一个表单(最好将其放在application / forms /中,但这取决于你当然)

class Form_Register extends Zend_Form {

    public function __construct() {
        parent::__construct();

        $username = $this->createText('username', 'Gebruikersnaam')
        ->setRequired(true)
        ->addValidator(new MyApp_Validate_Validator());

    }
}