Контроллер Codeigniter и модель с одноименной коллизией - PullRequest
5 голосов
/ 24 марта 2012

Я попробую кое-что из этого комментария. Идея Контроллер воспламенителя кода / Конфликты названий моделей

найти переменную имени класса в core / CodeIgniter.php:

$class = $RTR->fetch_class(); и изменить так:
$class = 'Controller' . $RTR->fetch_class();

теперь измените имя контроллера:

class ControllerUser extends CI_Controller { ...

Это работает, теперь я могу использовать модель пользователя и контроллер пользователя. Но мой вопрос: имеет ли это смысл? или проблема? (извините, мой плохой английский)

Ответы [ 4 ]

7 голосов
/ 24 марта 2012

Я бы не стал изменять ядро ​​CodeIgniter.При обновлении вы потеряете это изменение.

В прошлом я сделал две вещи: 1. назвал мои модели User_model 2. назвал мои контроллеры во множественном числе и мои модели в единственном числе.

Я делаю последнее сейчас.Это семантически также имеет смысл, поскольку имя контроллера находится в URL, поэтому пути выглядят как app_path / users / username.Кроме того, модель обычно моделирует одного пользователя, так что это тоже имеет смысл.

Вы также можете следить за обсуждениями сообщества по этому вопросу здесь: http://codeigniter.uservoice.com/forums/40508-codeigniter-reactor/suggestions/1269847-controller-prefixes

5 голосов
/ 24 марта 2012

Чтобы обойти эту проблему, обычно большинство людей добавляют суффикс «_model» к именам классов модели

Я думаю, что вместо этого лучше добавить суффикс к контроллерам, поскольку на них почти никогда не ссылаются имена классов в вашем коде.

Сначала нам нужно расширить класс Router.

Создайте этот файл: «application / library / MY_Router.php»

class MY_Router extends CI_Router {
    var $suffix = '_controller';

    function __construct() {
        parent::CI_Router();
    }

    function set_class($class) {
        $this->class = $class . $this->suffix;
    }

    function controller_name() {

        if (strstr($this->class, $this->suffix)) {
            return str_replace($this->suffix, '', $this->class);
        }
        else {
            return $this->class;
        }

    }
}

Теперь отредактируйте «system / codeigniter / CodeIgniter.php»

строка 153:

if ( ! file_exists(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->controller_name().EXT))  

строка 158:

include(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->controller_name().EXT);  

Далее отредактируйте: «system / library / Profiler.php», строка 323:

$output .= " 
<div style="color:#995300;font-weight:normal;padding:4px 0 4px 0">".$this->CI->router->controller_name()."/".$this->CI->router->fetch_method()."</div>";  

Источник

1 голос
/ 24 марта 2012

Почему вы просто не делаете свои контроллеры единичными, а таблицы моделей / дБ множественными?

1 голос
/ 24 марта 2012

Да, это имеет смысл.Codeigniter - это строгая объектно-ориентированная структура.Это означает, что когда у вас есть 2 или более объектов с одинаковым именем, имя объекта не является достаточно уникальным.

В вашем случае модель - это процессор данных, а контроллер - класс, который связывает ваше представление смодель.Таким образом, логически вы должны назвать его примерно так:

Ваша модель будет: "Model_User", "Db_User" или "UserList"

Ваш контроллер будет: "User", Controller_User или UserController

В случае модели я предлагаю вам использовать Db_User (короткие, но четкие имена), а в случае контроллеров я предлагаю вам использовать «Пользователь» (короткий и класс, который определяет пользователя, когда он объединяется с моделью идля этого пользователя)

У меня никогда не было проблем с использованием моих систем Codeigniter, подобных этой

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