我需要在Zend Framework 2.0 中为自定义类使用自动加载功能。我的自定义库位于/vendor/Garvey/library/Garvey
。我在/vendor/Garvey/library/Garvey/Db/Table/AbstractTable.php
中有一个简单的扩展AbstractTable类:
<?php
namespace Garvey\Db\Table;
use Zend\Db\Table\AbstractTable;
abstract class AbstractTable extends AbstractTable
{
public function getItemById($id)
{
}
}
在index.php中,我有以下代码:
require_once 'vendor/ZendFramework/library/Zend/Loader/AutoloaderFactory.php';
Zend\Loader\AutoloaderFactory::factory(array('Zend\Loader\StandardAutoloader' => array(
'prefixes' => array(
'Garvey' => 'vendor/Garvey/library/Garvey',
)
)));
但我有以下错误。我错过了什么?
Fatal error: Class 'Garvey\Db\Table\AbstractTable' not found
提前谢谢。
答案 0 :(得分:11)
如果您将'前缀'键更改为'名称空间'并指定如下所示的路径,原始index.php也会起作用:
Zend\Loader\AutoloaderFactory::factory(array('Zend\Loader\StandardAutoloader' => array(
'namespaces' => array(
'Garvey' => dirname(__DIR__) . '/vendor/Garvey',
)
)));
答案 1 :(得分:11)
或者你可以在Module.php中使用defime方法
public function getAutoloaderConfig()
{
$return = array(
'Zend\Loader\ClassMapAutoloader' => array(
__DIR__ . '/autoload_classmap.php'
),
'Zend\Loader\StandardAutoloader' => array(
'namespaces' => array(
__NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
'Garvey' => __DIR__ . '/../../vendor/Garvey/library/Garvey',
)
)
);
}
但我不推荐它。由于ZF2的目的都是以自动加载速度为中心,因此最好的方法是使用class_map样式来加载类。它最终会更快,但需要额外的工作。您可以在class_map文件中注册每个类。
您可以在库的根目录中创建class_map.php并放在那里
<?php
return array(
'Garvey\Db\Table\AbstractTable' => __DIR__ . '/Garvey/Db/Table/AbstractTable.php',
);
并添加尽可能多的类。在getAutoloaderConfig()中,您可以添加类映射
public function getAutoloaderConfig()
{
$return = array(
'Zend\Loader\ClassMapAutoloader' => array(
__DIR__ . '/autoload_classmap.php',
__DIR__ . '/../../vendor/Garvey/library/Garvey/class_map.php',
),
'Zend\Loader\StandardAutoloader' => array(
'namespaces' => array(
__NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
)
)
);
}
答案 2 :(得分:3)
Matthew Weier O'Phinney在this video中解释说现在有3种自动加载方法:
文档中提到class-map generator实用程序,负责为您编写/vendor/vendor_name/library/autoload_classmap.php
。
您找到的解决方案类似于Matthew在视频中提到的每个命名空间/前缀自动加载的解决方案。遵循ZendSkeletonApplication中的代码结构,该代码将放在/init_autoloader.php
文件中,而不是/public/index.php
文件中。
答案 3 :(得分:2)
我找到了答案。把它放在你的index.php中:
require_once 'vendor/ZendFramework/library/Zend/Loader/StandardAutoloader.php';
$loader = new Zend\Loader\StandardAutoloader();
$loader->registerNamespace('Garvey', realpath('vendor/Garvey/library/Garvey'));
$loader->register();
答案 4 :(得分:2)
快速浏览this post。
现在,下一步是在我们的自定义库中添加一些代码。
首先打开文件./vendor/Garvey/autoload_classmap.php
return array(
'Garvey\Module' => __DIR__ . '/Module.php',
'Garvey\Db\Table' => __DIR__ . '/library/Garvey/Db/Table/AbstractTable.php',
)
接下来是./vendor/Garvey/Module.php
namespace Garvey;
use Zend\ModuleManager\Feature\AutoloaderProviderInterface;
class Module implements AutoloaderProviderInterface
{
public function getAutoloaderConfig()
{
return array(
'Zend\Loader\ClassMapAutoloader' => array(
__DIR__ . '/autoload_classmap.php',
),
'Zend\Loader\StandardAutoloader' => array(
'namespaces' => array(
__NAMESPACE__ => __DIR__ . '/library/' . __NAMESPACE__,
),
),
);
}
}
现在在你的库中创建一个文件夹中的文件:
./vendor/Kdecom/library/Kdecom/Db/Table/AbstractTable.php
我们需要做的最后一件事是将此库添加到您的application.config.php
文件中。
所以你的application.config.php
文件会看起来像这样...
return array(
'modules' => array(
'Application',
'Garvey'
),
'module_listener_options' => array(
'config_glob_paths' => array(
'config/autoload/{,*.}{global,local}.php',
),
'module_paths' => array(
'./module',
'./vendor',
),
),
);