【问题标题】:Can't get unroutable HMVC request to work in FuelPHP无法获得无法路由的 HMVC 请求以在 FuelPHP 中工作
【发布时间】:2012-03-31 06:53:26
【问题描述】:

documentation of 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';
}

【问题讨论】:

    标签: php module hmvc fuelphp


    【解决方案1】:

    您不能删除操作前缀。

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

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

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

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

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

    \Request::is_hmvc()
    

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

    【讨论】:

    • 哦,好吧。我很困惑,因为Base Controller 说:“可以通过 URL 请求的方法以 'action_' 为前缀。”所以我假设我可以删除前缀,这样浏览器就无法访问它,但仍然可以在内部请求(即 HMVC)。顺便说一句,我认为你的意思是 \Request::is_hmvc() 如果 HMVC 将返回 true,否则浏览器 URL?
    • 顺便发现,如果 mycontroller 扩展了 Controller_Template 而不是 Controller,则调用 Request::forge('mymodule/mycontroller/mymethod/parms')->execute(); 也会返回 404 >.
    • 我看不出为什么。会不会是“mymodule/mycontroller/mymethod/parms”不可路由?那确实会抛出 404。如果是这样,请使用 FALSE 作为第三个参数来 forge() 绕过路由引擎。
    • 我得到一个没有错误的 404(发现它不可路由)。但是我得到一个“连接已重置”的浏览器打开了错误消息。我认为 Controller_Template 不应该由小部件扩展,因为我相信模板通过模块在自身内部循环。你怎么看?
    • 我无法查看您的代码以了解您所做的工作,但如果您的 HMVC 控制器扩展了与您的主控制器相同的基本控制器,并使用相同的模板,那么显然您有一个主要设计您的应用程序存在缺陷。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 2022-07-01
    • 2015-12-16
    相关资源
    最近更新 更多