Lui*_*Liz 32 php codeigniter hmvc
我想从另一个控制器中的函数加载一个控制器,因为我集成到我的项目中的库我不想将它加载到控制器,因为我想保持它清洁和相关.
我尝试使用模块,但我仍然需要将控制器放在网址中
http://example.com/maincontroller/function
http://example.com/othercontroller/function
我有默认控制器所以我可以加载http://example.com/function所以如何从main函数访问控制器所以我不必将控制器放在url中.
如果我可以从主控制器功能加载控制器功能,我仍然愿意使用HMVC.
Geo*_*llo 45
是的你可以(对于版本2)
在你的控制器内加载这样的
$this->load->library('../controllers/whathever');
Run Code Online (Sandbox Code Playgroud)
并调用以下方法:
$this->whathever->functioname();
Run Code Online (Sandbox Code Playgroud)
swa*_*ins 24
您无法从CI中的控制器加载控制器 - 除非您使用HMVC或其他东西.
你应该考虑一下你的架构.如果需要从另一个控制器调用控制器方法,那么您应该将该代码抽象到帮助器或库并从两个控制器调用它.
UPDATE
在再次阅读您的问题后,我意识到您的最终目标不一定是HMVC,而是URI操纵.如果我错了,请纠正我,但似乎您正在尝试使用第一部分作为方法名称来完成URL并完全省略控制器名称.
如果是这种情况,您可以通过创建路线来获得更清晰的解决方案.
对于一个非常基本的例子,假设你有两个控制器,controller1和controller2. Controller1有一个方法method_1- 并controller2有一个方法method_2.
您可以设置如下路线:
$route['method_1'] = "controller1/method_1";
$route['method_2'] = "controller2/method_2";
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用URL http://site.com/method_1和方法2 调用方法1 http://site.com/method_2.
虽然这是一个硬编码,非常基本的例子 - 但如果您需要做的就是从URL中删除控制器,它可以让您到达您需要的位置.
您也可以重新映射控制器.
从文档:"如果您的控制器包含一个名为_remap()的函数,无论您的URI包含什么,它都会被调用.":
public function _remap($method)
{
if ($method == 'some_method')
{
$this->$method();
}
else
{
$this->default_method();
}
}
Run Code Online (Sandbox Code Playgroud)
Moe*_*oes 16
你不能直接从另一个控制器调用控制器方法
我的解决方案是使用继承并从库控制器扩展您的控制器
class Controller1 extends CI_Controller {
public function index() {
// some codes here
}
public function methodA(){
// code here
}
}
Run Code Online (Sandbox Code Playgroud)
在你的控制器中,我们称之为Mycontoller扩展Controller1
include_once (dirname(__FILE__) . "/controller1.php");
class Mycontroller extends Controller1 {
public function __construct() {
parent::__construct();
}
public function methodB(){
// codes....
}
}
Run Code Online (Sandbox Code Playgroud)
你可以从mycontroller调用methodA
http://example.com/mycontroller/methodA
http://example.com/mycontroller/methodB
这个解决方案对我有用
我遇到了类似的问题.我想要两个控制器:
homepage.php - 面向公众的主页
home.php - 用户登录后的主屏幕
我希望他们都能阅读'mydomain.com'
我能够通过在我的路由配置中将'hompepage'设置为默认控制器并向homepage.php添加重映射功能来实现此目的.
function _remap()
{
if(user_is_logged_in())
{
require_once(APPPATH.'controllers/home.php');
$oHome = new Home();
$oHome->index();
}
else
{
$this->index();
}
}
Run Code Online (Sandbox Code Playgroud)