Проблема при попытке проверить электронную почту, которая уже существует в базе данных - PullRequest
0 голосов
/ 08 марта 2019

Я создаю пользовательский фреймворк mvc в php для обучения, и когда я пытаюсь отправить свою форму с почтой, которая уже существует в базе данных, моя проверка должна помешать мне сделать это, вместо этого я получаю эту ошибку:

Fatal error: Uncaught Error: Call to a member function findUserByEmail() on null in C:\xampp\htdocs\gacho\App\Controllers\UsersController.php:

UsersController.php

<?php
namespace App\Controllers;

use App\Models\User;
use Core\Controller;

class UsersController extends Controller
{
    public function __construct($controller, $action)
    {
        parent::__construct($controller, $action);
        $this->userModel = $this->load_model('User');
    }

    public function registerAction()
    {
        if ($_SERVER['REQUEST_METHOD'] == 'POST') {

            $data = [
                'email' => trim($_POST['email']),
                ];
            }

            if (empty($data['email'])) {
                $data['email_err'] = "Please enter your email!!!";
            } else {
                if ($this->userModel->findUserByEmail($data['email'])) {
                $data['email_err'] = "Email is already taken!";
                }
          }
    }

User.php

<?php
namespace App\Models;

use Core\Database;

class User
{
    private $db;

    public function __construct()
    {
        $this->db = new Database();
    }

    public function findUserByEmail($email)
    {
        $this->db->query('SELECT * FROM users WHERE email = :email');
        $this->db->bind(':email', $email);
        $row = $this->db->single();
        if ($this->db->rowCount() > 0) {
            return true;
        } else {
            return false;
        }
    }
}

Controller.php:

<?php
namespace Core;

class Controller
{
    protected $_controller;
    protected $_action;
    public $view;

    public function __construct($controller, $action)
    {
        $this->_controller = $controller;
        $this->_action = $action;
        $this->view = new View();
    }

    protected function load_model($model)
    {
        $modelPath = 'App\Models\\' . $model;
        if (class_exists($modelPath)) {
            $this->{$model.'Model'} = new $modelPath();
        } 
    }
}

Я думаю, что ошибка заключается воколо $ this-> userModel, но я застрял, и любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 09 марта 2019

Проблема в том, что в __construct UsersController у вас есть:

$this->userModel = $this->load_model('User');

Поэтому вы присваиваете свойству userModel возвращаемое значение метода load_model.load_model метод ничего не возвращает, поэтому $this->userModel всегда установлен на NULL, не имеет значения, если load_model успешно или нет.

Вы должны просто return new $modelPath(); в load_model, еслиВы хотите присвоить его свойству по возвращаемому значению.

Также добавьте throw new Exception($modelPath. 'not found'); в конце метода load_model, чтобы убедиться, что он действительно загружал модель, а не просто молча не смог ее найти.

Обратите внимание, что $this->userModel - это не то же самое, что $this->UserModel (с учетом регистра) и $modelPath = 'App\Models\\' . $model; - почему \ после App и два \ после Models?

0 голосов
/ 08 марта 2019

Я думаю, что вам нужен доступ к вашей модели в $ this-> UserModel, так как User был передан в метод load_model.

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