2014-01-10 10 views
5

CakePHP 3.0では、名前付きパラメーターが削除されました(神に感謝します)。私はまだ他のMVCフレームワークでは、たとえばASP.NETのためにあなたがのActionResult(関数と同じ)でパラメータを渡すということですが、周りに私の頭を取得するために苦労しています何CakePHP 3.0クエリー文字列パラメーターと渡されたパラメーター

Edit(int id = null) { 

    // do stuff with id 

} 

そして、そのメソッドは、/Edit?id=1のようなクエリ文字列としてIDを渡します。そして、あなたはそれをかなり好きにするためにルーティングを使います:/Edit/1。 CakePHPでは

は、しかし、のような関数パラメータ内で渡されるもの:クエリ文字列のアイディアともURLを向上させるためにルーティングする必要性を回避/Edit/1

function edit($id = null) { 

    // do stuff with $id 

} 

は次のように渡されたパラメータとして行われなければなりません。

私は次のようにその編集用リンクでのparamsに名前を付ける場合:

public function edit() { 

    $id = $this->request->query('id'); 

    // do stuff with $id 

} 

を渡されたパラメータIDで取得するには:私は、しなければならない

$this->Html->link('Edit', array('action' => 'edit', 'id' => $post->id)); 

。それはCakePHP 3.0用のASP.NETのような機能でそれを拾うだろうと思っていましたが、そうではありません。私だけではなく、それらを渡すの編集リンクで渡された値の前に付けることを好む

ので、私はもう一方の端に限り序を心配する必要はありませんし、私は彼らが何であるかを知っているなど

います誰もがCakePHPのメソッドにデータを渡すこれらの方法のいずれかを使っていて、正しいやり方とバージョン3.0の変更がこのエリアのものをどのように改善するかをもっと明らかにすることができます...

答えて

10

CakePHP 3.0ではいくつかのタイプのリクエストパラメータがあります。のは、それらを確認してみましょう:

クエリ文字列:特別を:$this->request->query()でアクセスされ、引数として、あなたはHtml->link('My link', ['my_query_param' => $value])

渡される引数を行う必要があり、リンクをするための関数をコントローラに渡されていません引数の型は、コントローラ関数が引数として受け取るものです。それらは引数として、または$this->request->params['pass']を検査することによってアクセスされます。あなたは経路によって渡される引数とのリンクを構築しますが、デフォルトルートのために、あなただけのHtml->link('My link', ['action' => view, $id, $secondPassedArg, $thirdPassedArg])

リクエストのparamsのようなリンクに位置のparamsを追加:渡された引数はこの1つのサブタイプです。リクエストパラメータは、ルートから抽出できる情報のうちリクエストに含まれる値です。 Paramsは、生涯を通じて他のタイプのパラメータに変換することができます。

Router::connect('/articles/:year/:month/:day', [ 
    'controller' => 'articles', 'action' => 'archive' 
]); 

私たちは、効果的にそのルートに3つのリクエストパラメータを作成しました::monthyeardayと、彼らは$this->request->year$this->request->month$this->request->dayにアクセスすることができ

はこのルートを検討してください。

$this->Html->link(
    'My Link', 
    ['action' => 'archive', 'year' => $y, 'month' => $m, 'day' => $d] 
); 

ルートはこれらのパラメータを指定するため、クエリ文字列パラメータとして変換されないことに注意してください。私たちが渡された引数にそれらを変換したい場合は今、私たちは、代わりにこのルートを接続します

Router::connect('/articles/:year/:month/:day', 
    ['controller' => 'articles', 'action' => 'archive'], 
    ['pass' => ['year', 'month', 'day']] 
); 

当社のコントローラ機能は、今のようになります。

function archive($year, $month, $day) { 
    ... 
} 
+0

なぜCakePHPはあなたがそれのように種類の間で選択することができません私はこれまで見てきたことから、あなたがきれいなバージョン(これは渡されたパラメータ経由でCakePHPにデフォルトで表示される)を作るためにルータを使うまで、クエリ文字列にデフォルト設定することで、情報Jose、ありがとう、ありがとう、ありがとう。 – Cameron

関連する問題