2011-06-04 55 views
3

我正在爲Kohana 3.1開發授權模塊。在我模塊的的init.php ...如何在控制器名稱之間添加破折號在Kohana中?

Route::set(

    'a11n', 
    '<controller>', 
    array(
     'controller' => 'signIn|signOut|signUp' 
    ) 

); 

我不是100%確定如何使用Kohana中的路由機制,但這個我試圖做到這一點用戶可以鍵入「簽到」,「 signOut「或」signUp「從我的模塊運行控制器。你看,我想擁有「便攜式」授權系統......所以我可以簡單地「複製粘貼」正確的目錄,啓用模塊和我的網站授權。

請記住,使用此路由我不想改變默認路由的行爲。我不知道我的代碼有多正確......但它的工作原理!我測試過,我也可以在不使用第三參數的情況下獲得相同的效果。我現在用它做什麼?

現在的問題...我怎麼能通過鍵入「登錄」用戶運行模塊「Controller_SignIn」以模塊設置路由?

回答

4

您應該使用路由做到這一點,是這樣的:

Route::set('SignIn', '/sign-in(/<action>)', 
     array(
      'action' => 'index|action1', 
      ) 
     ) 
     ->defaults(
       array(
        'controller' => 'SignIn', 
        'action' => 'index', 
        ) 
       ); 

Route::set('SignOut', '/sign-out(/<action>)', 
     array(
      'action' => 'index|action1', 
      ) 
     )->defaults(
       array(
        'controller' => 'SignOut', 
        'action' => 'index', 
        ) 
       ); 

Route::set('SignIn', '/sign-in/', 
     array() 
     ) 
     ->defaults(
       array(
        'controller' => 'user', 
        'action' => 'login', 
        ) 
       ); 

Route::set('SignOut', '/sign-out/)', 
     array() 
     )->defaults(
       array(
        'controller' => 'user', 
        'action' => 'logout', 
        ) 
       ); 
+0

哪種方式更好? – daGrevis 2011-06-05 08:31:15

+0

使用路線更具可維護性,如果您想再次更改路線,則無需觸摸控制器。 – gimpe 2011-06-05 16:50:15

+0

伊莫,這種方式更好,看到我對其他問題的評論。 – SpadXIII 2011-06-06 07:14:50

1

爲什麼你要爲帳戶操作創建單獨的控制器?創建一個控制器(Controller_Account或別的東西),用行動,你需要:

class Controller_Account extends Controller_Template { 

    public function action_signin() {...} 

    public function action_signout() {...} 

    public function action_signup() {...} 

} 

正如你所看到的,動作的名字是沒有破折號。你不能在方法名中使用它們。但這裏是它的一個黑客:

public function before() 
{ 
    parent::before(); // dont forget this call! 
    // remove dashes from current method name 
    $this->request->action(str_replace('-', '', $this->request->action())); 
} 

和路由:

Route::set(
     'a11n', 
     '<action>', 
     array('action' => array('sign-in|sign-up|sign-out')) 
    ) 
    ->defaults(array('controller' => 'account')); 

當然,你可以同時使用登入和登入名稱,只需添加非虛名正則表達式路線PARAM:

Route::set(
     'a11n', 
     '<action>', 
     array('action' => array('sign-in|sign-up|sign-out|signin|signup|signout')) 
    ) 
    ->defaults(array('controller' => 'account')); 
+0

謝謝你的回答。很棒! ) – daGrevis 2011-06-04 20:06:32

+0

請注意,使用此功能,您最終會得到多個相同網頁的網址(/ signin與/登錄相同)。如果您通過gimpe使用答案,則只有/登錄會起作用。 – SpadXIII 2011-06-06 07:14:09

+0

您可以在'before()'中將'/ signin'重定向到'/ sign-in'。無論如何,我不明白,爲什麼你想創建一個控制器的行動? – biakaveron 2011-06-06 10:58:07

3

我知道這個問題已經被標記爲解決一個答案,但有一個更清潔/做的另一種方式:

創建應用程序中的一個新的文件:application/classes/request.php並把在該文件中的代碼如下:

<?php defined('SYSPATH') or die('No direct script access.'); 
class Request extends Kohana_Request 
{ 
    public function execute() 
    { 
     $this->action(str_replace('-', '', $this->action())); 
     $this->controller(str_replace('-', '', $this->controller())); 
     return parent::execute(); 
    } 
} 

現在你不必修改/污染你的bootstrap.php每個虛線/連字網址!