簡體   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