ホームページ > PHPフレームワーク > Laravel > Laravelの登録リファクタリングの詳しい説明

Laravelの登録リファクタリングの詳しい説明

藏色散人
リリース: 2020-11-18 15:15:21
転載
1967 人が閲覧しました

以下は、Laravel フレームワーク チュートリアルのコラムからの Laravel 登録再構築の紹介です。それ!

Laravelの登録リファクタリングの詳しい説明

バックエンドコンテンツ管理システムを構築するにはlaravelを使用する必要がありますが、laravelのデフォルトのログイン登録では現在のニーズを満たすことができません
登録すると、バックエンドで使用されます。電子メール アドレスを使用して登録する必要はありません。登録中にいくつかの追加構成を入力する必要があります。

1. 最初にユーザー登録のルートを決定します

laravel をインストールすると、デフォルトで生成される登録はメールで登録され、いくつかのオプションは必須ではありませんが、いくつかは必須ですいくつかのフォーム オプションを追加します。
登録する場合、気軽に登録することはできません。一部のスーパー管理者のみが登録できます。
最初に、最後に作成された UserController を設定に使用します。そうでない場合は、 # を使用できます。 ##php 職人 make:controller UserController コントローラー クラスを作成します そして 2 つのルートを作成します
Route::get('register', 'UserController@getRegister')andRoute ::post('register', 'UserController@postRegister')前者は、登録されたページを表示するための get リクエストであり、その後にアカウントを登録するための post リクエストが続きます。

2. 登録済みアカウント ページを表示します

これは

getRegister メソッドを使用します。このメソッドはビューを表示するだけなので特別なロジックはありません

    public function getRegister()
    {
        return view('auth.register');
    }
ログイン後にコピー
3. アカウントの登録リクエスト

これは

postRegisterこのメソッドを使用しますアカウントの登録はパスワードのリセットと同じですが、それ以上です。アカウント登録よりも簡単。
ユーザー レコードをデータベースに挿入するときは、
User::create($data) を使用して挿入できます。 #$data
は、各フィールドのキーと値を格納する配列です。<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">    public function postRegister(Request $request)     {         $rules = [             'username'=&gt;'required|unique:finance_enewsuser',             'password' =&gt; 'required|between:6,20|confirmed'         ];         $messages = [             'required'=&gt;':attribute不能为空',             'unique'=&gt;'用户名已被注册',             'between' =&gt; '密码必须是6~20位之间',             'confirmed' =&gt; '新密码和确认密码不匹配'         ];         $username = $request-&gt;input('username');         $password = $request-&gt;input('password');         $group = $request-&gt;input('group');         $data = $request-&gt;all();         $validator = Validator::make($data, $rules, $messages);         if ($validator-&gt;fails()) {             return back()-&gt;withErrors($validator);         }         $data = [             'username' =&gt; $username,             'password' =&gt; bcrypt($password),             'groupid' =&gt; $group,             'checked' =&gt; 0,             'styleid' =&gt; 1,             'filelevel' =&gt; 0,             'loginnum' =&gt; 0,             'lasttime' =&gt; time(),             'lastip' =&gt; '127.0.0.1',             'truename' =&gt; '',             'email' =&gt; '',             'pretime' =&gt; time(),             'preip' =&gt; '127.0.0.1',         ];         User::create($data); //插入一条新纪录,并返回保存后的模型实例         //如果注册后还想立即登录的话,可以使用$user = User::create($data); Auth::login($user); 进行认证         return redirect('/');     }</pre><div class="contentsignin">ログイン後にコピー</div></div>4。完成した例

UserController

    public function getRegister()
    {
        return view('auth.register');
    }

    public function postRegister(Request $request)
    {
        $rules = [
            'username'=>'required|unique:finance_enewsuser',
            'password' => 'required|between:6,20|confirmed'
        ];
        $messages = [
            'required'=>':attribute不能为空',
            'unique'=>'用户名已被注册',
            'between' => '密码必须是6~20位之间',
            'confirmed' => '新密码和确认密码不匹配'
        ];
        $username = $request->input('username');
        $password = $request->input('password');
        $group = $request->input('group');
        $data = $request->all();
        $validator = Validator::make($data, $rules, $messages);
        if ($validator->fails()) {
            return back()->withErrors($validator);
        }
        $data = [
                    'username' => $username,
                    'password' => bcrypt($password),
                    'groupid' => $group,
                    'checked' => 0,
                    'styleid' => 1,
                    'filelevel' => 0,
                    'loginnum' => 0,
                    'lasttime' => time(),
                    'lastip' => '127.0.0.1',
                    'truename' => '',
                    'email' => '',
                    'pretime' => time(),
                    'preip' => '127.0.0.1',
                ];
        User::create($data); //插入一条新纪录,并返回保存后的模型实例
        return redirect('/');
    }
ログイン後にコピー

register。 Blade

    <form class="login-form" action="{{ url(&#39;/register&#39;) }}" method="post">
        {!! csrf_field() !!}
        <h3 class="font-green">Sign Up</h3>
        @if(count($errors) > 0)
            <p class="alert alert-danger display-hide" style="display: block;">
                <button class="close" data-close="alert"></button>
                <span> {{ $errors->first() }}  </span>
            </p>
        @endif
        <p class="form-group">
            <label class="control-label visible-ie8 visible-ie9">用户名</label>
            <input class="form-control placeholder-no-fix" type="text" autocomplete="off" placeholder="Username" name="username"> </p>
        <p class="form-group">
            <label class="control-label visible-ie8 visible-ie9">密码</label>
            <input class="form-control placeholder-no-fix" type="password" autocomplete="off" id="register_password" placeholder="Password" name="password"> </p>
        <p class="form-group">
            <label class="control-label visible-ie8 visible-ie9">重复密码</label>
            <input class="form-control placeholder-no-fix" type="password" autocomplete="off" placeholder="Repeat password" name="password_confirmation"> </p>
        <p class="form-group">
            <label class="control-label visible-ie8 visible-ie9">用户组</label>
            <select name="group" class="form-control">
                    <option value="1"> 超级管理员 </option>
                    <option value="2"> 管理员 </option>
                    <option value="3"> 编辑 </option>
            </select>
        </p>
        <p class="form-actions">
            <button type="submit" id="register-submit-btn" class="btn btn-success uppercase pull-right">注册</button>
        </p>
    </form>
ログイン後にコピー

5. ミドルウェア -- ユーザーはログインする必要があります

登録が完了したので、あとはユーザーの判断だけです。

必要なアカウント登録は、スーパー管理者権限を持つアカウントのみである必要があります。

この場合、一般的な手順は、
postRegister
メソッドでユーザーの情報を直接確認し、ユーザーがこの権限を満たしているかどうかを確認し、満たしていない場合は他のページにジャンプすることです。 この方法でも問題ありませんが、スーパー管理者と管理者の権限があるため、複数の場所で使用する必要があり、他の場所でも使用されます。 次に、誰かがモデルにメソッドを記述して、将来必要になった場合に直接呼び出すことを考えるでしょう。
この方法も可能ですが、非常に強力で使いやすいlaravelが提供するミドルウェア機能を使用することをお勧めします。ここではミドルウェア機能を使ってみましょう。
バックエンドのコンテンツ管理システムなので、最初にミドルウェアを作成しますが、すべてのページにログインする前にログインする必要があり、ログインしないとログインページにジャンプする機能があります。
マニュアルを確認すると、
php 職人 make:middleware CheckLoginMiddleware
コマンドを使用してミドルウェアを作成できることがわかります。もちろん、同様のファイルをコピーして、同じように変更します。 その後、CheckLoginMiddleware
ミドルウェア ファイルが app/Http/Middleware/ ディレクトリに作成されます。このファイルには handle() メソッドが 1 つだけあります。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">    &lt;?php namespace App\Http\Middleware; use Closure; use Auth; class CheckLoginMiddleware { public function handle($request, Closure $next) { //使用Auth方法,需要引入use Auth;方法 //$request-&gt;is('login')表示请求的URL是否是登录页             //因为我们打算使用全局的,所以,需要把登录页排除,不然会无限重定向             //如果你的登录页不是/login,而是/auth/login的话,就写$request-&gt;is('auth/login')             //并且我们要在请求处理后执行其任务,因为我们需要获取到用户的登录信息             $response = $next($request);             if (!Auth::check() &amp;&amp; !$request-&gt;is('login')) {                 return redirect('/login');             }             return $response;         }     }</pre><div class="contentsignin">ログイン後にコピー</div></div> 内に関数を追加します。このミドルウェアの機能は、ルートが生成された場合、まず

Auth::check()

を使用してユーザーがログインしているかどうかを判断することです。ログインジャンプはありません。ログインページに移動します。 メソッドは記述されていますが、まだ使用できません。このミドルウェアを登録し、ミドルウェアが記述されていて使用できること、および使用範囲がどのようなものであるかをフレームワークに伝える必要があります。 このミドルウェアを登録するための
Kernel.php
ファイルが app/Http/ ディレクトリにあります。これは、このミドルウェアを作成したことをフレームワークに伝えることを意味します。 Kernel.php ファイルには 2 つの配列属性があり、1 つの
$middleware はグローバル使用を意味し、もう 1 つの $routeMiddleware は使用できることを意味します選択的に。 グローバル使用とは、どのページをリクエストしても、このミドルウェアが最初に実行されることを意味します。 どの HTTP リクエストが必要か、およびミドルウェアを実行する必要がある場所を示すために使用することを選択します。 ここのすべてのページでログインが必要な場合は、グローバル ページを登録できます。

\App\Http\Middleware\CheckLoginMiddleware::class
ログイン後にコピー

$middleware 配列属性に追加して登録します。使用


PS: グローバルなものを定義する場合は、特に注意してください。たとえば、上記ではログイン ページを除外する必要があります。そうしないと、ユーザーがログインしていないため、すべてのページがリダイレクトされます。ログインページへ (ログインページを含む)

5. 中间件--特殊页面需要验证用户组

现在是进行用户权限页面的限制,同样我们也要重新创建一个中间件
使用php artisan make:middleware CheckGroupMiddleware创建一个新的中间件,用来判断这个用户是否满足这个权限

    <?php

    namespace App\Http\Middleware;

    use Closure;
    use Auth;

    class CheckGroupMiddleware
    {
        public function handle($request, Closure $next)
        {
            $user = Auth::user();
            if ($user->groupid != 1) {
                return redirect('/');
            }
            return $next($request);
        }
    }
ログイン後にコピー

这里我们还是通过Auth::user()来获取到用户的信息,然后判断用户的组,不属于超级管理员就跳到首页。
然后我们在到app/Http/目录下有个Kernel.php文件是注册这个中间件的,这次我们注册为可以选择的中间件。
这个中间件因为是可以选择的,所以我们还需要给它起个别名,在$routeMiddleware数组属性里加如一条

    'user.group' => \App\Http\Middleware\CheckGroupMiddleware::class
ログイン後にコピー

创建一个可以使用usergroup这个名字使用的中间件。
创建好后,我们可以选择在哪里使用,一个是在router.php的路由文件里加入,一个是在controller里使用
router.php文件里使用

    Route::get('/', ['middleware' => ['user.group'], function () {
        //
    }]);
ログイン後にコピー

在控制器内使用

    $this->middleware('user.group');
ログイン後にコピー

这里我们选择在路由里添加中间件。让注册页面只能是超级管理员才可以注册

    Route::get('register', 'UserController@getRegister')->middleware('user.group');
    Route::post('register', 'UserController@postRegister')->middleware('user.group');
ログイン後にコピー

我们目前只有两个路由要判断权限,所以使用了链式的写法,当然你也可以按照手册里上使用组的方式,组的方式更为优雅。

当然如果你的整个控制器内的方法都需要中间件进行验证过滤的话,你也可以创建组的形式,也可以直接在控制器内使用__construct方法,让每次请求这个控制器时,先执行中间件

    class MyController extends Controller
    {
        public function __construct()
        {
            $this->middleware('user.group');
        }

        public function index()
        {
            return view('my.index');
        }
    }
ログイン後にコピー

以上がLaravelの登録リファクタリングの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:csdn.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート