CodeIgniter PHP Model Access «Не удается найти указанную вами модель»

#php #model #codeigniter-2

#php #Модель #codeigniter-2

Вопрос:

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

 An Error Was Encountered

Unable to locate the model you have specified: logon_model
  

Теперь я провел свое исследование. Проблема может заключаться в том, что IC обрабатывает имена файлов в нижнем регистре. Однако и мой файл, и вызывающий файл указаны в нижнем регистре, как показано здесь :

 echo "VALIDATING";
            // Validation passed. Off we go to account info verification from AA's database. God help us all.
            $this->load->model('logon_model');
            echo "FOUND MODEL";
            $res = $this->logon_model->verify_user($this->input->post('username'),$this->input->post('password'));
            echo $this->input->post('username');
            echo $this->input->post('password');
  

Выполнение не достигает «НАЙДЕННОЙ МОДЕЛИ», таким образом, останавливается при загрузке модели. Я пытался использовать:

  $this->load->model(site_url('logon_model'));
  

Безрезультатно. Нужно упомянуть, что файл модели правильно размещен в нужной папке модели?

Как я могу это исправить?

РЕДАКТИРОВАТЬ: Заголовок для файла модели :

 class Logon_model extends CI_Model {

....
  

Комментарии:

1. Кроме того, это logon_model, а не login_model, верно? В противном случае смотрите ответ wclark

2. @Kai Qing Это все logon_model

3. Убедитесь, что класс модели и имя файла совпадают, и только первая буква должна быть заглавной, например, «Model_user»

Ответ №1:

При создании моделей вам необходимо поместить файл в application/models/ и назвать файл всеми строчными буквами, например logon_model.php

logon_model.php Должен содержать следующее:

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


class Logon_model extends CI_Model
{
    public function __construct()
    {
        parent::__construct();
    }
    ...
  

Теперь, что вы можете сделать, чтобы проверить, доступна ли ваша модель приложения, это попробовать открыть ее в браузере — вот так:
http://example.org/application/models/logon_model.php

Если вы видите текст Прямой доступ к скрипту не разрешен, это означает, что вы попали в нужный файл (если вы сомневаетесь, попробуйте написать что-нибудь еще в exit() в первой строке).

Во-вторых, для загрузки модели в ваши контроллеры вы должны быть в состоянии сделать следующее:

 public function index()
{

    $this->load->model('logon_model');
    ...

}
  

Если все вышеперечисленное выполняется так, как ожидалось, я бы начал просматривать права доступа к файлам и / или, возможно, символические ссылки, если вы используете какие-либо.

Комментарии:

1. Имя файла php должно соответствовать имени класса, а первый символ класса должен быть заглавным. Таким образом, вы должны поместить класс Logon_model в Logon_model.php . Чувствительность к регистру в имени файла не является проблемой, если вы используете Windows, но это будет в Linux.

2. Для меня это работает локально, но на веб-сервере (cpanel). Мне также нужно было переименовать файл модели ЗАГЛАВНЫМИ буквами, т.Е. (Logon_model.php согласно этому примеру)

Ответ №2:

Я использую codeigniter 3 . У меня была такая же проблема, и в моем случае я изменил имя файла модели, начиная с верхнего регистра.

Logon_model.php

Комментарии:

1. То же самое. Я использую Codeigniter 3.0, и мне нужно было назвать файл в папке модели из ‘test_model.php ‘ в ‘Test_model_php’.

2. Хочу отметить, что заглавная буква требуется только в системах на базе unix, таких как Linux и mac osx. в Windows, начинающаяся с буквы un в нижнем регистре, работает нормально.

Ответ №3:

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

     <?php
    class Logon_model extends CI_Model {

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

    function myFunc()
    {
      // do something
    }
}
  

обратите внимание на название класса в верхнем регистре.

Для загрузки используйте:

 $this->load->model('logon_model');
  

обратите внимание на все строчные буквы.

Комментарии:

1. Я добавил заголовок, проверьте его

Ответ №4:

Я решаю это следующим образом:

  1. Я переименовываю файл, чтобы Page_model.php
  2. Имя класса для Page_model расширяется…
  3. Я вызываю автозагрузку: $autoload['model'] = array('Page_model'=>'page');

Работает нормально.. Я надеюсь на помощь.

Ответ №5:

В CodeIgniter 3.0-dev (получите его с github) это не работает, потому что CI используется для поиска в виде первой буквы верхнего регистра.

Вы можете найти код на system/core/Loader.php строка 282 или ниже:

 $model = ucfirst(strtolower($model));

foreach ($this->_ci_model_paths as $mod_path)
{
    if ( ! file_exists($mod_path.'models/'.$path.$model.'.php'))
    {
        continue;
    }

    require_once($mod_path.'models/'.$path.$model.'.php');

    $CI->$name = new $model();
    $this->_ci_models[] = $name;
    return $this;
}
  

Это означает, что нам нужно создать файл со следующим именем на application/models/Logon_mode.php

Ответ №6:

Первая буква имени файла и имени класса должны быть в верхнем регистре.

Ваш класс модели будет

класс Logon_model расширяет CI_Model

и имя файла будет Logon_model.php

Получите доступ к ней из вашего контроллера, например

$this->load->model(‘Logon_model’);

Ответ №7:

Добавляя к ответу @jakentus, ниже приведено то, что сработало для меня:

  1. Измените имя файла в пакете models на Logon_model.php (Первая буква в верхнем регистре, как правильно сказал @jakentus)

  2. Измените имя класса на то же, что и имя файла, т.е.

    class Logon_model extends CI_Model

  3. Измените имя в методе load также как

    $this->load->model('Logon_model');

Надеюсь, это поможет. Удачного кодирования. 🙂

Ответ №8:

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

Например: $this->load->model('Logon_model');

и:

 class Logon_model extends CI_Model {
...
  

Но вы правы относительно имени файла.

Комментарии:

1. Я отредактировал их оба, как вы говорите, и это все еще не работает!

2. В какой именно папке находится ваша модель? Это должно быть application/models/ и у него должно быть имя logon_model.php . Если все вышеуказанные условия выполнены, нет причин, по которым вы не сможете загрузить его как Logon_model .

3. Все размещено правильно, поэтому я тоже не понимаю.

4. переименовать модель в Logon_model.php

Ответ №9:

Измените имя файла вашей модели, начните с заглавной буквы, вот так: Logon_model.php

Это происходит, когда мы переносим наш проект с Windows server на LINUX server, потому что linux чувствителен к регистру, а Windows — нет.

Итак, в Windows, даже если не записывать имя файла в верхнем регистре, тогда это также будет работать нормально, но не в Linux.

Ответ №10:

Я столкнулся с той же проблемой, но я исправил ее, изменив мой application/config/routes.php файл.

Я произвел некоторую реструктуризацию в своих каталогах контроллеров и забыл внести это в файл routes.

Ранее:

 $route['application/apply'] = 'ex/application/account/create';
  

и теперь:

$route['application/apply'] = 'application/account/create';

Ответ №11:

Изменение названия модели, начинающееся с верхнего регистра, работает. Пример: Login_model.php вместо login_model.php

Ответ №12:

вы должны изменить заглавную букву названия вашей модели. в localhost small letter работает должным образом, но в Интернете это не работает. например:

 common_model.php
  

заменил его на

 Common_model.php
  

Ответ №13:

Просто добавив мою проблему, у меня было:

 $this->load->model("planning/plan_model.php");
  

и .php там не должно быть, так что это должно было быть:

 $this->load->model("planning/plan_model");
  

надеюсь, это кому-то поможет

Ответ №14:

Если вы используете Linux, то убедитесь, что имя вашего файла должно совпадать со строкой, переданной в методах load model в качестве первого аргумента.

 $this->load->model('Order_Model','order_model');
  

Вы можете использовать второй аргумент, используя который вы можете вызывать методы из своей модели, и это будет работать также в Linux и Windows

 $result = $this->order_model->get_order_details($orderID);
  

Ответ №15:

Убедитесь, что:

  1. Первая буква в верхнем регистре
  2. Имя класса точное имя в качестве имени файла
  3. Убедитесь, что ваш файл заканчивается расширением .php

В моем случае у меня были правильные 1 и 2, но я забыл назвать свой файл с расширением .php. Как я забыл, понятия не имею, но это, несомненно, затруднило мне попытки разобраться в проблеме

Ответ №16:

Вы можете дать любое имя, которое хотите.

Руководства по стилям — это рекомендации, а не обязательные требования.

Но вы должны позаботиться о том, чтобы везде использовать одно и то же имя.

Например, для Test_Model вы должны:

Имя класса

         class Test_Model extends CI_Model
  

Имя файла

         Test_Model.php
  

Загрузить модель

         $this->load->model('Test_Model');
  

Используйте модель

         $this->Test_Model
  

Чтобы избежать использования жестких строк кодирования, вы можете загрузить модель следующим образом:

         $this->load->model(Test_Model::class);