我有一个类,它位于 zend 项目中我的库文件夹的子目录中。所以假设我的应用程序在 /Library/WebServer/Foo/ 中,那么 php 的包含路径是:
<?php echo get_include_path(); ?>
/Library/WebServer/Foo/application/../library:/Library/WebServer/Foo/library:/usr/share/zend-framework/library/
所以现在我想创建这个类,忽略随机逻辑,我应该能够通过说“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] [error] [client 127.0.0.1] PHP Fatal error: Class 'MyValidator_Usernameunique' not found in /Library/WebServer/Foo/library/Form/Register.php on line 14, referer :
http://foo/
忽略行号,因为我稍微简化了代码。
当然,这很自然,因为 /Library/WebServer/Foo/library/MyValidator/ 不在我的 php include_path 中,而且我没有“要求”或“包含”或“要求一次”文件。然而,据我了解,zend 框架应该通过将 _ 替换为 / 并搜索 include_path 来自动加载文件。这似乎适用于注册表单,但对于验证器失败。现在,这是为什么呢?这几乎是相同的场景。此外,当我尝试直接在具有相同错误消息的控制器类中创建 MyValidator_Usernameunique 时,它也会失败。
任何关于为什么会发生这种情况的想法或指示都非常感谢。此外,请注意,我并不是要修复这个错误,而是要更好地理解 zend 中的自动加载。所以请不要提出使用我的验证器多余的解决方案。