1

我正在尝试创建我的第一个锂应用程序,但我遇到了一个非常奇怪的错误。

我的索引视图中有一行,

<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

'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 采用的格式取消注释这两个部分之一。他们使用带有 id 参数的正则表达式来确保它不匹配不是 id 的 url 参数。顺便说一句,第一条路线是设置 id 的默认值,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'参数。

于 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 回答