4

API で次の URL を取得しようとしています (Codeigniter と Phil Sturgeon のREST サーバー ライブラリを使用しています)。

/players            -> refers to index method in the players controller
/players/rookies    -> refers to rookies method in the players controller

URL の末尾に「インデックス」を付けたくない

/players/index

次のようにルートを定義すると、これはまったく問題ありません。

$route['players'] = 'players/index';

すべてが期待どおりに機能します。

私の問題は、次のような追加の URL セグメントが必要なことです。

/players/rookies/limit/10/offset/5/key/abcdef

上記の例は機能しますが、次の例は機能しません。

/players/limit/10/offset/5/key/abcdef

次のエラーが表示されます:{"status":false,"error":"Unknown method."} 明らかにlimit、コントローラーにメソッドがありません。

これらの URL が正しく機能するようにするには、routes.php 構成ファイルをどのようにセットアップする必要がありますか?

どんな助けでも大歓迎です!

4

2 に答える 2

4
//www.mysite.com/players
$route['players'] = 'players/index_get';//initial call to players index

//www.mysite.com/players/rookies
/** overrides the above **/
$route['players/(:any)'] = 'players/index_get/$1';//Changing defaults index

//www.mysite.com/players/rookies/10/4
/** overrides the above **/
$route['players/(:any)/(:num)/(:num)'] = 'players/index_get/$1/$2/$3';//Changing type,limit,offset

//All routes that are similar, like above that follow the previous, override the preceding one. 


//www.mysite.com/players/create
//overrides $route['players/(:any)']
$route['players/create'] = 'players/index_post';


class Players extends REST_Controller
{
    public $player_types = array();

    public function __construct(){
       $this->player_types = array(
          'rookies', 'seniors'
       );//manual assign or pull from db
    }
    /**
     * Index
     * $_GET
    **/
    public function index_get($type='rookies',$offset=0, $limit=0)//some defaults to show on initial call
    {
        // www.mysite.com/players/rookies
        // $route['players/(:any)'] = 'players/index_get/$1';
        // First uri segment, check to see if its a valid player 'type'

        if(!in_array(strtolower($type), $this->player_types)){
             //redirect ?
             return;
        }
    }
    /**
     * Index
     * $_POST
    **/
    public function index_post()
    {
        // Create a new player
    }
}
于 2013-02-05T18:59:02.633 に答える
0

gregoryは、「/playersはplayersコントローラーのindexメソッドを参照している」と述べているため、ルーティングがクリーンな場合は$ route ['players'] ='players/index'である必要はありません。

必要な数のセグメントを作成し、URIクラスを取得してスクリプト内でそれらを区別することができます。つまり、このURL "/ players / rookies / limit / 10 / offset / 5 / key / abcdef"は、デフォルトでプレーヤーコントローラーのrookies()メソッドにつながるはずです。セグメントを取得する方法は次のとおりです。

function rookies () {
    //$this->uri->segment (1); would return 'players' or 'limit'
    //$this->uri->segment (8); would return 'abcdef' or false
}

さらに/players/ limitが機能するために:

function limit () {
    $this->rookies();
}

編集1

別のアプローチは次のとおりです。

ルーティングルール:

$route['/players/rookies/limit/(:num)/offset/(:num)/key/(:any)'] = "players/get"
$route['/players/limit/(:num)/offset/(:num)/key/(:any)'] = "players/get"

コントローラー内

function get () {
    //work with segments
}
于 2013-02-05T16:42:50.987 に答える