PHP CodeIgniter: Как программно получить имена всех контроллеров? - PullRequest
2 голосов
/ 02 декабря 2011

Это выполнимо путем рекурсивного чтения имен файлов в PHP. Но есть ли уже существующий метод в классе маршрутизатора или каком-либо другом классе, который может дать мне имена всех контроллеров?

Справочная информация: Я хочу назначить URL-адреса таким пользователям, как: http://www.example.com/my_user_name

Но не хотелось бы иметь my_user_name равный любому из контроллеров CI.

Ответы [ 4 ]

1 голос
/ 02 декабря 2011

В CodeIgniter нет метода, который мог бы предоставить вам эту информацию.

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

Рекомендуется расширить маршрутизатор и добавить желаемую функциональность.

0 голосов
/ 25 декабря 2016

Возможно использовать прагматично - пожалуйста, следуйте этим шагам

1) Создайте эту библиотеку с помощью ControllerList.php и сохраните в application / library каталог.

Библиотека -

    <?php
    if (!defined('BASEPATH'))
        exit('No direct script access allowed');

    class ControllerList {

        /**
         * Codeigniter reference 
         */
        private $CI;

        /**
         * Array that will hold the controller names and methods
         */
        private $aControllers;

        // Construct
        function __construct() {
            // Get Codeigniter instance 
            $this->CI = get_instance();

            // Get all controllers 
            $this->setControllers();
        }

        /**
         * Return all controllers and their methods
         * @return array
         */
        public function getControllers() {
            return $this->aControllers;
        }

    /**
     * Set the array holding the controller name and methods
     */
    public function setControllerMethods($p_sControllerName, $p_aControllerMethods) {
        $this->aControllers[$p_sControllerName] = $p_aControllerMethods;
    }

    /**
     * Search and set controller and methods.
     */
    private function setControllers() {
        // Loop through the controller directory
        foreach(glob(APPPATH . 'controllers/*') as $controller) {

            // if the value in the loop is a directory loop through that directory
            if(is_dir($controller)) {
                // Get name of directory
                $dirname = basename($controller, EXT);

                // Loop through the subdirectory
                foreach(glob(APPPATH . 'controllers/'.$dirname.'/*') as $subdircontroller) {
                    // Get the name of the subdir
                    $subdircontrollername = basename($subdircontroller, EXT);

                    // Load the controller file in memory if it's not load already
                    if(!class_exists($subdircontrollername)) {
                        $this->CI->load->file($subdircontroller);
                    }
                    // Add the controllername to the array with its methods
                    $aMethods = get_class_methods($subdircontrollername);
                    $aUserMethods = array();
                    foreach($aMethods as $method) {
                        if($method != '__construct' && $method != 'get_instance' && $method != $subdircontrollername) {
                            $aUserMethods[] = $method;
                        }
                    }
                    $this->setControllerMethods($subdircontrollername, $aUserMethods);                                      
                }
            }
            else if(pathinfo($controller, PATHINFO_EXTENSION) == "php"){
                // value is no directory get controller name                
                $controllername = basename($controller, EXT);

                // Load the class in memory (if it's not loaded already)
                if(!class_exists($controllername)) {
                    $this->CI->load->file($controller);
                }

                // Add controller and methods to the array
                $aMethods = get_class_methods($controllername);
                $aUserMethods = array();
                if(is_array($aMethods)){
                    foreach($aMethods as $method) {
                        if($method != '__construct' && $method != 'get_instance' && $method != $controllername) {
                            $aUserMethods[] = $method;
                        }
                    }
                }

                $this->setControllerMethods($controllername, $aUserMethods);                                
            }
        }   
    }
}

?>

2) Теперь загрузите эту библиотеку и используя ее, вы можете выбрать все контроллеры и методы соответственно.

$this->load->library('controllerlist');

print_r($this->controllerlist->getControllers());

Вывод будет таким -

Array
(
    [academic] => Array
        (
            [0] => index
            [1] => addno
            [2] => addgrade
            [3] => viewRecordByStudent
            [4] => editStudentRecord
            [5] => viewRecordByClass
            [6] => viewRecordByTest
            [7] => viewGradeByClass
            [8] => editGrade
            [9] => issueMarksheet
            [10] => viewIssueMarksheet
            [11] => checkRecordStatus
            [12] => checkRecordData
            [13] => checkStudentRecordData
            [14] => insertGrades
            [15] => updateGrades
            [16] => updateRecords
            [17] => insertStudentNo
            [18] => getRecordDataByStudent
            [19] => getRecordDataByClass
            [20] => getGradesDataByClass
            [21] => deleteGrades
            [22] => insertIssueMarksheet
            [23] => getIssuedMarksheets
            [24] => printMarksheet
        )

    [attendance] => Array
        (
            [0] => index
            [1] => holidays
            [2] => deleteHoliday
            [3] => addHoliday
            [4] => applications
            [5] => deleteApplication
            [6] => addApplication
            [7] => insertApplication
            [8] => applcationByClass
            [9] => applcationByPeriod
            [10] => applcationByStudent
            [11] => getApplicationsByClass
            [12] => getApplicationsByPeriod
            [13] => getApplicationsByStudent
            [14] => attendanceforstudent
            [15] => attendanceforfaculty
            [16] => getStudentsForAttendance
            [17] => feedStudentAttendance
            [18] => sendAbsentStudents
            [19] => particularStudent
            [20] => monthlyWiseStudents
            [21] => dailyAttedance
            [22] => feedFacultyAttendance
            [23] => particularFaculty
            [24] => monthlyWiseFaculty
            [25] => editStudentAttendance
            [26] => updateStudentAttendance
        )

)

Пожалуйста, примените это и дайте мне знать, если у вас есть какие-либо проблемы.

0 голосов
/ 05 декабря 2011

Как насчет использования $route['404_override'] = 'users'; таким образом, что ничего не найденное попадет на ваш пользовательский контроллер. Если пользователь не найден, просто show_404 ().

0 голосов
/ 02 декабря 2011

Попробуйте:

$files = get_dir_file_info(APPPATH.'controllers', FALSE);

    // Loop through file names removing .php extension
    foreach (array_keys($files) as $file)
    {
        $controllers[] = str_replace(EXT, '', $file);
    }
    print_r($controllers);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...