Codeigniter 4 BadMethodCallException

Я пытаюсь войти в систему, и я получаю эту ошибку, которую я не могу понять, почему. Кроме того, я не уверен, могу ли я упомянуть еще 1 вопрос или мне нужно выделить его в другой теме. Если я хочу, чтобы пользователь входил в систему, используя либо имя пользователя, либо адрес электронной почты, как мне это сделать?

Я загрузил сообщение об ошибке здесь

Ошибка кажется в этой строке:

$user = $model->model('username', $this->request->getVar('username'))
                      ->first();

Ниже мой код:

Контроллер

public function login()
{
    $data = [];
    helper(['form']);
    
    $validation =  \Config\Services::validation();
    
    
    if($this->request->getMethod() == 'post'){
        //validations
        $rules = [
            'username' => 'required',
            'password' => 'required|validateUser[username, password]'
        ];
        
        $errors = [
            'password' => [
                'validateUser' => 'Username or Password don\'t match'
            ]
        ];
        
        
        if(!$this->validate($rules, $errors)){
            $data['validation'] = $this->validator;
        }else{
            $model = new AccountModel();
            
            $user = $model->model('username', $this->request->getVar('username'))
                          ->first();
                          
            $this->setUserMethod($user);
            return redirect()->to('account');
        }
        
    }
    
    echo view('templates/header', $data);
    echo view('account/login');
    echo view('templates/footer');
}

Модель

<?php namespace App\Models;

use CodeIgniter\Model;

class AccountModel extends Model{
    
    protected $table = 'users';
    protected $allowedFields = [
        'username',
        'email',
        'firstname',
        'lastname',
        'dob',
        'country',
        'contact',
        'password',
        'created_at',
        'updated_at',
        'created_by'
    ];
    protected $beforeInsert = ['beforeInsert'];
    protected $beforeUpdate = ['beforeUpdate'];
    
    protected function beforeInsert(array $data) {
        
        $data = $this->passwordHash($data);
        return $data;
        
    }
    
    protected function beforeUpdate(array $data) {
        
        $data = $this->passwordHash($data);
        return $data;
        
    }
    
    protected function passwordHash(array $data){
        if(isset($data['data']['password']))
            $data['data']['password'] = password_hash($data['data']['password'], PASSWORD_DEFAULT);
        return $data;
    }
    
}

?>

Надеюсь, кто-то может помочь мне здесь. Заранее спасибо!


person Dr3am3rz    schedule 21.07.2020    source источник
comment
Нет AccountModel::model, поэтому вызов $model-›model приведет к ошибке, которую вы видите... Это как бы очень четкое указание на то, что метод модели в вашей AccountModel не существует. И не создавайте одну названную модель, так как это не лучший выбор имен и в любом случае довольно бессмысленный в этом контексте.   -  person TimBrownlaw    schedule 21.07.2020


Ответы (1)


Итак, у вас есть эта строка, пытающаяся вызвать метод с именем модель, которая не существует...

Это то, что у вас...

$user = $model->model('username', $this->request->getVar('username'))
                          ->first();

Если вы читали руководство пользователя CodeIgniter, вы бы увидели, что действительно хотите использовать where вместо модели... Возможно, потому что модель застряла у вас в голове, как это иногда случается.

$user = $model->where('username', $this->request->getVar('username'))->first();

Посмотрите, как это летит для вас.

person TimBrownlaw    schedule 21.07.2020
comment
Благодарю вас! Да, это работает! Поскольку я новичок в этом, мне еще многое предстоит узнать и понять. - person Dr3am3rz; 22.07.2020