Ошибка 404 при отправке формы пользователя в registrationController laravel - PullRequest
6 голосов
/ 10 апреля 2020

Я получаю ошибку 404 при попытке вставить данные пользователя в несколько таблиц во время регистрации моей модели пользователя:

<?php

namespace App;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Facades\Hash; 


class User extends Authenticatable
{
    use Notifiable;
    use HasRoles;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'username','accno', 'email', 'password', 'role', 'status', 'activation_code'
     ];

     protected $guarded = [];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    // a mutator for the email attribute of our model with email validation check and check to avoid duplicate email entries.

    protected $table = 'users';

    public $timestamps = false;

    public $incrementing = false;

    public function setEmailAttribute($email)
    {
        // Ensure valid email
        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            throw new \Exception("Invalid email address.");
        }

        // Ensure email does not exist
        elseif (static::whereEmail($email)->count() > 0) {
            throw new \Exception("Email already exists.");
        }

        $this->attributes['email'] = $email;
    }

    public function setPasswordAttribute($password)
    {
        $this->attributes['password'] = Hash::make($password);
    }

    public function profiles()
    {
        return $this->hasOne(profiles::class);
    }

    public function accounts()
    {
        return $this->hasOne(accounts::class);
    }

    public function transactions()
    {
        return $this->hasMany(transactions::class);
    }
}

Я пытаюсь рефакторинг, отделив мой код проверки от моих логи c с помощью RegisterUserTrait

<?php

namespace App\Traits;

use App\User;
use App\Profile;
use App\Account;
use Keygen;

trait RegisterUser
{
    public function registerUser($fields)
    {   


            $user = User::create([

                'username'      => $fields->username,
                'accno'        =>  $this->generateAccountNumber(),
                'email'      => $fields->email,
                'password'  => $fields->password = bcrypt(request('password')),
                'roles'  => $fields->roles,
                'activation_code' =>  $this->generateToken()
            ]);

            Profile::create([
                'accno' => $user->accno,
                'username' => $user->username,
                'acc_type'      => $fields->acc_type,
                'firstname'      => $fields->firstname,
                'lastname'      => $fields->lastname,
                'nationality'     => $fields->nationality,
                'occupation'     => $fields->occupation,
                'address'     => $fields->address,
                'city'     => $fields->city,
                'state'     => $fields->state,
                'zipcode'     => $fields->zipcode,
                'phoneno'     => $fields->phoneno,
                'dob'     => $fields->dob,
                'gender'     => $fields->gender,
                'martial_status'     => $fields->martial_status,
                'user_image'     => $fields->user_image,
            ]);

            Account::create([
                'accno' => $user->accno,
                'username' => $user->username,
            ]);

            return $user;

    }

затем сохраняем данные с помощью моего контроллера регистрации:

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use App\Http\Requests\RegistrationRequest;
use App\Traits\RegisterUser;

class RegistrationController extends Controller
{
    use RegisterUser;

    public function show()
    {
        return view('auth/register');
    }

    public function register(RegistrationRequest $requestFields)
    {
      //calling the registerUser method inside RegisterUser trait.
      $user = $this->registerUser($requestFields);

      return redirect('/login');


     }
}

, но когда я регистрирую пользователя, данные сохраняются только в create_user_table и возвращают ошибку 404 страницы не найдена, пожалуйста Мне нужна помощь, чтобы сохранить данные в выбранной таблице и перенаправить на страницу входа.

Ответы [ 6 ]

3 голосов
/ 17 апреля 2020

Насколько я понимаю, это не так для отношений с внешним ключом в пользовательской модели

public function profiles()
{
    return $this->hasOne(profiles::class);
}

public function accounts()
{
    return $this->hasOne(accounts::class);
}

public function transactions()
{
    return $this->hasMany(transactions::class);
}

, это должно быть следующим образом:

public function profiles()
{
    return $this->hasOne(Profile::class);
}

public function accounts()
{
    return $this->hasOne(Account::class);
}

public function transactions()
{
    return $this->hasMany(Transaction::class);
}
0 голосов
/ 18 апреля 2020

create() метод используется для массового присвоения. вам необходимо указать атрибут fillable или guarded для модели. Так что проверьте атрибут fillable на Profile и Account Model.

0 голосов
/ 18 апреля 2020

Ошибка 404 часто является проблемой с маршрутом.

В соответствии с просьбой Кристоса Литраса в комментарии нам нужно увидеть ваш routes/web.php и вывод php artisan route:list для проверки.

Я считаю, что перенаправление в вашем registrationController не указывает на действительный URL:

return redirect('/login');

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

return redirect()->route('login');

Пожалуйста, поделитесь файлом маршрутов для подтверждения.

0 голосов
/ 14 апреля 2020

Попробуйте это в вашей пользовательской модели

 protected static function boot()
 {

    protected static function boot() 

    parent::boot(); 
    static::created(function ($user){
        $user->profiles()->create([
            'accno' => $user->accno,
            'username' => $user->username,
             .... => ....

        ]);

        $user->accounts()->create([
            'accno' => $user->accno,
            'username' => $user->username,

        ]);


    });


}
0 голосов
/ 14 апреля 2020

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

интерфейс журнала существует в панели администратора voyager в: Инструменты => Компас => Логи

посмотрите на это изображение:

enter image description here

0 голосов
/ 10 апреля 2020

Попробуйте это

public function registerUser($fields)
    {   


            $user = User::create([

                'username'      => $fields->username,
                'accno'        =>  $this->generateAccountNumber(),
                'email'      => $fields->email,
                'password'  => $fields->password = bcrypt(request('password')),
                'roles'  => $fields->roles,
                'activation_code' =>  $this->generateToken()
            ]);

            $user->userprofile =Profile::create([
                'accno' => $user->accno,
                'username' => $user->username,
                'acc_type'      => $fields->acc_type,
                'firstname'      => $fields->firstname,
                'lastname'      => $fields->lastname,
                'nationality'     => $fields->nationality,
                'occupation'     => $fields->occupation,
                'address'     => $fields->address,
                'city'     => $fields->city,
                'state'     => $fields->state,
                'zipcode'     => $fields->zipcode,
                'phoneno'     => $fields->phoneno,
                'dob'     => $fields->dob,
                'gender'     => $fields->gender,
                'martial_status'     => $fields->martial_status,
                'user_image'     => $fields->user_image,
            ]);

             $user->useraccount = Account::create([
                'accno' => $user->accno,
                'username' => $user->username,
            ]);

            return $user;

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