我用MVC
代替ASP.NET
,它的分配比这更简单。我所要做的就是在项目中包含一个控制器plugin
。
我有一个类定义在session.php:
class session extends Zend_Controller_Plugin_Abstract{
//Code
}
文件结构如下
/应用程序
,/配置
,
/控制器/插件才能
,,/session.php
,
/布局,
/模型,/视图
我已经在网上爬了,没有人提供一个简单的解释如何做到这一点。我试过的:
application.ini
resources.frontController.plugins.route = "Application_Controllers_Plugins_Session"
resources.frontController.plugins.route = "Application/Controllers/Plugins/Session"
resources.frontController.plugins[] = "Controllers_Plugins_Session"
resources.frontController.plugins[] = "Controllers/Plugins/Session"
Bootstrap.php :
$front = Zend_Controller_Front::getInstance();
$front->registerPlugin(new Application_Controllers_Plugins_SessionPlugin(), 1);
我尝试了所有这些,还有更多。如果我能理解包含类的科学,我就能从那里弄清楚。
我得到的错误总是类'blah'没有找到在x行
问题是您正在声明类session
,但随后试图使用许多其他类名实例化该类。看起来您正在遵循标准的资源自动加载器文件结构,并且由于您已经声明了Application
的appnamespace,因此您的插件类应该声明为:
class Application_Plugin_Session extends Zend_Controller_Plugin_Abstract
{
...
}
(区分大小写)。它的文件名必须是Session.php
(大写S),然后它应该被正确地自动加载。
然后你只需要在前端控制器上注册插件。您可以在application.ini:
中执行此操作。resources.frontController.plugins[] = "Application_Plugin_Session"
或在bootstrap类中:
$front = Zend_Controller_Front::getInstance();
$front->registerPlugin(new Application_Plugin_Session());
天哪!我想明白了。我在这里找到了答案http://grover.open2space.com/content/autoloading-plugins-zend_application。
好的,我的bootstrap.php,(部分)看起来像这样:
protected function _initAutoload()
{
$moduleLoader = new Zend_Application_Module_Autoloader(array(
'namespace' => '',
'basePath' => APPLICATION_PATH));
return $moduleLoader;
}
protected function _initPlugins() {
$front = Zend_Controller_Front::getInstance();
$front->registerPlugin(new Plugin_YourClassNameHere());
}
如果没有_initautolload(),这绝对不能工作;接下来我有我的课。命名规范太大了
class Plugin_YourClassNameHere extends Zend_Controller_Plugin_Abstract
{
//Code
}
这个类在一个名为YourClassNameHere.php的文件中。这就是我被困住的地方。我该把文件放在哪里?事实证明,我在.....phpPEARZendApplicationModule中找到了一个autolloader .php文件。该文件不在您的项目中。这个文件已经定义了放置插件的位置。(除此之外)。所以我找到了这个:
public function initDefaultResourceTypes()
{
$basePath = $this->getBasePath();
$this->addResourceTypes(array(
........
,
'model' => array(
'namespace' => 'Model',
'path' => 'models',
),
'plugin' => array(
'namespace' => 'Plugin',
'path' => 'plugins',
),
.......
,
));
$this->setDefaultResourceType('model');
}
注意插件的命名空间是'plugin ',路径是'plugins' + S!!所以我把YourClassNameHere.php文件在应用程序/插件,现在一切都工作!