[英]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.