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

发布于 2024-08-01 19:19:05 字数 90 浏览 9 评论 0原文

是否有办法创建一个虚荣 url“捕获所有”路由,同时维护默认的 /module/controller/action/value 路由结构?

谢谢!

Is there anyway to create a vanity url "catch all" route whilst maintaining the default /module/controller/action/value routing structure?

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

等待圉鍢 2024-08-08 19:19:05

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

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->_getParam('用户名');

It's better if you setup a custom route, for example in your bootstrap:

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'
              )
         )
     );
}

This way you can still have the default route and have a custom route that will redirect everything under /profile/jhon.doe then under your controller you get the parameter using $this->_getParam('username');

酒中人 2024-08-08 19:19:05

您可以在前端控制器插件上使用 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() 是处理应用程序范围身份验证的方便位置。

You could use the PreDispatch() hook on a front controller plugin. Like so:

In your bootstrap

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

?>

Then inside 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');

        }
    }

    ....
}

Also preDispatch() is a handy location to handle application wide authentication.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文