2010-11-19 2 views
1

ルートアクションのハイフンをアンダースコアに変更するには、Kohana 3とどうすればよいですか?

Route::set('crud', 'staff/<controller>(/<action>(/<id>))', array(
      'controller' => '(activities|users|default-emails)', 
      'action' => '(new|view|modify|delete)', 
      'id' => '\d+' 
    ))->defaults(array(
     'directory' => 'staff', 
     'action' => 'view' 
    )); 

default-emails

は明らかにせず、存在することはできません action_default-emails()メソッドを実行しようとしている... bootstrap.phpにこのルートを考えてみましょう。

ハイフンを内部的にアンダースコアにマッピングするには、どのような拡張が必要ですか?

これを行うと、_-で区切られたルートの両方からアクセスできるようになるのではないでしょうか?

ありがとうございました。

答えて

3

最も簡単なのは

$class->getMethod('action_'.str_replace('-', '_', $action))->invokeArgs($controller, $this->_params); 

からKohana_Request::execute()@1112

$class->getMethod('action_'.$action)->invokeArgs($controller, $this->_params); 

変更をハックすることです。しかし、あなたが次の各Kohanaのバージョンにこのパッチをしなければならないことを、理解しています。

より無害

Kohana_Route::matches()

class Route extends Kohana_Route 
{ 
    public function matches($uri) 
    { 
     $matches = parent::matches($uri); 
     if (isset($matches['action'])) 
     { 
      $matches['action'] = str_replace('-', '_', $matches['action']; 
     } 
     return $matches; 
    } 
} 

を延長する可能性が確認されませんでしたが、私はそれが動作するはず賭けます。

+0

感謝の気持ち - 後で機能要求を提出することがあります。 – alex

+0

@alex:拒否されます.100%;-) – zerkms

+1

@alex:別の方法 - 「Kohana_Controller」を拡張し、そのようなケースを処理する '__call()'を作成する別の方法です。 – zerkms

4

適切な下線の方法にハイフネーションされたアクションをルーティングするためのKohana 3.2のための私のソリューション:
はKohana_Routeを拡張し、このコード

if($key == 'action') 
{ 
    $params[$key] = str_replace('-','_',$value); 
} 
else 
{ 
    $params[$key] = $value; 
} 

完全なソリューションを挿入は:アプリケーション/クラスでファイルroute.phpを作成/

<?php defined('SYSPATH') or die('No direct script access.'); 

class Route extends Kohana_Route 
{ 
    public function matches($uri) 
    { 
     if ($this->_callback) 
     { 
      $closure = $this->_callback; 
      $params = call_user_func($closure, $uri); 

      if (! is_array($params)) 
       return FALSE; 
     } 
     else 
     { 
      if (! preg_match($this->_route_regex, $uri, $matches)) 
       return FALSE; 

      $params = array(); 
      foreach ($matches as $key => $value) 
      { 
       if (is_int($key)) 
       { 
        // Skip all unnamed keys 
        continue; 
       } 

       // Set the value for all matched keys 
           if($key == 'action') 
           { 
            $params[$key] = str_replace('-','_',$value); 
           } 
           else 
           { 
            $params[$key] = $value; 
           } 
      } 
     } 

     foreach ($this->_defaults as $key => $value) 
     { 
      if (! isset($params[$key]) OR $params[$key] === '') 
      { 
       // Set default values for any key that was not matched 
       $params[$key] = $value; 
      } 
     } 

     return $params; 
    } 
} 
+0

これは、Kohanaコアチームが提案したソリューションよりも私のニーズに優れていることを含め、これまでに行われた最もクリーンな方法です(私はすべての単一のルートに正規表現やコールバックを入れなければならないというファンではありません簡単に)拡張クラスで何ができるかを達成。私はそれがKohanaの3.3で動作するように取得するためにいくつかの変更をしなければならなかったが、クラスを拡張し、マッチング機能を微調整する_approach_は素晴らしい作品。 –

1

zerkmsの方法の更新。 Kohana 3.2では、system/classes/kohana/request/client/internal.phpの行106を編集する必要があります。

は交換してください:

$action = $request->action(); 

で:

$action = str_replace('-', '_', $request->action()); 

私はハッキングの枠組みを嫌うが、これははるかに最も単純で信頼性の高いソリューションです。 Routeクラスのアクションの名前を変更すると、何らかの問題が発生する可能性があります。これは、アクションがmy_action(内部)とmy_action(リンク)で呼ばれることがあるためです。

3

Kohana 3.3が出て以来、この方法はもう機能しません。私は今までのところ私のために働く解決策を見つけました。

3.3にアップグレードする場合、Internal.php要求ファイルを編集する必要はありません。代わりに、ルートフィルタを作成することができます。あなたがする必要があるのは、アクションのハイフンをアンダースコアに置き換えることだけです。

Route::set('default', '(<controller>(/<action>(/<id>)))') 
    ->filter(function($route, $params, $request) { 
     // Replacing the hyphens for underscores. 
     $params['action'] = str_replace('-', '_', $params['action']); 
     return $params; // Returning an array will replace the parameters. 
    }) 
    ->defaults(array(
     'controller' => 'welcome', 
     'action'  => 'index', 
    )); 

これは明らかにメソッドに対してのみ機能します。しかし、さらに少し調べてみると、ディレクトリ、コントローラなどの機能を改善することができます。

関連する問題