更新 AuthController 时出现 NotFoundHttpException

NotFoundHttpException when updating AuthController

访问 POST:http://localhost:8000/auth/register 时出现 NotFoundHttpException。当我更新 AuthController 验证器和创建方法时出现此错误。使用默认的 AuthController 没有错误,但数据未存储在数据库中

AuthController

namespace App\Http\Controllers\Auth;

use App\User;
use Validator;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;

class AuthController extends Controller
    use AuthenticatesAndRegistersUsers, ThrottlesLogins;

    public function __construct()
    {
        $this->middleware('guest', ['except' => 'getLogout']);
    }
    protected function create(array $data)
    {
        return User::create([
            'lastname' => $data['lastname'],
            'firstname' => $data['firstname'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
        ]);
    }

    protected function validator(array $data)
    {
        return Validator::make($data, [
            'firstname' => 'required|max:255',
            'lastname' => 'required|max:255',
            'email' => 'required|email|max:255|unique:users',
            'password' => 'required|confirmed|min:8',
        ]);
    }
}

路线

Route::post('auth/register', 'Auth\AuthController@postRegister');

用户模型

namespace App;

use Illuminate\Auth\Authenticatable;
use Jenssegers\Mongodb\Model as Eloquent;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Foundation\Auth\Access\Authorizable;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

class User extends Eloquent implements AuthenticatableContract,
                                AuthorizableContract,
                                CanResetPasswordContract
{
    use Authenticatable, Authorizable, CanResetPassword;
    protected $collection = 'users_collection';
    protected $fillable = ['firstname', 'lastname', 'email', 'password'];
    protected $hidden = ['password', 'remember_token'];

    public function websites(){
        return $this->hasMany('App\Website');
    }
}

路线列表 http://pastebin.com/Xq24AQLK

Htaccess

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ / [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

我的 AuthController 中有一个 $redirectTo 属性,在成功登录后覆盖默认重定向:

class AuthController extends Controller {

    use AuthenticatesAndRegistersUsers, ThrottlesLogins;

    public $redirectTo = '/';
    protected $loginPath = '/account/login';
    ...

我不确定它是 $redirectTo 还是 $redirectPath(至少根据文档,我在我的项目中找不到这个)

Further Reading

正如我在评论中提到的那样,根据你的评论提到用户实际上是在数据库中注册的,所以要调试问题,让我们看一下 postRegister 的源代码方法:

 /**
 * Handle a registration request for the application.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function postRegister(Request $request)
{
    $validator = $this->validator($request->all());

    if ($validator->fails()) {
        $this->throwValidationException(
            $request, $validator
        );
    }

    Auth::login($this->create($request->all()));

    return redirect($this->redirectPath());
}

我们可以看到,注册后,方法会重定向到redirectPath返回的重定向路径,我们也来看看它的源码:

/**
 * Get the post register / login redirect path.
 *
 * @return string
 */
public function redirectPath()
{
    if (property_exists($this, 'redirectPath')) {
        return $this->redirectPath;
    }

    return property_exists($this, 'redirectTo') ? $this->redirectTo : '/home';
}

正如我们所见,如果未指定 'redirectTo' 属性,该方法默认重定向到 '/home',因此您有两种可能的解决方案:

  1. /home指定路线并快速完成
  2. AuthController中指定'redirectTo'redirectPath属性如下:

AuthController.php

    class AuthController extends Controller
    {
        use AuthenticatesAndRegistersUsers, ThrottlesLogins;
        protected $redirectPath = '/myspecifiedroute';
        ...
        ...

@hamza-ouaghad 的回答是我的问题的正确答案。但是我遇到了另一个问题:我的数据没有存储在我的数据库中。使用 laravel-mongodb 并且您需要在数据模型中有一个唯一字段(如电子邮件)时,您必须创建一个迁移,如:

Schema::create('users_collection', function($collection) {
    $collection->unique('email');
});