如何加载在笨另一个控制器控制器?(How to load a controller from ano

2019-07-17 20:48发布

我想在另一个控制器加载从功能的控制器,因为我综合我的项目库,我不想因为我想保持它的清洁和有关将其加载到控制器。

我试着用模块,但我还是不得不把控制器在url像

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

我有默认的控制器,所以我可以加载http://example.com/function所以我怎么会从主函数访问的控制,所以我没有把控制器中的URL。

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

Answer 1:

你不能从CI控制器负载控制器 - 除非你使用HMVC或东西。

你应该想想你的架构了一下。 如果您需要从另一个控制器调用控制器的方法,那么你应该很可能是抽象的代码出来给助手或库和两个控制器的调用它。

UPDATE

重读你的问题后,我意识到,你的最终目标是不一定HMVC,但URI处理。 纠正我,如果我错了,但好像你要完成的URL与第一部分是方法的名称,并完全离开了控制器名称。

如果是这样的话,你会通过获取得到一个清晰的解决方案发挥您的创意路线 。

对于一个真正简单的例子,假设你有两个控制器, controller1controller2Controller1有一个方法method_1 -和controller2有一个方法method_2

您可以设置这样的路线:

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

然后,你可以调用方法1通过URL http://site.com/method_1和方法2 http://site.com/method_2

虽然,这是一个硬编码的,很基本的示例 - 但它可以让你到你需要如果你需要做的是从URL中移除控制器。


你也可以去重新映射你的控制器 。

从文档:“如果你的控制器包含一个名为_remap()的函数,它总是会被调用,无论你的URI包含的内容。”:

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


Answer 2:

是的,你可以(2版)

加载你这样的控制器内

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

并调用下面的方法:

$this->whathever->functioname();


Answer 3:

你无法从另一个控制器直接调用控制器方法

我的解决方案是使用继承和磁带库控制器扩展控制器

class Controller1 extends CI_Controller {

    public function index() {
        // some codes here
    }

    public function methodA(){
        // code here
    }
}

在控制器中,我们把它叫做Mycontoller它会扩展Controller1

include_once (dirname(__FILE__) . "/controller1.php");

class Mycontroller extends Controller1 {

    public function __construct() {
        parent::__construct();
    }

    public function methodB(){
        // codes....
    }
}

你可以从调用myController的了methodA

http://example.com/mycontroller/methodA

http://example.com/mycontroller/methodB

该解决方案为我



Answer 4:

我有一个类似的问题。 我想有两个控制器:

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();
  }
}


Answer 5:

虽然上述方法可能会奏效,这里是一个很好的方法。

扩展了我的控制器的核心控制器,然后再扩展这是我对您的所有其他控制器控制器。 例如,你可以有:

class MY_Controller extends CI_Controller {
    public function is_logged()
    {
        //Your code here
    }
public function logout()
    {
        //Your code here
    }
}

然后你的其他控制器可以再扩展这个如下:

class Another_Controller extends MY_Controller {
    public function show_home()
    {
         if (!$this->is_logged()) {
           return false;
         }
    }
public function logout()
    {
        $this->logout();
    }
}


Answer 6:

我来到这里是因为我需要创建一个{{ render() }}在枝条的功能,以模拟Symfony2的行为。 从视图中呈现控制器真是爽显示独立的小部件或Ajax的可重新加载的东西。

即使你不是一个枝条用户,你仍然可以利用这个帮手,当你在你的意见要呈现控制器使用它,使用<?php echo twig_render('welcome/index', $param1, $param2, $_); ?> <?php echo twig_render('welcome/index', $param1, $param2, $_); ?> 。 这一切都呼应控制器输出。

这里是:

助手/ twig_helper.php

<?php

if (!function_exists('twig_render'))
{

    function twig_render()
    {
        $args = func_get_args();
        $route = array_shift($args);
        $controller = APPPATH . 'controllers/' . substr($route, 0, strrpos($route, '/'));

        $explode = explode('/', $route);
        if (count($explode) < 2)
        {
            show_error("twig_render: A twig route is made from format: path/to/controller/action.");
        }

        if (!is_file($controller . '.php'))
        {
            show_error("twig_render: Controller not found: {$controller}");
        }
        if (!is_readable($controller . '.php'))
        {
            show_error("twig_render: Controller not readable: {$controller}");
        }
        require_once($controller . '.php');

        $class = ucfirst(reset(array_slice($explode, count($explode) - 2, 1)));
        if (!class_exists($class))
        {
            show_error("twig_render: Controller file exists, but class not found inside: {$class}");
        }

        $object = new $class();
        if (!($object instanceof CI_Controller))
        {
            show_error("twig_render: Class {$class} is not an instance of CI_Controller");
        }

        $method = $explode[count($explode) - 1];
        if (!method_exists($object, $method))
        {
            show_error("twig_render: Controller method not found: {$method}");
        }

        if (!is_callable(array($object, $method)))
        {
            show_error("twig_render: Controller method not visible: {$method}");
        }

        call_user_func_array(array($object, $method), $args);

        $ci = &get_instance();
        return $ci->output->get_output();
    }

}

具体的嫩枝用户(改编此代码到您的嫩枝实现):

库/ Twig.php

$this->_twig_env->addFunction('render', new Twig_Function_Function('twig_render'));

用法

{{ render('welcome/index', param1, param2, ...) }}


Answer 7:

创建使用我初级讲座创建的代码和名称controller_helper.php它帮手。

自动加载你的助手autoload.php下文件config

从你的方法调用controller('name')来加载控制器。

请注意, name是控制器的文件名。

这种方法将追加'_controller'到控制器'name' 。 调用方法在控制器只需运行$this->name_controller->method(); 如上所述之后加载控制器。

<?php

if(!function_exists('controller'))
{
    function controller($name)
    {
        $filename = realpath(__dir__ . '/../controllers/'.$name.'.php');

        if(file_exists($filename))
        {
            require_once $filename;

            $class = ucfirst($name);

            if(class_exists($class))
            {
                $ci =& get_instance();

                if(!isset($ci->{$name.'_controller'}))
                {
                    $ci->{$name.'_controller'} = new $class();
                }
            }
        }
    }
}
?>


Answer 8:

我在会议文件中未找到错误而想尽各种办法,终于像这样实现的。 制造功能为静态的(我想在另一个控制器调用),并呼吁像

require_once('Welcome.php');
Welcome::hello();


文章来源: How to load a controller from another controller in codeigniter?