如何在 Zend Framework 1 中正确调用 controller/action?

How to properly call controller/action in Zend Framework 1?

我在 Zend Framework 1 应用程序中有以下目录结构:

application/
├── controllers/
│   └── admin/
│     └── TaxRateController.php
│   └── MainInitController.php

我正在尝试访问 taxrate,它应该是 indexAction(),但是我做错了,因为我得到了 Zend_Controller_Action_Exception。到目前为止,这是我尝试过的所有 URL 组合:

http://localhos/admin/tax-rate/index
http://localhos/admin/tax-rate
http://localhos/admin/taxrate
http://localhos/admin/taxrate/index

并且它们都产生相同的错误:

[message:protected] => Action "taxRate" does not exist and was not trapped in __call()

这是class(es)的内容:

class TaxRateController extends MainInitController
{
    public function indexAction()
    {
        echo 'I am here'; die();
    }
}

class MainInitController extends Zend_Controller_Action {
    ....
}

我在这里缺少什么?我应该如何调用 controller/action?

更新 1:

我试图将目录移到 controllers 之外,但结果是一样的:

application/
│   └── admin/
│     └── TaxRateController.php
├── controllers/
│   └── MainInitController.php

在这种情况下我打电话给 http://localhost/admin/taxrate

如果 'admin' 是一个模块,您应该使用这样的目录结构:

application/
├── modules
│   └── admin
|       └── controllers
│           └── TaxRateController.php

还要确保您的 application/configs/application.ini 符合它:

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

编辑

请确保您的文件 public/index.php 结尾如下:

$application = new Zend_Application(
     APPLICATION_ENV,
     APPLICATION_PATH . '/configs/application.ini'
);
$application->bootstrap()
        ->run();

有了基本的结构,要做到这一点需要时间和精力,但可以做到

application/
├── controllers
│   └── admin
│       └── TaxRateController.php

您需要为 bootstrap 子目录下的每个控制器创建路由:

public function _initAdminRoute()
    $router = Zend_Controller_Front::getInstance()->getRouter();

    // structure
    $router->addRoute(
            'unique_route_name',
            new Zend_Controller_Router_Route('/admin/controllerRoute/:action/*', 
                ['controller' => 'subdirName_controllerRoute']
            )
    );

    // Like this
    $router->addRoute(
            'admin_taxrate_route',
            new Zend_Controller_Router_Route('/admin/tax-rate/:action/*', ['controller' => 'admin_tax-rate'])
    );
}

在此之后,您需要使用子目录名称重命名您的控制器 类,以便 zend 找到它们。但不要更改控制器文件名。

class TaxRateController => class Admin_TaxRateController

现在你可以使用你的控制器了,但是你的视图可能需要一些修复,因为现在 zend 找不到你的视图目录。您需要将所有管理视图移动到管理子目录,否则它会抛出类似于此的错误。

Fatal error: Uncaught exception 'Zend_View_Exception' with message 'script 'admin/tax-rate/action.phtml' not found in path (application/views/scripts/)' in

希望这对您有所帮助,但我仍然会推荐使用模块结构。