[英]Any easy, noncluttering way to set up “mydomain.com/username” using PHP?
[英]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
表示两种类型的操作:
这对我来说有点奇怪。 我更愿意将用户请求置于不同的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.