筆記一下 Login 後記錄用戶資訊的實作,這次使用 Laravel 的 Event
…migrations & ..model
Schema::create('login_logs', function (Blueprint $table) { $table->id(); $table->string('subject_type')->index('subject_type')->comment('用戶類型: Admin、User'); $table->unsignedInteger('subject_id')->index('subject_id')->comment('用戶ID'); $table->string('ip')->nullable()->comment('登入IP'); $table->string('login_type')->nullable()->comment('登入方式: direct、FB、Google'); $table->timestamp('login_at')->useCurrent()->comment('登入時間'); });
app/Providers/EventServiceProvider.php
LoginEvent::class => [ LoginLogProcessed::class, ],
app/Events/LoginEvent.php
<?php namespace App\Events; use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; class LoginEvent { use Dispatchable, InteractsWithSockets, SerializesModels; /** * @var Admin|User */ public $user = ''; /** * @var String */ public $userType = ''; /** * @var String */ public $loginType = ''; /** * @var String */ public $ip = ''; /** * @param Admin|User $user * @param String $loginType * @param String $ip */ public function __construct($user, String $loginType, String $ip) { $this->user = $user; $this->userType = get_class($user); $this->loginType = $loginType; $this->ip = $ip; } }
app/Listeners/LoginLogProcessed.php
<?php namespace App\Listeners; use App\Services\LoginLogService; use App\Events\LoginEvent; use Illuminate\Contracts\Queue\ShouldQueue; class LoginLogProcessed implements ShouldQueue { /** * The name of the queue the job should be sent to. * * @var string|null */ public $queue = 'login.listeners'; /** * LoginLogService variable * * @var App\Services\LoginLogService */ protected $loginLogService; /** * Create the event listener. * * @return void */ public function __construct( LoginLogService $loginLogService ) { $this->loginLogService = $loginLogService; } /** * Handle the event. * * @param LoginEvent $event * @return void */ public function handle(LoginEvent $event) { $this->loginLogService->create([ 'subject_type' => $event->userType, 'subject_id' => $event->user->id, 'ip' => $event->ip, 'login_type' => $event->loginType, 'login_at' => now() ]); } }
app/Services/LoginLogService.php
<?php namespace App\Services; use App\Repositories\LoginLogRepository; use Ihero\Generator\Exceptions\RuntimeException; class LoginLogService { /** * LoginLogRepository variable * * @var App\Repositories\LoginLogRepository */ protected $loginLogRepository; /** * __construct * * @param LoginLogRepository $loginLogRepository */ public function __construct(LoginLogRepository $loginLogRepository) { $this->loginLogRepository = $loginLogRepository; } /** * * @param Array $input * @return void */ public function create(Array $input) { $this->loginLogRepository->create($input); } }
app/Repositories/LoginLogRepository.php
<?php namespace App\Repositories; use App\Models\LoginLog as Model; use Ihero\Generator\Repositories\Repository; class LoginLogRepository extends Repository { /** * The table model. * * @var Model $model */ protected $model; /** * __construct * * @param Model $model */ public function __construct(Model $model) { $this->model = new \ReflectionClass($model); } }
運用
event(new LoginEvent($user, 'direct', request()->ip()));
php artisan queue:work --queue=login.listeners --timeout=3600 --memory=1024 --daemon