Codeigniter MY_Controller: можно ли расширить ядро ​​только один раз? - PullRequest
4 голосов
/ 04 ноября 2011

Я успешно расширил ядро, используя MY_Controller, как описано в документации CI.

Таким образом, я могу поместить некоторые повторяющиеся функции (например, проверку подлинности) в конструктор MY_Controller, чтобы они всегда выполнялись перед методами из других моих контроллеров.

Моя проблема сейчас в том, что некоторые части моего веб-приложения открыты (т.е. не требуют входа в систему), а другие требуют входа в систему.

Поэтому я не могу расширить ВСЕ свои контроллеры из MY_Controller (который содержит функцию проверки подлинности).

Я задавался вопросом, можно ли будет расширить ядро ​​таким образом, чтобы иметь, скажем, LOG_Controller и NOLOG_Controller.

Затем контроллеры, требующие входа в систему, будут расширяться из LOG_Controller ---, а контроллеры, не требующие входа в систему, будут расширяться из NOLOG_Controller.

Возможно ли это? (или это дурной тон?)

Похоже, config / config.php допускает только один префикс расширения ядра, поэтому я не уверен, что это возможно.

Дайте мне знать, что вы думаете, или если есть лучший способ сделать это. Спасибо.

Ответы [ 5 ]

10 голосов
/ 04 ноября 2011

Посмотрите на эту статью http://philsturgeon.co.uk/blog/2010/02/CodeIgniter-Base-Classes-Keeping-it-DRY - Это именно то, что вы ищете.

7 голосов
/ 04 ноября 2011

Я использую следующий трюк. Определите все ваши базовые контроллеры в My_Controller.php:

<?php

class My_Controller extends CI_Controller{

}

class LOG_Controller extends My_Controller{

} 

class NOLOG_Controller extends My_Controller{

}
?>

Это делает все определенные контроллеры доступными позже в ваших контроллерах. Просто не делайте базовые контроллеры слишком толстыми.

Также вы можете проверить этот пример: https://github.com/aquilax/novigeroi2/blob/master/application/core/AQX_Controller.php

3 голосов
/ 28 августа 2015

Поскольку вы еще не опубликовали исходный код, давайте представим, что ваш MY_Controller похож на следующий пример:

Путь к файлу: application / core / MY_Controller.php

class MY_Controller extends CI_Controller
{
    function __construct() {
        parent::__construct();

        if ( !$this->ion_auth->logged_in() ) {
            redirect('auth/login');
        }
    }
}

Ваши "защищенные" контроллеры расширяют этот и наследуют его методы следующим образом:

Путь к файлу: application / controllers / Secure.php

class Secure extends MY_Controller
{
    function __construct() {
        parent::__construct();
    }
}

Вы хотите разрешить в своем приложении как некоторые защищенные, так и некоторые незащищенные контроллеры.Чтобы сохранить эти контроллеры защищенными, они должны расширять MY_Controller и наследовать его __construct() метод.Для любого контроллера, которому не нужно наследовать этот __construct() метод, вы просто расширяете CI_Controller напрямую, как указано ниже:

Путь к файлу: application / controllers / Insecure.php

class Insecure extends CI_Controller
{
    function __construct() {
        parent::__construct();
    }
}

Вот оно у вас.Контроллеры, которые наследуются непосредственно от ( extension ) CI_Controller, будут "небезопасными".

Одно соображение

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

0 голосов
/ 21 апреля 2013

Другое простое решение - просто потребовать дополнительные классы / контроллеры, которые вам нужны, внизу вашего файла application / controller / my_controller.php

Мой пользовательский контроллер выглядит так, не требует дополнительной настройкинастройки:

class My_Controller extends CI_Controller {

    // do something clever here

}

// do something even more clever here ...
require_once("application/core/tool_controller.php");

Мне кажется, что это довольно сухо, а затем позволяет настроить приложение, настроив где-то каталог контроллера templates / layouts.Я просто заканчиваю старый проект CI, так что я продолжаю его, но я уверен, что вы также можете поиграть с некоторыми переменными конфигурации в другом месте, чтобы сделать его даже DRY-er

0 голосов
/ 04 ноября 2011

Я думаю, что это невозможно. Есть способы сделать то, что вам нужно, расширяя тот же контроллер. Почему бы не поместить все открытые страницы в папку (например, Public) и проверить в MY_Controller, направлен ли запрос в эту папку. Если нет, требуется авторизация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...