Обновите уже существующий элемент в базе данных с помощью RedBean

Я снова обращаюсь к сообществу стека, чтобы попытаться решить мою проблему. Я использую Slim, Twig и RedBean вместе, чтобы создать серверное приложение для своего веб-сайта (короче говоря, я использую Slim для уметь подключать API и приложение к нему).

(Примечание: я относительно новичок в RedBean, поэтому я еще не освоился с ним)

Однако при попытке обновить пользователя я получаю странную ошибку исключения.

Однако работают следующие пункты: - Добавить пользователя - Удалить пользователя

Когда я обновляю своего пользователя, он дает мне сообщение «Этот адрес электронной почты уже используется», что нормально, поскольку я использую его адрес электронной почты учетной записи. Однако я не могу пройти мимо ошибки...

Вот файл исключения (Models/Validation/Users.php):

class Users extends SimpleModel {

    public function update() {
        $firstname = trim($this->bean->firstname);
        $lastname = trim($this->bean->lastname);
        $email = trim($this->bean->email);

        if(isset($this->bean->firstname)){
            $firstname = trim($this->bean->firstname);
            if(empty($firstname)) {
                throw new ValidationException( 'You have to provide a firstname.' );
            }
        }

        if(isset($this->bean->lastname)){
            $lastname = trim($this->bean->lastname);
            if(empty($lastname)) {
                throw new ValidationException( 'You have to provide a lastname.' );
            }
        }

        if(isset($this->bean->email)){
            $email = trim($this->bean->email);
            if(empty($email)) {
                throw new ValidationException( 'You have to provide an email.' );
            }
        }

        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            throw new ValidationException( 'Not a valid email.' );
        }

        $searchUser = R::findOne( 'Users', ' email = ? ', [ $email ] );
        if(!empty($searchUser)){
            $equal = $this->bean->equals($searchUser);
        } else {
            $equal = FALSE;
        }

        if(!empty($searchUser) && !$equal) {
            throw new ValidationException( 'This email already exists.' );
        }   
    }
}

И вызов обновления:

public function update( $id, $entry ) {
        try {
            $user = R::load( $this->config->getTable('users'), 'id = ? ', [ $id ] );
            if(array_key_exists('firstname',$entry)) $user->firstname = $entry['firstname'];
            if(array_key_exists('lastname',$entry)) $user->lastname = $entry['lastname'];
            if(array_key_exists('email',$entry)) $user->email = $entry['email'];

            (!empty($entry['password'])) ? $user->password = password_hash($entry['password'], PASSWORD_BCRYPT) : null;

            R::store($user);

        } catch(ValidationException $e) {
            $this->errors[] = $e->getMessage();
            return FALSE;
        }
    }

Помещенный контроллер:

Class PutController extends Controllers\Controller {

    public function updateRecord() {

        $user = new Users($this->configManager('Database'));
        $this->data['user'] = $this->app->request->post();
        $password = trim($this->app->request->post('password'));
        $passwordConfirm = trim($this->app->request->post('password-confirm'));
        if((!empty($password) || !empty($passwordConfirm)) && ($password != $passwordConfirm)){
            $this->app->errors += ["Password and the confirmation are different"];
            return;
        }
        $user->update($this->args['id'], $this->app->request->post());
        $this->app->errors += $user->getErrors();

    }


}

И, наконец, маршрут:

$this->app->group('/update/:id', function () {

        // Display the page to update a user
        $this->app->map('/', function ($id) {
            $data = new Users\GetController( 'updateView', ['id' => $id] );
            $data->send("Users/update.template.html");
        })->via('GET');

        // Post request to update a user
        $this->app->map('/', function ($id) {
            $data = new Users\PutController( 'updateRecord', ['id' => $id] );
            if(!empty($this->app->errors)) {
                $this->app->flashNow("errors", $this->app->errors);
                $data->send("Users/update.template.html");
            } else {
                $this->app->flash("success", "Successfully updated the user.");
                $this->app->redirect('../');
            }
        })->via('POST', 'PUT');

    }); 

И последнее, но не менее важное, форма ветки:

<form action="" method="POST">
                  <div class="form-group">
                    <label for="firstname">Firstname</label>
                    <input value="{{user.firstname}}" type="text" class="form-control" id="firstname" name="firstname" placeholder="Firstname">
                  </div>
                  <div class="form-group">
                    <label for="lastname">Lastname</label>
                    <input value="{{user.lastname}}" type="text" class="form-control" id="lastname" name="lastname" placeholder="Lastname">
                  </div>
                  <div class="form-group">
                    <label for="email">Email address</label>
                    <input value="{{user.email}}" type="email" class="form-control" id="email" name="email" placeholder="Email">
                  </div>
                  <div class="form-group">
                    <label for="password">New password</label>
                    <input type="password" class="form-control" id="password" name="password" placeholder="Password">
                  </div>
                  <div class="form-group">
                    <label for="password-confirm">Confirm your password</label>
                    <input type="password" class="form-control" id="password-confirm" name="password-confirm" placeholder="Password">
                  </div>
                  <input type="submit" value="Submit" class="btn btn-default">
            </form>

Я понятия не имею, как обойти эту ошибку. Я пытался добавить заморозку (true), но это не сработало.

То же самое для отладки, я установил значение true/false, и ничего не изменилось.

Если у кого-нибудь есть советы о том, как решить эту проблему, я был бы очень благодарен!

Благодарю вас!


person blackjak231    schedule 13.11.2015    source источник
comment
Лучшим решением было бы проверить, что новый адрес электронной почты совпадает с пользователем (для данного идентификатора). Если нет, и он уже есть, вы должны показать ошибку.   -  person Davide Pastore    schedule 14.11.2015
comment
Привет Давиде, спасибо за ваш ответ! На самом деле я пытался сохранить использование равных в RedBean. Но благодаря вам я фактически вернулся к тому, как работает функция. Что было не так, так это то, что тип искомого компонента и нового компонента (обновленного) не были одинаковыми: существующий тип был «Пользователи» (заглавные буквы), а новый — «пользователи». Глупая ошибка, которая теперь исправлена. Спасибо за ваш ответ в любом случае!   -  person blackjak231    schedule 15.11.2015


Ответы (1)


На самом деле я решил свою проблему самостоятельно с помощью комментария Давиде, который породил идею. Это была глупая ошибка: функция equals() из RedBean на самом деле проверяет тип компонента, и именно здесь была проблема.

Один из моих bean-компонентов имел тип «Пользователи» (с заглавными буквами), а другие «пользователи» (без заглавных букв), которые вызывали исключение.

Спасибо Давиде за искру! :)

person blackjak231    schedule 14.11.2015