【问题标题】:Laravel, first user is only userLaravel,第一个用户是唯一的用户
【发布时间】:2021-03-03 17:32:20
【问题描述】:

我正在建立一个供个人使用的 Laravel 网站,我想让第一个在该网站上注册的用户成为唯一的用户。因此,在安装了 ui 的全新 Laravel 安装、迁移排序且没有用户注册的情况下,我希望注册路由可以访问。但是如果有注册用户,就屏蔽注册路由,只允许登录路由可达。

我可以在 web.php 中做这样的事情

Route:get('/register', function () {...})->auth();

但我必须在我第一次创建用户后这样做。我宁愿以更可控的方式来做。

编辑


我不怀疑@yves-kipondo 的答案是更正确的选择,如果我要为其他人创建这个。

我采用的解决方案很简单。在我的注册控制器中,我只需在构造函数中添加一个检查,如果已经有用户返回 404。

public function __construct() {
  if (!User::all()) {
    $this->middleware('guest');
  } else {
    abort(404);
  }
}

【问题讨论】:

  • web.php 是一个.php 文件,您可以在其中添加逻辑/PHP 代码。检查是否有用户,如果没有,注册路由
  • @kerbh0lz 我建议改用中间件。 web.php 文件在每个请求上都会被调用,即使请求是针对完全不同的路由并且这会导致查询被不必要地执行。我相信使用您的策略将不再可能缓存路由文件。
  • @dan 可以缓存它,但您必须在创建用户后缓存它,以便满足条件并且它不会添加路由......缓存将删除附加查询每个请求...但是有不同的方法可以解决这个问题
  • 方法有很多。 1.注册用户删除路由Auth::routes();后,您将无法再注册。 2、修改app\Http\Controllers\Auth\RegisterController.php中RegisterController的代码,修改函数create:protected function create(array $data) { if (User::find(1)->count() == 0) return User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => bcrypt($data['password']), ]); return null; }
  • 如果这只是供您使用,我将根本没有注册系统,并自己添加用户或编写命令以交互方式创建该用户

标签: php laravel laravel-7


【解决方案1】:

您可以创建一个将在register 路由上注册的中间件

<?php

namespace App\Http\Middleware;

use Closure;

class RegisterOnce
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (User::count() !== 0) {
            // you can redirect wherever you want 
            return redirect('home');
        }

        return $next($request);
    }
}

之后,您可以在app/Http/Kernel.php 中注册中间件,方法是在所有已注册的路由中间件之后添加这一行,如下所示

protected $routeMiddleware = [
    \\ ... previous registered middleware

    'once' => App\Http\Middleware\RegisterOnce::class,
];

您可以在routes/web.php 文件中像这样自定义register 路由 这将替换Auth::routes() 设置的默认值;

Route::get('register', [App\Controllers\Auth\RegisterController::class, 'showRegistrationForm'])
    ->name('register')
    ->middleware('once');

【讨论】:

    猜你喜欢
    • 2021-03-08
    • 2017-11-02
    • 2020-09-01
    • 2018-01-07
    • 2016-01-02
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    相关资源
    最近更新 更多