회원관리 기능을 마무리 짓는중 비번변경 이메일을 보낼때 토큰 만료기능을 구현하고자했다
https://laravel.kr/docs/8.x/scheduling
라라벨 8.x - 작업 스케줄링
라라벨 한글 메뉴얼 8.x - 작업 스케줄링
laravel.kr
당연히 laravel공식문서를 참고했고
공식문서를 보면
php artisan schedule:run 이라는 명령어를 통해 스케줄러를 작동하는데
이를 서버에 입력함으로써 스케줄러가 항상 작동하도록 하는것인데 로컬서버를 사용중인 나는 구글링을 통해 윈10에서 수시로 아티산 명령어를 입력시켜줄수있는 방법을 찾았다
https://wondongho.tistory.com/184
[Laravel] Window10 사용 시 작업 스케줄러 적용하기
라라벨 프레임워크에서는 기본적으로 작업 스케줄러 기능을 제공한다. 기본 개념은 아래 document에서 확인할 수 있다. laravel.kr/docs/8.x/scheduling 라라벨 8.x - 작업 스케줄링 라라벨 한글 메뉴얼 8.x -
wondongho.tistory.com
이 링크를 참고했고 구현해볼것은 매분마다 3분이 지난 토큰 삭제기능과 링크를 눌렀을시 토큰이 만료되었다면 접속하지 못하게하는 기능이다
먼저 토큰 만료시 접속불가기능먼저 구현하였다
public function changePassword(){
$url = explode('/',url()->current());
$token = end($url);
//토큰값이 db에 남아있는지 확인해서 만료된 토큰인지 체크
if(DB::table('password_resets')->where('token', $token)->exists()){
return view('users.update-password',[
'path' => 'update_password'
]);
}
else{
return redirect()->route('main')->with('status', '만료된 url입니다 이메일을 재전송을 요청하십시요.');
}
}
php explode()함수를 이용해서 url에 토큰부분만 분리하고 DB파사드로 토큰테이블에 접속해서 해당 토큰이 존재하는지 exists()로 알아낸다 true/false형태로 반환되며 이에따라 라우팅해준다
이러면 기능은 완성이다 참 간단하다
마지막으로 생성된지 3분이 지난토큰을 매분마다 삭제하는 스케줄러를 작성할것이다
app\Console\Kernel.php경로에 있고
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
// $schedule->command('inspire')->hourly();
}
/**
* Register the commands for the application.
*
* @return void
*/
protected function commands()
{
$this->load(__DIR__.'/Commands');
require base_path('routes/console.php');
}
}
해당 부분에서 schedule()만 작성해주면 된다 먼저 시간계산을 위해 carbon파사드와 db접속을 위해 db파사드를 use해준다
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Carbon;
그리고 schecule()를 작성해주면 된다
protected function schedule(Schedule $schedule)
{
$schedule->call(function () {
//carbon 라이브러리를 활용해서 현재 날짜와 3분뺀 시간을 시간과 날짜로 포맷해서 따로 저장
$date = Carbon::parse(now())->format('Y-m-d');
$time = Carbon::parse(now()->subMinutes(3))->toTimeString();
//현재 날짜랑 같거나 적으며 현재 시간에서 3분뺀 시간보다 적으면 삭제(토큰이 만들어진지 3분뒤랑 같은 연산)
DB::table('password_resets')->whereDate('created_at', '<=', $date)->whereTime('created_at', '<', $time)->delete();
})->everyMinute();
}
now()를 이용해서 현재 시간에서 날짜와 시간은 분리해야한다(db에 created_at과 포맷을 맞추기위함)
그리고 시간을 분리할땐 현재 시간에서 3분을 뺀시간으로 분리한다 (subMinutes(3)로 메서드체이닝)
그 후 DB파사드로 현재 날짜와 같거나 이전이고 3분뺀 시간보다 작다면 삭제(현재 시간에서 3분뺀 것이 생성시간에서 3분뒤나 다름없음)하는 쿼리문을 작성하고 everyMinute();으로 매분 작동시킨다면
잘 작동하는걸 볼수있다
'개발지식 > PHP' 카테고리의 다른 글
| [Laravel] laravel Scout을 이용한 검색(Algolia 연동) (0) | 2022.02.07 |
|---|---|
| [Laravel] laravel seeder 와 factory 사용해보기 (0) | 2022.02.03 |
| [Laravel] 라라벨 이메일 보내기 (0) | 2022.01.21 |
| [Laravel] laravel jetstream 이메일 인증 커스터마이징 (0) | 2022.01.18 |
| [Laravel] javascript로 페이지 이동없이 update구현하기 (0) | 2022.01.13 |