简体   繁体   中英

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

I have the following directory structure in a Zend Framework 1 application:

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

I am trying to access taxrate which should be indexAction() but I am doing something wrong since I am getting a Zend_Controller_Action_Exception . This is what I have tried all this URL combination so far:

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

And all of them generates the same error:

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

This is the content of the class(es):

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

class MainInitController extends Zend_Controller_Action {
    ....
}

What I am missing here? How I should be calling the controller/action ?

Update 1:

I have tried to move the directory outside controllers but the result is the same:

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

I am calling as http://localhost/admin/taxrate in this scenario.

With basic structure it will take time and effort to do that but it can be done

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

You need to create routes for every controller under sub directory in your 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'])
    );
}

After this you need to rename your controller classes with subdirectory name to let zend find them. But do not change controller file names.

class TaxRateController => class Admin_TaxRateController

Now you can use your controllers, but a little fix may be needed for your views cause right now zend can not find your view directory. You need to move all your admin views to admin subdirectory or it will throw an error something similar to this.

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

Hope this helps, but still i will recommend using module structure.

If 'admin' is a module you should use a directory structure like this:

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

Also make sure your application/configs/application.ini is according with it:

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

Edit

Be sure your file public/index.php ends like this:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM