繁体   English   中英

如何使用zend框架获取像mydomain.com/username这样的动态URL

[英]how to get dynamic URL like mydomain.com/username using zend framework

我正在使用zend框架开发一个应用程序。 在应用程序中,我必须为每个用户提供一个URL,如mydomain.com/[username],然后public将能够查看他的个人资料。 [username]是特定用户的用户名

但是我怎样才能做到这一点? 我认为在ZF中mydomain.com/username尝试使用名称username来获取控制器,但是我应该在此URL中显示用户配置文件,如果有其他内容如mydomain.com/controller1那么它必须转到正确的控制器

这看起来相当多,有几个选择:

选项1:自定义路由类

我已经发布了一篇博文,其中详细介绍了如何使用自定义路由类在ZF中实现此目的,请参阅:

http://tfountain.co.uk/blog/2010/9/9/vanity-urls-zend-framework

这可能不是最简单的方法,但在我看来它是最好的,因为它允许您像任何其他方式一样设置用户名路由,并且您仍然可以使用标准的ZF URL帮助程序和其他路由玩具。

选项2:扩展路由器

另一种方法是扩展标准ZF路由器,然后在执行任何其他操作之前检查用户名路由。 就像是:

class My_Router extends Zend_Controller_Router_Rewrite
{
    public function route(Zend_Controller_Request_Abstract $request)
    {
        $pathBits = explode('/', $request->getPathInfo());
        if (!empty($pathBits[0])) {
            // check whether $pathBits[0] is a username here
            // with a database lookup, if yes, set params and return
        }

        // fallback on the standard ZF router
        return parent::route($request);
    }
}

然后,您需要告诉前端控制器使用您的路由器而不是默认路由器,因此在您的引导程序中:

protected function _initRoutes()
{
    Zend_Controller_Front::getInstance()->setRouter(new My_Router());
}

用您的应用程序自己的命名空间替换“我的”。

如果您遵循这种方法,则不能使用URL帮助程序作为用户名路由,如果您开始需要添加其他自定义功能,则事情会变得有点混乱,因此请改为使用自定义路由类。

您需要在引导程序中使用类似于以下内容的内容

public function _initRouter()
{
     $router = Zend_Controller_Front::getinstance()->getRouter();
     $users = array() // get the usernames from DB or wherever you have them

      // Adds some routes
     foreach($users as $user)
     {
        $router->addRoute($user['name'], new Zend_Controller_Router_Route($user['name'].'/:controller/:action/*', array(
          'module' => 'users', // module name
          'controller' => 'index', // controller name
          'action' => 'profile', // action name
          'username' => $user['name']))); // user name
      }
      return $router;
    }
}

在我看来,这里的困难在于您使用相同的网址方案:

http:/example.com/something

表示两种类型的操作:

  1. 如果“something”表示用户名,请考虑这是对controller = user,action = viewProfile,param = something的请求。
  2. 否则,请将此视为对控制器SomethingController的标准请求

这对我来说有点奇怪。 我更愿意将用户请求置于不同的url方案下,例如:

http://example.com/user/bob

标准路由规则可以应用的地方。 希望避免用户使用与其中一个静态控制器冲突的名称注册的风险。 当然,您可以为静态控制器维护一个“保留”用户名池,供用户选择。

但是,如果真的是相同的URL格式必须使用两种类型的请求的要求,那么我会做到以下几点:路线像所有请求TrafficCopController与动作directTrafficAction() 如果传递的“something”参数代表真实用户,则该操作可以测试 - 可能通过db查询。 如果是,则将请求转发给controller=user, action=viewProfile 否则,将请求转发给controller=something, action=index

明白了吗?

创建自定义路由 (不是路由器;不需要创建自定义路由器!)。

您的新路由应该扩展Zend_Controller_Router_Route_Abstract ,并覆盖match方法,该方法将Zend_Controller_Request_Abstract $request作为第一个参数。

在新的匹配方法中,只需通过与$request->getRequestUri()进行比较,查询数据库以查看自定义页面,用户等是否存在,如果存在,则返回相关的路由信息​​。 例:

return array(
    'module'     => 'default',
    'controller' => 'users',
    'action'     => 'view',
    'user'       => $user
);

如果失败(找不到正确的用户或页面等),则:

return false

这比为每个用户创建路由好得多,并且不需要你过多地使用路由。 它仍然可以使用标准路由器,您可以按预期通过application.ini将其添加到您的路由。

尝试使用Apache .htaccess mod_rewrite。

4)将yoursite.com/user.php?username=xyz重写为yoursite.com/xyz

你检查过zorpia.com。如果你在浏览器中键入hxxp://zorpia.com/roshanbh233,你可以在那里看到我的个人资料。 如果你想做同样的重定向,即

hxxp://yoursite.com/xyz到hxxp://yoursite.com/user.php?username = xyz然后你可以将以下代码添加到.htaccess文件中。

RewriteEngine On
RewriteRule ^([a-zA-Z0-9_-]+)$ user.php?username=$1
RewriteRule ^([a-zA-Z0-9_-]+)/$ user.php?username=$1

来源: http//roshanbh.com.np/2008/03/url-rewriting-examples-htaccess.html

Chellini的答案可能有效,但如果你有1000个用户,你将向路由器添加1000个规则。 那和数据库访问可能会增加应用程序的响应时间。

另一种方法是添加一个通用路由,默认情况下映射到用户操作(这首先定义为路径按相反顺序匹配)。 然后将路由添加到您实际拥有的控制器中 - 您可能拥有的控制器远少于用户。

如果您的应用程序是模块化的,那么您可以进一步减少必须编写的规则数量,因为您只需要为模块添加一个规则。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM