Маршрут к нескольким подпапкам в CodeIgniter - PullRequest
8 голосов
/ 06 марта 2011

В моем каталоге контроллеров настроена папка администратора, в которой у меня есть 3 отдельные подпапки с контроллерами внутри них.

-- Controllers
---- Admin
------ Dashboard
-------- dashboard.php
-------- file.php
------ Members
-------- members.php
-------- file.php
------ Settings
-------- settings.php
-------- file.php

Я попытался перенаправить его в файл rout.php, как это

$route['admin/(:any)/(:any)'] = 'admin/$1/$2';
$route['admin/(:any)'] = 'admin/$1/$1';
$route['admin'] = 'admin/index';

Что мне сделать, чтобы это исправить?

Ответы [ 4 ]

11 голосов
/ 07 декабря 2012

Этот код уже был в Интернете, но я изменил его, чтобы он работал для codeigniter 2.1

См. Старый источник здесь: http://glennpratama.wordpress.com/2009/10/20/multi-level-subfolder-for-controller-in-codeigniter/

Создайте новый файл MY_Router.php вкаталог application / core, скопируйте в него следующий код:

<?php

/*
 * Custom router function v 0.2
 *
 * Add functionality : read into more than one sub-folder
 *
 */

Class MY_Router extends CI_Router
{
    Function MY_Router()
    {
        parent::__construct();
    }

    function _validate_request($segments)
    {
        if (file_exists(APPPATH.'controllers/'.$segments[0].EXT))
        {
            return $segments;
        }

        if (is_dir(APPPATH.'controllers/'.$segments[0]))
        {
            $this->set_directory($segments[0]);
            $segments = array_slice($segments, 1);

            /* ----------- ADDED CODE ------------ */

            while(count($segments) > 0 && is_dir(APPPATH.'controllers/'.$this->directory.$segments[0]))
            {
                // Set the directory and remove it from the segment array
            //$this->set_directory($this->directory . $segments[0]);
            if (substr($this->directory, -1, 1) == '/')
                $this->directory = $this->directory . $segments[0];
            else
                $this->directory = $this->directory . '/' . $segments[0];

            $segments = array_slice($segments, 1);
            }

            if (substr($this->directory, -1, 1) != '/')
                $this->directory = $this->directory . '/';

            /* ----------- END ------------ */

            if (count($segments) > 0)
            {

                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().'/'.$segments[0].EXT))
                {
                    show_404($this->fetch_directory().$segments[0]);
                }
            }
            else
            {
                $this->set_class($this->default_controller);
                $this->set_method('index');

                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().'/' .$this->default_controller.EXT))
                {
                    $this->directory = '';
                    return array();
                }

            }

            return $segments;
        }

        show_404($segments[0]);
    }
}
4 голосов
/ 07 марта 2011

Codeigniter «из коробки» не поддерживает несколько уровней подкаталогов в каталоге контроллеров, только один.

Существует способ расширить класс маршрутизации для поддержки этого, проверьте эту запись в блоге.

3 голосов
/ 30 октября 2016

Для совместимости Codeigniter 3.x: использование константы EXT устарело с момента прекращения поддержки PHP 4. Больше нет необходимости поддерживать другие расширения имени файла, и в этой новой версии CodeIgniter (3.x) EXTконстанта была удалена.Вместо этого используйте просто «.php».

Так что новый MY_Router.php:

<?php

/*
 * Custom router function v 0.3
 *
 * Add functionality : read into more than one sub-folder
 * Compatible with Codeigniter 3.x
 *
 */

Class MY_Router extends CI_Router
{
    Function MY_Router()
    {
        parent::__construct();
    }

    function _validate_request($segments)
    {

       if (file_exists(APPPATH.'controllers/'.$segments[0].".php"))
        {
            return $segments;
        }

        if (is_dir(APPPATH.'controllers/'.$segments[0]))
        {
            $this->set_directory($segments[0]);
            $segments = array_slice($segments, 1);

            /* ----------- ADDED CODE ------------ */

            while(count($segments) > 0 && is_dir(APPPATH.'controllers/'.$this->directory.$segments[0]))
            {
                // Set the directory and remove it from the segment array
            //$this->set_directory($this->directory . $segments[0]);
            if (substr($this->directory, -1, 1) == '/')
                $this->directory = $this->directory . $segments[0];
            else
                $this->directory = $this->directory . '/' . $segments[0];

            $segments = array_slice($segments, 1);
            }

            if (substr($this->directory, -1, 1) != '/')
                $this->directory = $this->directory . '/';

            /* ----------- END ------------ */

            if (count($segments) > 0)
            {

                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().'/'.$segments[0].".php"))
                {
                    show_404($this->fetch_directory().$segments[0]);
                }
            }
            else
            {
                $this->set_class($this->default_controller);
                $this->set_method('index');

                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().'/' .$this->default_controller.".php"))
                {
                    $this->directory = '';
                    return array();
                }

            }

            return $segments;
        }

        show_404($segments[0]);
    }
}
1 голос
/ 27 февраля 2014

Я столкнулся с проблемой с 4-5 levels из sub-directories (например, / controllers / folder1 / folder2 / folder3 / folder4 / my-controller) и изменил цикл while с

while(count($segments) > 0 && 
     // checks only $this->directory having a /
     is_dir(APPPATH.'controllers/'.$this->directory.$segments[0]))

до

while(count($segments) > 0 && 
   // check $this->directory having a /
  (is_dir(APPPATH.'controllers/'.$this->directory.$segments[0]) ||  
      // check $this->directory not having /
      is_dir(APPPATH.'controllers/'.$this->directory.'/'.$segments[0])))

У меня это работает.

Вышеуказанный вариант подходит для 2-3 sub-directories, но не для 4-5 sub-directory иерархии.

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