如何在码标中从另一个控制器加载控制器?

2022-08-30 12:34:27

我想从另一个控制器中的函数加载控制器,因为我集成到我的项目中的库我不想将其加载到控制器,因为我想保持它的干净和相关。

我尝试使用模块,但我仍然必须将控制器放在URL中,例如


http://example.com/maincontroller/function http://example.com/othercontroller/function

我有默认的控制器,所以我可以加载 http://example.com/function 所以我如何从main的函数访问控制器,这样我就不必将控制器放在URL中。

如果可以从主控制器功能加载控制器功能,我仍然愿意使用HMVC。


答案 1

是的,你可以(对于版本2)

在控制器内部像这样加载

 $this->load->library('../controllers/whathever');

并调用以下方法:

$this->whathever->functioname();

答案 2

您无法从 CI 中的控制器加载控制器 - 除非您使用 HMVC 或其他内容。

你应该稍微考虑一下你的架构。如果需要从另一个控制器调用控制器方法,则可能应该将该代码抽象出到帮助程序或库中,并从两个控制器调用它。

更新

再次阅读您的问题后,我意识到您的最终目标不一定是HMVC,而是URI操作。如果我错了,请纠正我,但似乎您正在尝试完成URL,第一部分是方法名称,并完全省略控制器名称。

如果是这种情况,您可以通过在路线上发挥创意来获得更干净的解决方案。

对于一个非常基本的示例,假设您有两个控制器,并且 . 有一个方法 - 并且有一个方法。controller1controller2Controller1method_1controller2method_2

您可以按如下方式设置路由:

$route['method_1'] = "controller1/method_1";
$route['method_2'] = "controller2/method_2";

然后,可以使用类似 URL 的方法 1 调用方法 1,并使用 .http://site.com/method_1http://site.com/method_2

虽然,这是一个硬编码的,非常基本的示例 - 但是如果您需要做的就是从URL中删除控制器,它可以将您带到需要的位置。


您还可以重新映射控制器

来自文档:“如果您的控制器包含名为_remap()的函数,则无论您的URI包含什么,它都将始终被调用。

public function _remap($method)
{
    if ($method == 'some_method')
    {
        $this->$method();
    }
    else
    {
        $this->default_method();
    }
}

推荐