【问题标题】:How to load controller of a module in the class?如何在类中加载模块的控制器?
【发布时间】:2012-08-30 22:47:04
【问题描述】:

我尝试了很多不同的方法来解决这个问题,我在网上找到了但它们都没有奏效,所以请有人帮助我。

我收到这个错误

致命错误:在第 13 行的 pathToProject/modules/admin/controllers/LoginController.php 中找不到类“Admin_Form_Login”

我的项目是

应用

--- 模块

--------管理员

--------控制器

--------表格

--------型号

--------观看次数

------默认

--------控制器

--------表格

--------型号

--------观看次数

------关于我们

--------控制器

--------表格

--------型号

--------观看次数 ETC 等等

我的控制器

class Admin_LoginController extends Zend_Controller_Action
{

  public function init()
  {
     /* Initialize action controller here */
  }

  public function indexAction()
  {
      $form = new Admin_Form_Login();
      $this->view->form = $form;
      // action body
  }
}

我的表格

class Admin_Form_Login extends Zend_Form
{

public function init()
{
    /* Form Elements & Other Definitions Here ... */

    $this->setAction("/admin/index/login")->setMethod("post");

    $username = new Zend_Form_Element_Text('username');
    $username->setLabel('Username')
    ->setOptions(array('size' => '30'));


    $password = new Zend_Form_Element_Password('password');
    $password->setLabel('Password')
    ->setOptions(array('size' => '30'));


    $submit = new Zend_Form_Element_Submit('submit');
    $submit->setLabel('Log in')
    ->setOptions(array('class' => 'submit'));

    $this->addElement($username)
    ->addElement($password)
    ->addElement($submit);


}


}

我的 Bootstrap.php

class Admin_Bootstrap extends Zend_Application_Module_Bootstrap
{
    protected function _initAutoload() {
        $autoloader = new Zend_Application_Module_Autoloader(array(
        'namespace' => 'Admin_',
        'basePath' => APPLICATION_PATH."/modules/admin",
    ));
    return $autoloader;
    }
}

这是我的 App ini 可能里面有什么

[bootstrap]

Autoloadernamespaces[] = "Admin_"
Autoloadernamespaces[] = "Default_"
Autoloadernamespaces[] = "Aboutus_"

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.frontController.defaultModule = "default"
resources.modules[] = ""

resources.view.encoding = "UTF-8"
resources.view.basePath = APPLICATION_PATH "/views/"

bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"

[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.frontController.params.prefixDefaultModule = "1"
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"

admin.resources.layout.layout = layout
admin.resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"
default.resources.layout.layout = default
default.resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1

我的看法

$this->form

感谢您的帮助。


我在生产部分中添加了以下内容,我的 application.ini 并开始工作不知道为什么。

Autoloadernamespaces[] = "Admin_"
Autoloadernamespaces[] = "Default_"
Autoloadernamespaces[] = "Aboutme_"

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.frontController.defaultModule = "default"
resources.modules[] = ""

resources.view.encoding = "UTF-8"
resources.view.basePath = APPLICATION_PATH "/views/"

bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"

【问题讨论】:

  • 你的Admin_Bootstrap,大概存储在application/modules/admin/Bootstrap.php,扩展了Zend_Application_Module_Bootstrap,它注册了自己的资源自动加载器。您可能可以删除您的自定义 Admin_Bootstrap::_initAutoload() 方法。
  • 你的表单课在application/modules/admin/forms/Login.php吗?
  • 是的,它位于 application/modules/admin/forms/Login.php

标签: zend-framework zend-form


【解决方案1】:

听 Dave 的话,清空你的 Admin_Bootstrap 类。如果您需要任何 _init 方法,请将它们放在您的应用程序级引导程序中。无论如何,所有引导类都会在每个请求上运行,因此将任何 _init 方法放在应用程序级别,以防止无意覆盖。

确保您的模块引导程序位于 application/modules/admin/Bootstrap.php每个模块都需要一个引导程序),这样可以确保资源自动加载器正常工作。表单是自动加载器中的predefined resource,因此不需要 _init 方法。

确保您的 application.ini 包含激活模块所需的最低要求:

resources.modules = ""
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"

最后别忘了在你的意见中echo

$this->form

应该是:

echo $this->form

祝你好运!

【讨论】:

    【解决方案2】:

    这对我有用:

    在应用程序/configs/application.ini 中

    resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
    resources.modules[] = ""
    

    在应用程序/Bootstrap.php 中

    class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
    {
        /**
         * @return Zend_Application_Module_Autoloader
         */
        protected function _initAutoload()
        {
            $autoloader = new Zend_Application_Module_Autoloader(array('namespace' => '', 'basePath' => APPLICATION_PATH));
            return $autoloader;
        }
    }
    

    在模块/admin/Bootstrap.php 中

    class Admin_Bootstrap extends Zend_Application_Module_Bootstrap
    {
    
    }
    

    登录表单必须位于 modules/admin/forms 中,控制器位于 modules/admin/controllers 中。

    我希望结帐有帮助!

    【讨论】:

    • 我的 bootstrip 在 application/modules/admin/Bootstrap.php 我已经尝试过使用和不使用 _initAutoload() 方法我的表单在 modules/admin/forms Mu application.ini 有资源。 modules[] = "" resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
    【解决方案3】:

    试试这个:

    protected function _initAutoload() {
        $autoloader = new Zend_Application_Module_Autoloader(array(
            'namespace' => '',
            'basePath' => APPLICATION_PATH,
        ));
        return $autoloader;
    }
    

    没有命名空间(仅当您有命名空间时,即 Application_)。

    关于配置文件:

    [production]
    phpSettings.display_startup_errors = 0
    phpSettings.display_errors = 0
    
    includePaths.library = APPLICATION_PATH "/../library"
    bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
    
    resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
    resources.modules[] =
    
    resources.layout.layout = "layout"
    default.resources.layout.layoutPath = "/views/layout"
    admin.resources.layout.layoutPath = "/views/layout" 
    
    [staging : production]
    
    
    [testing : production]
    
    [development : production]
    phpSettings.display_startup_errors = 1
    phpSettings.display_errors = 1
    

    【讨论】:

    • 反对者可能不了解 ZF 命名空间。无论哪种方式,如果这还不够,它仍然是正确的方式。它不是模块命名空间“admin”,而是应用程序命名空间,如果你有一个(即 Application_)。
    • 试试我刚刚发布的配置@David
    • @David 很高兴它成功了。最好通过投票来删除这个反对票 =P
    猜你喜欢
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 2013-07-02
    • 1970-01-01
    相关资源
    最近更新 更多