Вызываемый контроллер не может получить доступ к чему-либо - PullRequest
0 голосов
/ 20 мая 2018

в codeigniter У меня есть мой главный контроллер:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Main extends CI_Controller
{
    public function index()
    {
        $this->load->library('../controllers/forum');
        $obj = new $this->forum();
        $obj->test();
    }
}

И контроллер, к которому я пытаюсь получить доступ:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Forum extends CI_Controller
{
    function __construct()
    {
        echo "testing1";
        $this->load->library('session');
        parent::__construct();
        $this->load->database();
        $this->load->model('model_forum');
    }

    public function index(){

    }

    public function test(){
        echo "testing2";
        $this->data['forums'] = $this->model_forum->getForums();
        $this->load->view('homepage', $this->data);
    }
}

Все хорошо с моим файлом model_forum.php, потому чтоэто работает, если я помещаю весь код в главный контроллер.Но если я пытаюсь получить доступ к контроллеру форума, ничего не работает, проходит только эхо "testing1".Изображение ошибки: PHP error

Кто-нибудь знает, что я делаю не так?Я новичок в PHP и codeigniter, поэтому я немного борюсь.Заранее спасибо.

1 Ответ

0 голосов
/ 21 мая 2018

Вы не можете загрузить контроллер из контроллера в 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";

Затем вы можете вызвать метод1 с URL-адресом, таким как http://example.com/method_1, и метод 2 с http://example.com/method_2.

. Хотя это жестко, очень простой пример, но он может привести вас туда, где вам нужно, если все вынужно сделать это удалить контроллер из URL.


Вы также можете пойти с переназначить ваши контроллеры .

Из документов: «Если ваш контроллер содержитфункция с именем _remap () всегда будет вызываться независимо от того, что содержит ваш URI. ":

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