> 백엔드 개발 > PHP 튜토리얼 > Laravel 등록 리팩토링 분석

Laravel 등록 리팩토링 분석

不言
풀어 주다: 2023-04-01 07:00:01
원래의
1278명이 탐색했습니다.

이 글은 주로 참고할만한 가치가 있는 Laravel 등록 재구성 분석을 소개합니다. 이제는 모든 사람과 공유합니다. 도움이 필요한 친구들이 참고할 수 있습니다.

때로는 백엔드 콘텐츠 관리 시스템을 구축하기 위해 Laravel을 사용해야 하지만, laravel의 기본값은 다음과 같습니다. 로그인 등록이 현재 요구 사항을 충족할 수 없으므로 Laravel 등록 재구성이 필요합니다. 편집기를 따라 등록 재구성을 수행하는 방법을 살펴보겠습니다.

1. 먼저 사용자 등록을 위한 경로를 결정합니다

laravel을 설치하면 기본적으로 생성된 등록이 이메일로 등록되며 일부 옵션은 필수가 아니며 일부 양식 옵션을 추가해야 합니다

등록하면 임의로 등록할 수 없습니다. 먼저, 지난번에 생성한 UserController를 사용하여 구성합니다. UserController컨트롤러 클래스

를 만든 다음 두 개의 경로 Route::get('register', 'UserController@getRegister')Route: :post('register)를 만듭니다. ', 'UserController@postRegister')<code>UserController进行配置,如果没有的话,可以使用php artisan make:controller UserController创建一个控制器类

然后创建两条路由Route::get('register', 'UserController@getRegister')Route::post('register', 'UserController@postRegister')<br>

前者是显示一个注册的页面get请求,后面是注册账号的post请求。

2. 显示注册账号页面

这个使用的是getRegister这个方法,这个方法只需要显示一个视图所以并没有特别的逻辑

public function getRegister()
{
 return view(&#39;auth.register&#39;);
}
로그인 후 복사

3. 请求注册账号

这个使用的是postRegister这个方法

注册账号的话和重置密码一样,而且比注册账号还要简单点。

我们在往数据库里插入一条用户纪录的时候,可以使用User::create($data)进行插入。

$data是个数组,里面存放了每个字段的键和值

public function postRegister(Request $request)
{
 $rules = [
  &#39;username&#39;=>&#39;required|unique:finance_enewsuser&#39;,
  &#39;password&#39; => &#39;required|between:6,20|confirmed&#39;
 ];
 $messages = [
  &#39;required&#39;=>&#39;:attribute不能为空&#39;,
  &#39;unique&#39;=>&#39;用户名已被注册&#39;,
  &#39;between&#39; => &#39;密码必须是6~20位之间&#39;,
  &#39;confirmed&#39; => &#39;新密码和确认密码不匹配&#39;
 ];
 $username = $request->input(&#39;username&#39;);
 $password = $request->input(&#39;password&#39;);
 $group = $request->input(&#39;group&#39;);
 $data = $request->all();
 $validator = Validator::make($data, $rules, $messages);
 if ($validator->fails()) {
  return back()->withErrors($validator);
 }
 $data = [
  &#39;username&#39; => $username,
  &#39;password&#39; => bcrypt($password),
  &#39;groupid&#39; => $group,
  &#39;checked&#39; => 0,
  &#39;styleid&#39; => 1,
  &#39;filelevel&#39; => 0,
  &#39;loginnum&#39; => 0,
  &#39;lasttime&#39; => time(),
  &#39;lastip&#39; => &#39;127.0.0.1&#39;,
  &#39;truename&#39; => &#39;&#39;,
  &#39;email&#39; => &#39;&#39;,
  &#39;pretime&#39; => time(),
  &#39;preip&#39; => &#39;127.0.0.1&#39;,
 ];
 User::create($data); //插入一条新纪录,并返回保存后的模型实例
 //如果注册后还想立即登录的话,可以使用$user = User::create($data); Auth::login($user); 进行认证
 return redirect(&#39;/&#39;);
}
로그인 후 복사

4. 完成后的示例

UserController

public function getRegister()
{
 return view(&#39;auth.register&#39;);
}

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="" 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> </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方法里直接查出用户的信息,然后查看用户是否满足这个权限,不满足的情况下就跳转到其它页面。

这种方法可以,但是,我们既然有超级管理员和管理员这些权限区分,肯定不止一个地方使用,其它地方也会用到。

然后会有人想到在model里写个方法,以后有需要都可以直接调用。

这个方法也可以,不过,我们推荐使用laravel提供的中间件这个功能,这个功能非常强大,也非常好用。现在我们就使用中间件这个功能。

因为我们是后台内容管理系统,所以,我们首先创建一个中间件,功能是,所有页面进入前,必须是登录状态,否则跳到登录页。

查看手册发现可以使用php artisan make:middleware CheckLoginMiddleware命令创建一个中间件,当然复制一个差不多的文件,改下也是一样的。

然后会在app/Http/Middleware/目录下创建了一个CheckLoginMiddleware中间件文件,里面只有一个handle()方法,我们直接在里面增加我们的功能

<?php

namespace App\Http\Middleware;

use Closure;
use Auth;

class CheckLoginMiddleware
{
 public function handle($request, Closure $next)
 {
  //使用Auth方法,需要引入use Auth;方法
  //$request->is(&#39;login&#39;)表示请求的URL是否是登录页
  //因为我们打算使用全局的,所以,需要把登录页排除,不然会无限重定向
  //如果你的登录页不是/login,而是/auth/login的话,就写$request->is(&#39;auth/login&#39;)
  //并且我们要在请求处理后执行其任务,因为我们需要获取到用户的登录信息
  $response = $next($request);
  if (!Auth::check() && !$request->is(&#39;login&#39;)) {
   return redirect(&#39;/login&#39;);
  }
  return $response;
 }
}
로그인 후 복사

这个中间件的功能是,如果有路由产生,首先使用Auth::check()判断用户是否登录,如果没有登录的跳转到登录页。

方法写好了,但是还不能使用,我们需要注册下这个中间件,告诉框架我们这个中间件写好了,可以使用了,使用的范围是哪里。

app/Http/目录下有个Kernel.php文件是注册这个中间件的,也就是告诉框架,我们写好了这个中间件。

Kernel.php文件里有两个数组属性,一个$middleware表示全局使用,一个$routeMiddleware表示可以选择使用。

全局使用的意思是,不管你请求哪个页面,都会先执行这个中间件。

选择使用表示,需要哪个HTTP请求,要求执行中间件,就在哪个地方执行。

这里每个页面都要求必须登录的话,可定是注册一个全局的,在$middleware

전자는 등록 페이지 get 요청을 표시한 다음 계정 등록을 위한 post 요청을 표시합니다.

2. 등록 계정 페이지 표시

🎜🎜이 메소드는 보기만 표시하면 되므로 특별한 로직이 없습니다🎜🎜🎜
\App\Http\Middleware\CheckLoginMiddleware::class
로그인 후 복사
🎜🎜🎜🎜 🎜3. 계정 등록 요청🎜🎜🎜🎜 postRegister 방식을 사용합니다🎜🎜🎜 계정 등록은 비밀번호 재설정과 동일하며, 계정 등록보다 간단합니다. 🎜🎜🎜사용자 레코드를 데이터베이스에 삽입할 때 User::create($data)를 사용하여 삽입할 수 있습니다. 🎜🎜🎜$data는 각 필드의 키와 값을 저장하는 배열입니다. 🎜🎜🎜register.blade🎜🎜🎜🎜
<?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(&#39;/&#39;);
  }
  return $next($request);
 }
}
로그인 후 복사
로그인 후 복사
🎜🎜🎜🎜🎜5. 미들웨어 – 사용자는 로그인해야 합니다🎜🎜🎜🎜이제 등록이 완료되었으므로 사용자의 판단만 필요합니다. 슈퍼관리자 권한이 있는 계정으로만 계정 등록이 필요합니다. 🎜🎜🎜이 경우 일반적인 절차는 postRegister 메소드에서 사용자의 정보를 직접 확인한 후 사용자가 이 권한을 충족하는지 확인하는 것입니다. 그렇지 않은 경우 다른 페이지로 이동합니다. 🎜🎜🎜이 방법도 괜찮지만, 최고 관리자와 관리자 권한이 있기 때문에 여러 곳에서 사용해야 하고, 다른 곳에서도 사용하게 됩니다. 🎜🎜🎜그러면 누군가는 나중에 필요할 때 직접 호출할 수 있는 모델에 메서드를 작성하는 것을 생각할 것입니다. 🎜🎜🎜이 방법도 가능하지만, laravel에서 제공하는 미들웨어 기능을 사용하는 것이 좋습니다. 이 기능은 매우 강력하고 사용하기 쉽습니다. 이제 미들웨어 기능을 사용해 보겠습니다. 🎜🎜🎜우리는 백엔드 콘텐츠 관리 시스템이기 때문에 먼저 미들웨어를 만듭니다. 이 기능은 모든 페이지에 로그인하기 전에 로그인해야 한다는 것입니다. 그렇지 않으면 로그인 페이지로 이동합니다. 🎜🎜🎜 매뉴얼을 확인하여 php artisan make:middleware CheckLoginMiddleware 명령을 사용하여 미들웨어를 생성할 수 있는지 확인하세요. 물론 비슷한 파일을 복사하여 같은 방식으로 변경해도 됩니다. 🎜🎜🎜그런 다음 handle() 메소드가 하나만 있는 app/Http/Middleware/ 디렉토리에 CheckLoginMiddleware 미들웨어 파일이 생성됩니다. 🎜🎜🎜
&#39;user.group&#39; => \App\Http\Middleware\CheckGroupMiddleware::class
로그인 후 복사
로그인 후 복사
🎜🎜🎜이 미들웨어의 기능은 경로가 생성되면 먼저 Auth::check()를 사용하여 사용자가 로그인했는지 확인하는 것입니다. , 그렇지 않은 경우 로그인은 로그인 페이지로 이동합니다. 🎜🎜🎜메서드가 작성되었지만 아직 사용할 수 없습니다. 이 미들웨어를 등록하고 미들웨어가 작성되어 사용할 수 있다는 것과 사용 범위가 무엇인지 프레임워크에 알려주어야 합니다. 🎜🎜🎜이 미들웨어를 등록하기 위한 app/Http/ 디렉터리에 Kernel.php 파일이 있습니다. 이는 우리가 이 미들웨어를 작성했음을 프레임워크에 알리는 것을 의미합니다. 🎜🎜🎜 Kernel.php 파일에는 두 개의 배열 속성이 있습니다. 하나는 전역 사용을 의미하는 $middleware이고 다른 하나는 선택 사항을 의미하는 $routeMiddleware입니다. 사용 . 🎜🎜🎜전역적으로 사용한다는 것은 어떤 페이지를 요청하든 이 미들웨어가 먼저 실행된다는 의미입니다. 🎜🎜🎜필요한 HTTP 요청과 미들웨어 실행이 필요한 위치를 나타내는 데 사용하도록 선택하세요. 🎜🎜🎜여기의 모든 페이지에서 로그인이 필요한 경우 전역 페이지를 등록하면 $middleware 배열 속성에 🎜🎜🎜
Route::get(&#39;/&#39;, [&#39;middleware&#39; => [&#39;user.group&#39;], function () {
 //
}]);
로그인 후 복사
로그인 후 복사
🎜🎜🎜를 추가하고 등록 후 사용할 수 있습니다. 🎜🎜

>注意:请记住,如果定义全局的要格外小心,比如上面我们要排除登录页,不然因为用户没有登录,所以在哪个页面都会重定向到登录页,当然也包括登陆页

6. 中间件–特殊页面需要验证用户组

现在是进行用户权限页面的限制,同样我们也要重新创建一个中间件

使用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(&#39;/&#39;);
  }
  return $next($request);
 }
}
로그인 후 복사
로그인 후 복사

这里我们还是通过Auth::user()来获取到用户的信息,然后判断用户的组,不属于超级管理员就跳到首页。

然后我们在到app/Http/目录下有个Kernel.php文件是注册这个中间件的,这次我们注册为可以选择的中间件。

这个中间件因为是可以选择的,所以我们还需要给它起个别名,在$routeMiddleware数组属性里加如一条

&#39;user.group&#39; => \App\Http\Middleware\CheckGroupMiddleware::class
로그인 후 복사
로그인 후 복사

创建一个可以使用usergroup这个名字使用的中间件。

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

在router.php文件里使用

Route::get(&#39;/&#39;, [&#39;middleware&#39; => [&#39;user.group&#39;], function () {
 //
}]);
로그인 후 복사
로그인 후 복사

在控制器内使用

$this->middleware(&#39;user.group&#39;);
로그인 후 복사

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

Route::get(&#39;register&#39;, &#39;UserController@getRegister&#39;)->middleware(&#39;user.group&#39;);
Route::post(&#39;register&#39;, &#39;UserController@postRegister&#39;)->middleware(&#39;user.group&#39;);
로그인 후 복사

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

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

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

 public function index()
 {
  return view('my.index');
 }
}
로그인 후 복사

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

Larave如何实现短信注册

위 내용은 Laravel 등록 리팩토링 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿