CodeIgniter 4 не распознает UserModel

Я использую CodeIgniter 4 в Windows 10, и у меня возникла проблема, когда CI не распознает мою модель.

Я получаю следующую ошибку при отправке формы:

Ошибка
Класс 'CodeIgniter\Models\UserModel' не найден
APPPATH\Controllers\User.php в строке 42

CI отображает эту строку (в User.php) как источник проблемы:

$model = новая модель пользователя();

Вот мой файл контроллера пользователя (app/Controllers/User.php):

<?php

namespace App\Controllers;

use CodeIgniter\Controller;
use CodeIgniter\Models\UserModel;

class User extends Controller {
    public function index() {
      return redirect()->to('/user/signin');
    }

    public function signin() {
      $data = [];
      helper(['form']);

      echo view('templates/dashkit/head');
      echo view('templates/dashkit/signin', $data);
      echo view('templates/dashkit/foot');

      return;
    }

    public function register() {
      $data = [];
      helper(['form']);

      if($this->request->getMethod() == 'post') {
        $rules = [
          'company' => 'required|min_length[8]|is_unique[users.user_company]',
          'email' => 'required|min_length[11]|max_length[255]|valid_email|is_unique[users.user_email]',
          'firstname' => 'required|min_length[2]|max_length[50]',
          'lastname' => 'required|min_length[2]|max_length[50]',
          'password' => 'min_length[8]|max_length[255]',
          'password_confirm' => 'matches[password]',
        ];

        if(!$this->validate($rules)) {
          $data['validation'] = $this->validator;
        } else {
          // If the information passes validation, add the user to the database
          $model = new UserModel();

          $newData = [
            'company'   => $this->request->getVar('company'),
            'email'     => $this->request->getVar('email'),
            'firstname' => $this->request->getVar('firstname'),
            'lastname'  => $this->request->getVar('lastname'),
            'password'  => $this->request->getVar('password')
          ];
          $model->save($newData);
          $session = session();
          $session->setFlashdata('success', 'The form was successfully submitted.');
          return redirect()->to('/dashboard');
        }
      }

      echo view('templates/dashkit/head');
      echo view('templates/dashkit/register', $data);
      echo view('templates/dashkit/foot');

      return;
    }
}

А вот мой файл UserModel (app/Models/UserModel.php):

<?php

namespace App\Models;

use CodeIgniter\Model;

class UserModel extends Model {
  protected $allowedFields = ['user_company', 'user_created_at', 'user_email', 'user_firstname', 'user_lastname', 'user_password'];
  protected $beforeInsert = ['beforeInsert'];
  protected $beforeUpdate = ['beforeUpdate'];
  protected $createdField  = 'created_at';
  protected $table = 'users';

  protected function beforeInsert(array $data) {
    if(isset($data['data']['password'])) {
      $data['data']['password'] = password_hash($data['data']['password'], PASSWORD_DEFAULT);
    }

    return $data;
  }

  protected function beforeUpdate(array $data) {


    return $data;
  }
}

person penguinstyles    schedule 16.04.2021    source источник
comment
Я не эксперт в codeIgniter, но похоже, что ваше пространство имен на самом деле App\Models .. Итак, попробуйте use App\Models\UserModel; ?   -  person Pogrindis    schedule 16.04.2021
comment
Я действительно пробовал это уже. Я получаю CodeIgniter\Database\Exceptions\DataException Нет данных для вставки. ошибка. Однако двойная и тройная проверка документации CI 4 подтверждает, что пространство имен должно использовать CodeIgniter\Models\UserModel;   -  person penguinstyles    schedule 16.04.2021
comment
В этом случае вы должны расширить модель, например extends CI_Model ?   -  person Pogrindis    schedule 16.04.2021
comment
Я тоже пробовал это и не видел никаких изменений в ошибках. Из того, что я узнал из других вопросов о переполнении стека, это только для CodeIgniter 3.   -  person penguinstyles    schedule 16.04.2021
comment
Хм, понятно.. Даже в документации есть то, что есть у вас.. У меня нет идей.. Надеюсь, кто-то с лучшим знанием CI может помочь   -  person Pogrindis    schedule 16.04.2021
comment
Спасибо за вашу помощь, это очень ценится!   -  person penguinstyles    schedule 16.04.2021
comment
1-й комментарий @Pogrindis правильный: check. Теперь вам нужно поработать над ошибками настройки базы данных.   -  person Vickel    schedule 16.04.2021
comment
@Викель, хм. На других страницах документации говорится, что там нужно использовать CodeIgniter\. Странно, спасибо за это! Любые идеи, почему я сейчас получаю Нет данных для вставки. сообщение об ошибке? Я добавил оператор print_r($newData); выше $model->save($newData);, который подтверждает, что данные не пусты.   -  person penguinstyles    schedule 16.04.2021
comment
скорее всего потому, что первичный ключ не был установлен: codeigniter.com/user_guide/models/model .html?highlight=save (перейдите к разделу save()   -  person Vickel    schedule 16.04.2021
comment
@Викель, ты прав! После добавления первичного ключа в запрос он теперь правильно вставляется в мою базу данных. Спасибо!   -  person penguinstyles    schedule 16.04.2021
comment
Я сделал свои комментарии ответом   -  person Vickel    schedule 16.04.2021


Ответы (1)


Сначала вам нужно следовать правилам пространства имен, как в документах. :

namespace App\Controllers;   

use App\Models\NewsModel;    // App instead of CodeIgniter
use CodeIgniter\Controller;

Во-вторых, ошибка, которую вы получаете последовательно (как указано в вашем комментарии):

CodeIgniter\Database\Exceptions\DataException Нет данных для вставки.

вызвано тем, что для $model->save($newData); не установлен первичный ключ

см. Сохранение данных:

save(): это оболочка вокруг методов insert() и update(), которая автоматически обрабатывает вставку или обновление записи в зависимости от того, находит ли он ключ массива, соответствующий значению $primaryKey.

person Vickel    schedule 16.04.2021