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

<p>я хочу загрузить контроллер из функции в другой контроллер, потому что библиотека, которую я интегрировал в свой проект, не хочет загружать его в контроллер, потому что я хочу, чтобы он был чистым и связанным.</p><p>я пытался использовать модули, но мне все равно пришлось поставить контроллер в url, как </p><p> <a href="http://example.com/maincontroller/function">http://example.com/maincontroller/function</a> <br /> <a href="http://example.com/othercontroller/function">http://example.com/othercontroller/function</a> </p><p>у меня есть контроллер по умолчанию, поэтому я могу загрузить <a href="http://example.com/function">http://example.com/function</a> так как я могу получить доступ к контроллеру из функции из основного, чтобы мне не нужно было помещать контроллер в url.</p><p>я все еще готов использовать hmvc, если смогу загрузить функцию контроллера из функции основного контроллера. </p>

<p>вы не можете загрузить контроллер из контроллера в ci - если вы не используете hmvc или что-то еще. </p><p>вы должны немного подумать о своей архитектуре. если вам нужно вызвать метод контроллера из другого контроллера, то вы, вероятно, должны абстрагировать этот код от помощника или библиотеки и вызвать его из обоих контроллеров.</p><p><strong>обновление</strong></p><p>после прочтения вашего вопроса я понимаю, что вашей конечной целью является не обязательно hmvc, а манипулирование uri. поправьте меня, если я ошибаюсь, но похоже, что вы пытаетесь создать url с первым разделом, представляющим имя метода, и вообще не указывать имя контроллера.</p><p>если это так, вы бы получили более чистое решение, проявив <a href="http://ellislab.com/codeigniter/user-guide/general/routing.html">креативность своих маршрутов</a> . </p><p>для действительно простого примера, скажем, у вас есть два контроллера, <code>controller1</code> и <code>controller2</code>. <code>controller1</code> имеет метод <code>method\_1</code> - и <code>controller2</code> имеет метод <code>method\_2</code>.</p><p>вы можете настроить маршруты следующим образом:</p><pre><code>$route['method_1'] = "controller1/method_1"; $route['method\_2'] = "controller2/method\_2"; </code></pre><p>затем вы можете вызвать метод 1 с url-адресом, таким как <code>http://site.com/method\_1</code>, а метод 2 с <code>http://site.com/method\_2</code>.</p><p>хотя это жесткий пример, очень простой пример, но он может привести вас туда, где вы должны быть, если все, что вам нужно сделать, это удалить контроллер из url.</p><hr><p>вы также можете пойти с <a href="http://ellislab.com/codeigniter/user-guide/general/controllers.html#remapping">переназначение ваших контроллеров</a> .</p><p>из документации: «если ваш контроллер содержит функцию с именем \_remap (), он всегда будет вызываться независимо от того, что содержит ваш uri.»:</p><pre><code>public function \_remap($method) { if ($method == 'some\_method') { $this->$method(); } else { $this->default_method(); } } 

да, вы можете (для версии 2)загрузить, как это внутри вашего контроллера $this->load->library('../controllers/whathever'); </code></pre><p>и вызвать следующий метод:</p><pre><code>$this->whathever->functioname(); 

вы не можете вызвать метод контроллера из другого контроллера напрямую мое решение состоит в том, чтобы использовать наследования и расширить свой контроллер от контроллера библиотеки class controller1 extends ci_controller { public function index() { // some codes here } public function methoda(){ // code here } } в вашем контроллере мы называем это mycontoller он расширяет controller1include_once (dirname(__file__) . "/controller1.php"); class mycontroller extends controller1 { public function __construct() { parent::__construct(); } public function methodb(){ // codes.... } } и вы можете вызвать methoda из mycontroller <a href="http://example.com/mycontroller/methoda">http://example.com/mycontroller/methoda  <a href="http://example.com/mycontroller/methodb">http://example.com/mycontroller/methodb это решение сработало для меня

у меня была похожая проблема. я хотел иметь два контроллера:homepage.php - общедоступная домашняя страницаhome.php - домашний экран, когда пользователь вошел в системуи я хотел, чтобы они оба читали с mydomain.comмне удалось сделать это, установив 'hompepage' в качестве контроллера по умолчанию в моей конфигурации маршрутов и добавив функцию remap в homepage.phpfunction _remap() { if(user_is_logged_in()) { require_once(apppath.'controllers/home.php'); $ohome = new home(); $ohome->index(); } else { $this->index(); } } </code></pre>

<p>хотя приведенные выше методы могут работать, здесь очень хороший метод.</p><p>расширьте основной контроллер с помощью my-контроллера, а затем добавьте этот my-контроллер для всех остальных ваших контроллеров. например, вы могли бы иметь:</p><pre><code>class my\_controller extends ci\_controller { public function is\_logged() { //your code here } public function logout() { //your code here } } </code></pre><p>тогда ваши другие контроллеры могут расширить это следующим образом:</p><pre><code>class another\_controller extends my\_controller { public function show\_home() { if (!$this->is_logged()) { return false; } } public function logout() { $this->logout(); } } </code></pre>

<p>у меня была ошибка файла сеанса, но я пробовал разные способы, наконец-то добился этого. сделал функцию как статическую (которую я хочу вызвать в другом контроллере), и назвал как</p><pre><code>require\_once('welcome.php'); welcome::hello(); </code></pre>

<p>создайте помощника, используя код, который я создал ниже, и назовите его controller\_helper.php.</p><p>загрузите ваш помощник в файл <code>autoload.php</code> в разделе <code>config</code>.</p><p>из вашего метода вызов <code>controller('name')</code> для загрузки контроллера. </p><p>обратите внимание, что <code>name</code> - это имя файла контроллера.</p><p>этот метод добавит <code>'\_controller'</code> к вашему контроллеру <code>'name'</code>. для вызова метода в контроллере просто запустите <code>$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(); } } } } } ?> 

я должен был создать функцию {{ render() }} в twig, чтобы имитировать поведение symfony2. рендеринг контроллеров из вида - это действительно круто для представления независимых видов или материалов, которые можно перезагружать с помощью ajax.твиг, вы все равно можете воспользоваться этим помощником и использовать его в своих выступлениях с использованием <?php echo twig_render('welcome/index', $param1, $param2, $\_); ?></code>. это означает, что вы используете ваш контроллер.</p><p>вот:</p><p><kbd>helpers/twig\_helper.php</kbd></p><pre><code><?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')); </code></pre><p><kbd>usage</kbd></p><pre><code>{{ render('welcome/index', param1, param2, ...) }} </code></pre>