我有一个基本的控制器动作,它执行findByKey()。该网址如下所示:
/销/显示/ 45
但是,如果'45'不存在(params.key),我想将它们重定向到/ pin /.
此刻,当没有指定任何键时,它似乎仍显示所有帖子的显示操作。我对此感到有点困惑。
另外,如果我检查params.key的show()操作,它不能按预期工作;我的重定向不会发生......即使倾倒params,也没有显示密钥。
这是我的show()动作:
public void function show() {
if( !structKeyExists(params, "key") ) {
flashInsert( messages = [{ messageString="Key is required.", messageType="error" }] );
redirectTo(route="pin");
}
param name="params.page" default="1";
param name="params.pageQuantity" default="10";
pins = model("pin").findByKey(
key = params.key,
returnAs = "query",
include = "user",
order = "createdat DESC",
page = params.page,
perPage = params.pageQuantity
);
}
任何帮助将不胜感激!
谢谢, 迈克尔。
更新
这似乎与路线有关?以下是我的pin路线,如下:
addRoute(name="pinShow", pattern="pin/show/[key]", controller="pin", action="show");
addRoute(name="pinEdit", pattern="pin/edit/[key]", controller="pin", action="edit");
addRoute(name="pinDelete", pattern="pin/delete/[key]", controller="pin", action="delete");
addRoute(name="pinUpdate", pattern="pin/update", controller="pin", action="update");
addRoute(name="pinNew", pattern="pin/new", controller="pin", action="new");
addRoute(name="pinCreate", pattern="pin/create", controller="pin", action="create");
addRoute(name="pinWanted", pattern="pin/wanted", controller="pin", action="wanted");
addRoute(name="pin", pattern="pin", controller="pin", action="index");
现在,很多这些路线看似毫无意义,因为它们使用与没有路线时相同的URL模式,但计划将来更改这些路线。
当我点击/ pin / show /,没有键时,它似乎加载在/ pin / index / controller和action中,但仍在URL中显示/ pin / show /。
答案 0 :(得分:2)
您可以使用verifies()
初始化程序显着清理它。
function init() {
verifies(
only = "show",
params = "key",
paramsTypes = "integer",
handler = "handleInvalidShowParams"
);
}
function show() {
param name="params.page" default="1";
param name="params.pageQuantity" default="10";
pins = model("pin").findByKey(
key = params.key,
returnAs = "query",
include = "user",
order = "createdat DESC",
page = params.page,
perPage = params.pageQuantity
);
}
private function handleInvalidShowParams() {
flashInsert( messages = [{ messageString="Key is required.", messageType="error" }] );
redirectTo(route="pin");
}
如您所见,我们添加一项检查以确保key
存在并且是一个整数。如果其中任何一个测试失败,控制器就会运行handleInvalidShowParams()
,它可以执行您需要的任何操作。
这使show()
的范围保持在需要担心的范围内,控制器中的其他机制可能会担心参数验证。
<强>更新强>
看一下我添加的第二行:
addRoute(name="pinShow", pattern="pin/show/[key]", controller="pin", action="show");
addRoute(name="pinShow", pattern="pin/show", controller="pin", action="show");
addRoute(name="pinEdit", pattern="pin/edit/[key]", controller="pin", action="edit");
addRoute(name="pinDelete", pattern="pin/delete/[key]", controller="pin", action="delete");
addRoute(name="pinUpdate", pattern="pin/update", controller="pin", action="update");
addRoute(name="pinNew", pattern="pin/new", controller="pin", action="new");
addRoute(name="pinCreate", pattern="pin/create", controller="pin", action="create");
addRoute(name="pinWanted", pattern="pin/wanted", controller="pin", action="wanted");
addRoute(name="pin", pattern="pin", controller="pin", action="index");
我相信没有密钥就会捕捉/pin/show
模式。
作为额外的功劳,我可能会建议您查看ColdRoute plugin和accompanying screencast series,因为它会使这些内容变得更加微不足道。