Matthew,

Thanks much for considering 617 !!

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*.

Regards,




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/

Reply via email to