First let me start by saying I am fairly new to ZF and with this post I am
primarily looking for feedback for improvement from the Zend experts on my
solution and hopefully, if list solution is reasonable, others may have some
information, where I found it difficult to find.

My Goal:  With my ZF Application setup for modules
(module/controller/action), I wanted to:

1.  remove index from the URL (I find it a nuisance)

2.  if I requested /module/action, that the App would catch the error of
action not being a controller and check to see if it was an action in the
index controller of that module.  So I could use /event/list instead of
/event/index/list.

Here is my solution:


class App_Controller_Plugin_CustomRoutes extends
Zend_Controller_Plugin_Abstract
{
        public function preDispatch(Zend_Controller_Request_Abstract $request )
    {
        $dispatcher = Zend_Controller_Front::getInstance()->getDispatcher();
        $moduleName = $request->getModuleName();                        //e.g. 
user
        $controllerName = $request->getControllerName();        //e.g. index
        $actionName = $request->getActionName();                        //e.g. 
list
            
        // example: creates Module_IndexController class name
        // out of $moduleName and $controllerName
        $className = $dispatcher->formatControllerName($moduleName . '_' .
$controllerName);       //e.g. Module_IndexController
        $controllerFileName =
$dispatcher->formatControllerName($controllerName) . '.php';            //e.g.
IndexController.php
                
        // check if a class name was created
        if ($controllerFileName)
        {
            $validControllerFile =
Zend_Loader::isReadable($controllerFileName);
                
            if ($validControllerFile)
            {
                // this is a valid controller - exit now
                return;
            }
            else
            {
                    // Couldn't load the class (controller).
                    // lets see if this is an action in the index controller
                    $actionName = $controllerName;
                        $controllerName = 
$dispatcher->getDefaultControllerName();
                        
                        // example: takes Index and creates IndexController 
class name to
see if it exists
                        $className = 
$dispatcher->formatControllerName($moduleName . '_' .
$controllerName);
                                $controllerFileName = 
$dispatcher->formatControllerName($controllerName)
. '.php';
                                
                        if($className && $controllerFileName)
                        {
                                try
                                {
                                $methodName = 
$dispatcher->formatActionName($actionName);
                                
                                
Zend_Loader::loadFile($controllerFileName,null,true);
        
                                $class = new ReflectionClass( $className );
                                
                                if( $class->hasMethod( $methodName ) )
                                {
                                        // we only arrive here if can't find 
controller or action
                                                
$request->setControllerName($controllerName);
                                                
$request->setActionName($actionName);
                                                
                                                // this will force plugins to 
fire again
                                                $request->setDispatched( false 
);
                                }
                                else
                                {
                                    // action does not exist either, return so 
404 will be
thrown
                                    return;
                                }
        
                                }
                                catch (Zend_Exception $e)
                                {
                                        // Couldn't load the class with method. 
No need to act,
                                // just catch the exception and fall out of the
                                // if
                                }
                        }
            }
        }
    }
}

Thank You,

David

-- 
View this message in context: 
http://www.nabble.com/Looking-for-code-feedback-tp23377593p23377593.html
Sent from the Zend Framework mailing list archive at Nabble.com.

Reply via email to