0

FuelPHP 的文档中,它有以下示例:

// or fetch the output of a module
$widget = Request::forge('mymodule/mycontroller/mymethod/parms', false)->execute();
echo $widget;

这在我调用的函数具有action_前缀时有效,但是当我删除前缀时(因为我不希望浏览器调用它)它不再起作用,即使我将第二个参数设置为false.

这是一个例子:


作品

在一个控制器中,我调用:

$widget = Request::forge('mymodule/mycontroller/mymethod')->execute();
echo $widget;

在我的控制器中:

public function action_mymethod()
{
    echo 'works';
}

404 失败

在一个控制器中,我调用:

$widget = Request::forge('mymodule/mycontroller/mymethod', false)->execute();
echo $widget;

在我的控制器中:

public function mymethod()
{
    echo 'works';
}
4

1 回答 1

6

您不能删除操作前缀。

您不了解 FuelPHP 中的 HMVC 是如何工作的。从控制器的角度来看,一个请求就是一个请求,不管它来自哪里。可以从 URL(主请求)或通过辅助请求 (HMVC) 调用任何操作。

Request::forge() 方法的第二个参数只是控制路由。如果为 true(默认值),则请求通过路由引擎发送,因此在将请求 URI 映射到控制器/方法时将应用路由。如果为 false,则绕过路由引擎,并直接映射到控制器/方法。

如果您的路由表最后包含一个包罗万象以避免路由到内部控制器,您将需要这个。这是防止控制器通过主请求被调用的首选方式。

如果您有具有公共和内部方法的控制器,则使用路由选项可能会变得复杂,因为您需要从 catch_all 中排除一些 URI。

在这种情况下,您可以使用以下命令检查控制器操作中的请求类型:

\Request::is_hmvc()

如果您的操作由主请求(即通过浏览器 URL)调用,这将返回 false,如果是 HMVC 调用,则返回 true。如果您希望显示 404,您可以重定向到其他地方,或者抛出 HttpNotFoundException。

于 2012-03-31T15:51:35.877 回答