在Zend框架中实现虚荣网址(如http://facebook.com/JohnDoe)?

时间:2009-08-19 00:34:40

标签: php zend-framework zend-controller

无论如何都要在保持默认/模块/控制器/动作/值路由结构的同时创建一个虚荣网址“catch all”路由?

谢谢!

2 个答案:

答案 0 :(得分:3)

最好设置自定义路线,例如在引导程序中:

protected function _initRoutes() {
     $this->bootstrap('frontController');
     $front = $this->getResource('frontController');
     $router = $front->getRouter();

     $router->addRoute(
         'neat_url',
         new Zend_Controller_Router_Route(
              'profile/:username',
              array(
                   'controller' => 'profiles',
                   'action' => 'view_profile'
              )
         )
     );
}

这样你仍然可以拥有默认路由并拥有一个自定义路由,该路由将重定向/profile/jhon.doe下的所有内容,然后在你的控制器下使用$ this-&gt; _getParam('username'); <获取参数/ p>

答案 1 :(得分:2)

您可以在前端控制器插件上使用PreDispatch()挂钩。像这样:

在你的引导程序中

<?php
...
$frontController = Zend_Controller_Front::getInstance();
// Set our Front Controller Plugin
$frontController->registerPlugin(new Mystuff_Frontplugin());

?>

然后在Mystuff / Frontplugin.php里面

<?php

class Mystuff_Frontplugin extends Zend_Controller_Plugin_Abstract
{
    ....

    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        ....

        $controllerFile = $this->_GetRequestedControllerFile();

        if (!is_file($controllerFile)) {
            // Controller does not exist
            // re-route to another location
            $request->setModuleName('customHandler');
            $request->setControllerName('index'); 
            $request->setActionName('index');

        }
    }

    ....
}

preDispatch()也是处理应用程序范围身份验证的便利位置。