it-swarm.com.ru

Как загрузить контроллер с другого контроллера в codeigniter?

Я хочу загрузить контроллер из функции в другой контроллер, потому что библиотека, которую я интегрировал в свой проект, не хочет загружать его в контроллер, потому что я хочу, чтобы он был чистым и связанным.

Я пытался использовать модули, но мне все равно пришлось поставить контроллер в URL, как 

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

У меня есть контроллер по умолчанию, поэтому я могу загрузить http://example.com/function так как я могу получить доступ к контроллеру из функции из основного, чтобы мне не нужно было помещать контроллер в URL.

Я все еще готов использовать HMVC, если смогу загрузить функцию контроллера из функции основного контроллера. 

29
Luis Liz

Вы не можете загрузить контроллер из контроллера в CI - если вы не используете HMVC или что-то еще. 

Вы должны немного подумать о своей архитектуре. Если вам нужно вызвать метод контроллера из другого контроллера, то вы, вероятно, должны абстрагировать этот код от помощника или библиотеки и вызвать его из обоих контроллеров.

ОБНОВЛЕНИЕ

После прочтения вашего вопроса я понимаю, что вашей конечной целью является не обязательно HMVC, а манипулирование URI. Поправьте меня, если я ошибаюсь, но похоже, что вы пытаетесь создать URL с первым разделом, представляющим имя метода, и вообще не указывать имя контроллера.

Если это так, вы бы получили более чистое решение, проявив креативность своих маршрутов

Для действительно простого примера, скажем, у вас есть два контроллера, controller1 и controller2. Controller1 имеет метод 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();
    }
}
21
swatkins

да, вы можете (для версии 2)

загрузить, как это внутри вашего контроллера

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

и вызвать следующий метод:

$this->whathever->functioname();
42
Geomorillo

вы не можете вызвать метод контроллера из другого контроллера напрямую 

мое решение состоит в том, чтобы использовать наследования и расширить свой контроллер от контроллера библиотеки 

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....
    }
}

и вы можете вызвать methodA из mycontroller

http://example.com/mycontroller/methodA

http://example.com/mycontroller/methodB

это решение сработало для меня

15
Moes

У меня была похожая проблема. Я хотел иметь два контроллера:

homepage.php - общедоступная домашняя страница

home.php - домашний экран, когда пользователь вошел в систему

и я хотел, чтобы они оба читали с mydomain.com

Мне удалось сделать это, установив 'hompepage' в качестве контроллера по умолчанию в моей конфигурации маршрутов и добавив функцию remap в homepage.php

function _remap()
{
  if(user_is_logged_in())
  {
    require_once(APPPATH.'controllers/home.php'); 
    $oHome =  new Home();
    $oHome->index();
  }
  else
  {
    $this->index();
  }
}
8
Keith Ritter

Хотя приведенные выше методы могут работать, здесь очень хороший метод.

Расширьте основной контроллер с помощью MY-контроллера, а затем добавьте этот MY-контроллер для всех остальных ваших контроллеров. Например, вы могли бы иметь:

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

У меня была ошибка файла сеанса, но я пробовал разные способы, наконец-то добился этого. Сделал функцию как статическую (которую я хочу вызвать в другом контроллере), и назвал как

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

Создайте помощника, используя код, который я создал ниже, и назовите его 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();
                }
            }
        }
    }
}
?>
0
Taurai Muzopa

Я должен был создать функцию {{ render() }} в Twig, чтобы имитировать поведение Symfony2. Рендеринг контроллеров из вида - это действительно круто для представления независимых видов или материалов, которые можно перезагружать с помощью ajax.

Твиг, вы все равно можете воспользоваться этим помощником и использовать его в своих выступлениях с использованием <?php echo twig_render('welcome/index', $param1, $param2, $_); ?>. Это означает, что вы используете ваш контроллер.

Вот:

helpers/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 (адаптируйте этот код к своей реализации Twig):

libraries/Twig.php

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

Usage

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