我有一个类,它位于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中的自动加载。因此,请不要提出使我的验证器冗余使用的解决方案。
答案 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 /)
现在你要将验证器添加到你的库我会像
那样文库
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());
}
}