-- Shekar C Reddy <[EMAIL PROTECTED]> wrote
(on Wednesday, 06 December 2006, 10:06 AM -0500):
> I meant it for consistency. If we have to use the basic router and later 
> switch
> to the RewriteRouter (or vice-versa) for whatever reason, all the URLs would
> have to be re-worked. We need to be able to switch to any router seamlessly
> - without any impact or repercussions. I guess since the framework is still in
> preview (expect changes!), backwards compatibility is not a big deal at this
> stage because the few existing applications based on the framework may not 
> need
> a lot of changes to sync the URLs in line with the RewriteRouter's and once
> they are re-worked, they may never need to make changes again to the URLs as
> the framework is stabilizing.

Right. However, many developers are going to have no need for the
'module' system, so it needs to be something that's configurable. Your
JIRA issue shows one possible way this can be done, and I'll take that
into consideration as I move forward on it.


> On 12/6/06, Matthew Weier O'Phinney <[EMAIL PROTECTED]> wrote:
> 
>     -- Shekar C Reddy <[EMAIL PROTECTED]> wrote
>     (on Wednesday, 06 December 2006, 09:13 AM -0500):
>     > Is there a way to get rid of the word 'module/' from the URL in basic
>     router
>     > just as the RewriteRouter:
>     >
>     >        /admin/news/view
>     > (instead of  /news/view/module/admin)
> 
>     Not if we want to maintain backwards compatability. The only way that
>     would be possible is to (1) override the basic router, or (2) add
>     additional configuration to the basic router telling it to look for a
>     module name in the first path position (which is what you've requested
>     in [ZF-617].
> 
>     I'm still working on the initial implementation for [ZF-614]; after
>     that, I'll consider [ZF-617].
> 
>     > After the code changes, you'll be able to do URLs like the following:
>     >
>     >    * RewriteRouter route of ':module/:controller/:action':
>     >        /admin/news/view
>     >        /user/news/view
>     >    * Basic router:
>     >        /news/view/module/admin
>     >        /news/view/module/user
>     >
>     >
>     > On 12/6/06, Matthew Weier O'Phinney < [EMAIL PROTECTED]> wrote:
>     >
>     >     -- Sanjay - e11 Online <[EMAIL PROTECTED]> wrote
>     >     (on Wednesday, 06 December 2006, 09:46 AM +0530):
>     >     > It will be great to have this functionality. Could you please let
>     me know
>     >     by
>     >     > when this functionality will be incorporated?
>     >
>     >     I'm working on it today; I should have it into subversion in the 
> next
>     12
>     >     hours (depends on my work schedule). I'll drop a note to the list
>     when
>     >     it's available.
>     >
>     >     > We are into product development and we require to run the 
> different
>     >     version of
>     >     > the same application on one web server.  Right now it didn't seem
>     >     possible to
>     >     > me. Is there any other way by which I can achieve this or I have 
> to
>     wait
>     >     for
>     >     > the module functionality to be incorporated?
>     >
>     >     Much of this can actually be achieved now. You can specify classes 
> in
>     >     subdirectories with the current MVC. As an example:
>     >
>     >        * Controller directory layout:
>     >          controllers/
>     >            Admin/
>     >              NewsController.php
>     >            User/
>     >              NewsController.php
>     >
>     >        * Then, to specify:
>     >          * Admin version of news controller: /admin-news/view
>     >            Calls AdminNewsController::viewAction()
>     >          * User version of news controller: /user-news/view
>     >            Calls UserNewsController::viewAction()
>     >
>     >     After the code changes, you'll be able to do URLs like the 
> following:
>     >
>     >        * RewriteRouter route of ':module/:controller/:action':
>     >            /admin/news/view
>     >            /user/news/view
>     >        * Basic router:
>     >            /news/view/module/admin
>     >            /news/view/module/user
>     >
>     >     >
>     >    
>     
> -------------------------------------------------------------------------------
>     >
>     >     > From: Shekar C Reddy [mailto: [EMAIL PROTECTED]
>     >     > Sent: Tuesday, December 05, 2006 5:13 AM
>     >     > To: Zend Framework General; [EMAIL PROTECTED]
>     >     > Cc: Subject: [fw-general] Re: Controllers in sub-directories
>     (modules) -
>     >     Some
>     >     > generic ideas for B/C
>     >     >
>     >     > I guess, we can add the setControllerMap() to all the 3 situations
>     and
>     >     > setModuleMap()/setControllerToModuleMap() to subdirectories/
>     subdomain
>     >     > situations to offer the maximum features to everyone.
>     >     >
>     >     > Shekar
>     >     >
>     >     >
>     >     >
>     >     > On 12/4/06, Shekar C Reddy < [EMAIL PROTECTED]> wrote:
>     >     >
>     >     >
>     >     >     Back-trace:
>     >     >
>     >     >     http://www.nabble.com/
>     >     Controllers-in-subdirectories-tf2746071s16154.html
>     >     >     http://www.nabble.com/
>     >     Controllers-in-subdirectories-tf2746071s16154.html
>     >     >
>     >     >     I've hacked the Front, Dispatcher and Router classes of the
>     standard
>     >     >     dispatcher/router to accomplish mapping subdomains to modules
>     but it
>     >     is too
>     >     >     messy because I had to extend 3 classes. Please sync the old
>     router
>     >     along
>     >     >     with the RewriteRouter when controllers-in-subdirectories
>     changes are
>     >     >     incorporated in order to be able to over-ride the part of the
>     code
>     >     that
>     >     >     returns the module name in a clean way in the standard router.
>     Here
>     >     are
>     >     >     some ideas that are  generic enough to not break backwards
>     >     compatibility:
>     >     >
>     >     >     If the _subdirectories variable is set to true, the first
>     parameter
>     >     in the
>     >     >     basic router would be 'module', followed by controller and
>     action
>     >     >     parameters. Or, if the set _domain variable is subtracted from
>     the
>     >     >     HTTP_HOST, the remainder would be the subdomain which - in 
> turn
>     -
>     >     would be
>     >     >     the module. Otherwise, the code would behave as it is now -
>     >     controller
>     >     >     first, action next:
>     >     >
>     >     >     if ( $request->isSubdirectories())
>     >     >     {
>     >     >        $module = $path[0];
>     >     >        $controller = $path[1];
>     >     >        //
>     >     >        if ( $module )
>     >     >           $controller = $module . '_' . $controller;
>     >     >        //
>     >     >        $action = isset($path[2]) ? $path[2] : null;
>     >     >     }
>     >     >     else
>     >     >     {
>     >     >        $domain = $request->getDomain();
>     >     >        //
>     >     >        if ( $domain )             // Subdomain matching to module 
> -
>     more
>     >     >     options here
>     >     >        {
>     >     >           $module = remainder from subtracting $domain from
>     strtolower
>     >     >     (HTTP_HOST) and the '.' separator
>     >     >           $controller = $path[0];
>     >     >           //
>     >     >           //////////////////////////////////
>     >     >           // THIS ARE VERY, VERY IMPORTANT!!
>     >     >           $moduleMap = $request->getModuleMap();                 
> //
>     >     Default:
>     >     >     'www' => ''
>     >     >           //
>     >     >           // Invokes a different controller
>     >     >           // Useful for eg: developing/testing a new controller
>     (copy),
>     >     etc.
>     >     >           $controllerMap = $request->getControllerMap();
>     >     >           //
>     >     >           // Exceptional controllers that 'modify' the $module
>     >     >           $controllerToModuleMap = $request->
>     getControllerToModuleMap();
>     >     >           //////////////////////////////////
>     >     >           //
>     >     >           if ( isset( $controllerMap[ $controller ] )
>     >     >              $controller = $controllerMap[ $controller ];        
> //
>     A
>     >     different
>     >     >     controller
>     >     >           //
>     >     >           if ( isset( $moduleMap[ $module ] )
>     >     >              $module = $moduleMap[ $module ];         // Maybe the
>     'www',
>     >     no
>     >     >     subdomain specified, etc.
>     >     >           elseif ( isset( $controllerToModuleMap[ $controller ] )
>     >     >              $module = $controllerToModuleMap[ $controller ];    
> //
>     A
>     >     different
>     >     >     module
>     >     >           //
>     >     >           if ( $module )
>     >     >              $controller = $module . '_' . $controller;
>     >     >           //
>     >     >           $action = isset($path[1]) ? $path[1] : null;
>     >     >        }
>     >     >        else           // Old fashioned - no subdirectories or
>     subdomains
>     >     >        {
>     >     >           $controller = $path[0];
>     >     >           $action = isset($path[1]) ? $path[1] : null;
>     >     >        }
>     >     >     }
>     >     >
>     >     >
>     >     >     The formatControllerName method should be ehnanced to ignore
>     >     >     directory-separators in the controller name:
>     >     >
>     >     >     public function formatControllerName($unformatted)
>     >     >     {
>     >     >        if ( $this->_subdirectories || $this->_domain )
>     >     >        {
>     >     >           $unformatted = str_replace(array('-', '_', '.'), ' ',
>     >     strtolower
>     >     >     ($unformatted));
>     >     >           $unformatted = preg_replace('[^a-z0-9 ]', ' ',
>     $unformatted);
>     >     >           $unformatted = str_replace(' ', DIRECTORY_SEPARATOR,
>     ucwords
>     >     >     ($unformatted));
>     >     >           //
>     >     >           return $unformatted . 'Controller';
>     >     >        }
>     >     >        //
>     >     >        return ucfirst($this->_formatName($unformatted)) .
>     'Controller';
>     >     >     }
>     >     >
>     >     >
>     >     >     Further, the Zend::loadClass/loadFile methods could be
>     duplicated in
>     >     the
>     >     >     Zend_Controller_Dispatcher class that would ignore
>     >     directory-separators in
>     >     >     controller names:
>     >     >
>     >     >     if ( $this->_subdirectories || $this->_domain )
>     >     >     {
>     >     >        self::loadClass($className, $this->_directory);
>     >     >        $className = str_replace( DIRECTORY_SEPARATOR, '_',
>     $className );
>     >     >     }
>     >     >     else
>     >     >        Zend::loadClass($className, $this->_directory);
>     >     >
>     >     >
>     >     >     Here is another enhancement to improve performance in
>     >     >     Zend_Controller_Dispatcher::_dispatch() method that gets
>     invoked
>     >     twice
>     >     >     (regex) - once with $performDispatch false and the next time
>     with
>     >     true:
>     >     >
>     >     >     if ( $this->_className )
>     >     >     {
>     >     >         $className = $this->_className;        // Second pass -
>     >     >     $performDispatch = true
>     >     >         $this->_className = '';
>     >     >     }
>     >     >     else      // First pass - $performDispatch = false
>     >     >     {
>     >     >         $className = $this->formatControllerName($action->
>     >     getControllerName());
>     >     >         $this->_className = $className;        // Store it to
>     improve
>     >     >     performance by re-using this var next-time when
>     $performDispatch is
>     >     true!
>     >     >     }
>     >     >     //
>     >     >     ...
>     >     >     ...
>     >     >
>     >     >
>     >     >     Maybe, there are better ways and ideas (refer to Rob's
>     suggestion,
>     >     too) in
>     >     >     this regard.
>     >     >
>     >     >     Excuse me if I referred to any obsolete classes.
>     >     >
>     >     >     http://framework.zend.com/issues/browse/ZF-617
>     >     >
>     >     >
>     >     >     Regards,
>     >     >
>     >     >
>     >     >     Shekar
>     >     >
>     >     >
>     >
>     >     --
>     >     Matthew Weier O'Phinney
>     >     PHP Developer            | [EMAIL PROTECTED]
>     >     Zend - The PHP Company   | http://www.zend.com/
>     >
>     >
> 
>     --
>     Matthew Weier O'Phinney
>     PHP Developer            | [EMAIL PROTECTED]
>     Zend - The PHP Company   | http://www.zend.com/
> 
> 

-- 
Matthew Weier O'Phinney
PHP Developer            | [EMAIL PROTECTED]
Zend - The PHP Company   | http://www.zend.com/

Reply via email to