0

我有一个基本的控制器操作,它执行 findByKey()。URL 如下所示:

/pin/show/45

但是,如果“45”不存在(params.key),我想将它们重定向到 /pin/。

目前,当没有指定键时,它似乎仍然显示带有所有帖子的显示操作。我对此有点困惑。

此外,如果我检查 params.key 的 show() 操作,它不会按预期工作;我的重定向没有发生……即使转储参数,也没有显示密钥。

这是我的 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/ 控制器和操作中,但仍然在 URL 中显示 /pin/show/。

4

1 回答 1

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 插件随附的截屏视频系列,因为它使很多这些东西变得更加琐碎。

于 2013-07-09T13:11:36.650 回答