无法获取不可路由的HMVC请求在FuelPHP中工作

zgo*_*vez 0 php module hmvc fuelphp

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

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

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

这是一个例子:


作品

在一个控制器中我打电话:

$widget = Request::forge('mymodule/mycontroller/mymethod')->execute();
echo $widget;
Run Code Online (Sandbox Code Playgroud)

在我的控制器中:

public function action_mymethod()
{
    echo 'works';
}
Run Code Online (Sandbox Code Playgroud)

失败,404

在一个控制器中我打电话:

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

在我的控制器中:

public function mymethod()
{
    echo 'works';
}
Run Code Online (Sandbox Code Playgroud)

Wan*_*ard 6

您无法删除操作前缀.

你不明白FuelPHP中的HMVC是如何工作的.从控制器的角度来看,请求是一个请求,无论它来自何处.可以从URL(主请求)或通过辅助请求(HMVC)调用任何操作.

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

如果您的路由表在末尾包含一个catch-all以避免路由到内部控制器,那么您将需要这个.这是屏蔽控制器通过主要请求调用的首选方法.

如果您有包含公共和内部方法的控制器,则使用route选项可能会变得复杂,因为您需要从catch_all中排除某些URI.

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

\Request::is_hmvc()
Run Code Online (Sandbox Code Playgroud)

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