1

最初のLithiumアプリを作成しようとしていますが、非常に奇妙なエラーが発生します。

インデックスビューに線がありますが、

<td><?php echo $this->html->link($question->title, array('controller'=>'questions','action'=>'view','id'=>$question->id)); ?></td>

私が想像するのは、そのレコードビューにリンクすることですが、'questions/view'.$question->id'それを使用すると、配列URLを使用すると致命的になります。

Fatal error: Uncaught exception 'lithium\net\http\RoutingException' with message 'No parameter match found for URL('コントローラー'=>'質問'、'アクション'=>'ビュー'、'id' => '1').' in /Applications/MAMP/htdocs/learning-lithium/libraries/lithium/net/http/Router.php on line 306

これは、ルーターがヘルパーのURLと一致させようとしているように見えますが、何らかの理由で一致できないため、例外がスローされています。誰かがこれがなぜであるかについて何か考えを持っていますか?私はCakePHPの観点からリチウムを攻撃しているので、これは私には奇妙に思えます。

4

2 に答える 2

1

param はデフォルト ルートによって処理され、'args'引数としてアクション メソッドに渡されます。

これを試して:

<?=$this->html->link($question->title, array('Questions::view', 'args' => array($question->id))); ?>

パラメータでルーティングするにはid、 を介して id パラメータを探すルートを指定する必要があります{:id}。「データベース オブジェクト ルート」セクションのデフォルトの routes.php ファイルを調べます。これには、完全を期すために以下にコピーするいくつかの例があります。

/**
 * ### Database object routes
 *
 * The routes below are used primarily for accessing database objects, where `{:id}` corresponds to
 * the primary key of the database object, and can be accessed in the controller as
 * `$this->request->id`.
 *
 * If you're using a relational database, such as MySQL, SQLite or Postgres, where the primary key
 * is an integer, uncomment the routes below to enable URLs like `/posts/edit/1138`,
 * `/posts/view/1138.json`, etc.
 */
// Router::connect('/{:controller}/{:action}/{:id:\d+}.{:type}', array('id' => null));
// Router::connect('/{:controller}/{:action}/{:id:\d+}');

/**
 * If you're using a document-oriented database, such as CouchDB or MongoDB, or another type of
 * database which uses 24-character hexidecimal values as primary keys, uncomment the routes below.
 */
// Router::connect('/{:controller}/{:action}/{:id:[0-9a-f]{24}}.{:type}', array('id' => null));
// Router::connect('/{:controller}/{:action}/{:id:[0-9a-f]{24}}');

したがって、ID の形式に応じて、これら 2 つのセクションのいずれかのコメントを解除する必要があります。ID パラメーターで正規表現を使用して、ID ではない URL 引数と一致しないようにします。ちなみに、最初のルートは id のデフォルト値を設定してnullいますが、ルートが null 値と一致するとは思わないため、正確には意味がありませんが、とにかく、それがデフォルト値を設定する方法ですパラメータ。

これを行う場合、コントローラー アクション メソッドは次のようにする必要があることに注意してください。

public function view() {
    $id = $this->request->id;
    // or an alternative that does the same thing
    // $id = $this->request->get("params::id");
    // ... etc ...
}

コントローラー アクション メソッドに引数として渡された URL の断片を取得する唯一の方法は、'args'param を使用することです。

于 2012-05-01T22:09:51.123 に答える
0

ルートで名前付きパラメーターを使用していないため、ビューで次を出力するだけです。

<?php echo $this->html->link($question->title, array('controller'=>'questions', 'action'=>'view', $question->id));?>

QuestionsController の関数シグネチャは次のようになります。

public function view($id) {}
于 2012-05-01T18:37:18.190 に答える