Laravel使用Auth注册不起作用

时间:2018-08-08 20:12:25

标签: php laravel registration user-registration laravel-authentication

我正在尝试使用Laravel提供但我不能提供的Auth向用户注册。另外,我正在同一视图(索引)中进行登录和注册。通过按钮,我可以更改视图以登录或注册。所有这些都发生在sidenav

这是我的路线:

//Auth routes
Route::get('/home', 'HomeController@home')->name('home');

Route::view('/', 'layouts/index');

Route::view('/profile', 'layouts/profile');
Route::get('/welcome', 'UserController@getUsers');

    // Authentication Routes
Route::post('/', 'Auth\LoginController@login');
Route::post('/', 'Auth\LoginController@logout')->name('logout');

// Registration Routes...
Route::post('/', 'Auth\RegisterController@create')->name('register');

这是注册视图:

    <button type="button" id="registGoBackButton" class="btn accessButtons goBackButton" style="display:block;"><i class="fas fa-chevron-left"></i></button>
  <div class="row user-view">
    <blockquote  style="margin-top:0px; margin-bottom:30px;"><h3 style="margin-top:0px; margin-bottom:30px;">Register</h3></blockquote>
    <form class="" action="{{ route('register') }}" method="POST">
      @csrf
      <div class="input-field col s6">
        <input name="name" id="registName" type="text" class="validate" required value="">
        <label for="name">{{ __('Name') }}</label>
      </div>
      <div class="input-field col s6">
        <input name="username" id="registUsername" type="text" class="validate" required value="{{ old('username') }}">
        <label for="username">{{ __('Username') }}</label>
      </div>
      <div class="input-field col s12">
        <input name="email" id="registEmail" type="email" class="validate" required value="">
        <label for="email">{{ __('Email') }}</label>
      </div>
      <div class="input-field col s12">
        <input name="password" id="registPassword" type="password" class="validate" required>
        <label for="password">{{ __('Password') }}</label>
      </div>
     <button class="col s4 btn waves-effect #00796b teal darken-2" type="submit" name="action" style="margin-top:30px;">Submit
        <i class="material-icons"></i>
      </button>
    </form>
  </div>

这是我的注册管理员:

<?php

namespace App\Http\Controllers\Auth;

use App\User;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\RegistersUsers;

class RegisterController extends Controller
{

    use RegistersUsers;

    /**
     * Where to redirect users after registration.
     *
     * @var string
     */
    protected $redirectTo = 'welcome';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest');
    }

    /**
     * Get a validator for an incoming registration request.
     *
     * @param  array  $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => 'required|string|max:255',
            'username' => 'required|string|max:225|unique:users',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:6|confirmed',
        ]);
    }

    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return \App\User
     */
    protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'username' => $data['username'],
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
        ]);
    }
}

2 个答案:

答案 0 :(得分:2)

该问题归因于控制器操作。您的表单应该发布到<a>函数而不是<button>函数。因此,只需将您的路线更改为:

RegisterController@register

如果您查看自己的create(),您会发现它包含// Registration Routes... Route::post('/', 'Auth\RegisterController@register')->name('register'); 特征,其中包含RegisterController方法:

RegistersUsers

答案 1 :(得分:0)

不确定为什么在array $data方法中使用create,但是如果替换

protected function create(array $data)

使用

protected function create(Request $request)

另外,请确保拥有

use Illuminate\Http\Request;

在控制器顶部,然后使用

return User::create([
  'name' => $request->input('name'),
  'username' => $request->input('username'),
  'email' => $request->input('email'),
  'password' => Hash::make($request->input('password')),
]);

代替$data['{variable}']

由于您的POST路由已挂接,它会自动将Request对象发送到处理它的方法,但是您将其声明为数组并无法正确访问。

此外,由于没有路由连接,因此当前protected function validate()还没有被调用。将其移至create()

protected function create(Request $request){

  $this->validate($request->all(), [
    'name' => 'required|string|max:255',
    'username' => 'required|string|max:225|unique:users',
    'email' => 'required|string|email|max:255|unique:users',
    'password' => 'required|string|min:6|confirmed',
  ]);
  ...
}

旁注:看起来应该是通过Route::resource()连接的资源控制器,但我不确定。我不亲自使用它们。

完整的RegisterController如下:

<?php

命名空间App \ Http \ Controllers \ Auth;

use App\User;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Illuminate\Http\Request;

class RegisterController extends Controller {
    protected function create(Request $request){
        $this->validate($request->all(), [
            'name' => 'required|string|max:255',
            'username' => 'required|string|max:225|unique:users',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:6|confirmed',
        ]);

        $user = User::create([
            'name' => $request->input('name'),
            'username' => $request->input('username'),
            'email' => $request->input('email'),
            'password' => Hash::make($request->input('password')),
        ]);

        return back()->with(["status" => "success", "message" => "User Created!");
        // Accessible on the frontend via `session()->get("message", "");`
    }
}