iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 8
0
Modern Web

React.js & Laravel 30天訓練系列 第 8

【Day 8】A Part of implementation of Service in Laravel

今天要在 Laravel 主要做幾件事情

  1. 登入後去對 使用者 Table 做已經登入的紀錄 (Insert)
  2. 登入後去修改 使用者 目前登入的公司ID (Update)
  3. 忘記密碼的時候 可以去寄信的功能
  4. 強化原本的登入方法,除了可以拿Json Web Token 以外,還可以拿取部分資料

OK 那就開始囉

首先,我把我對資料庫的動作都提到 Service 這一層去做
以前,我在寫.Net 的時候 也有類似的架構 但是我覺得so so

Laravel 這樣的規劃 我覺得簡單很多
就當作直接對 類別的方法去呼叫就可以了

看一下我們Service開的樣子吧
現在先做了兩個 LogService & UserInfoService
https://ithelp.ithome.com.tw/upload/images/20171226/201077678u28r45f4O.png

好,然後,當然你自己要先用 artisan 把你的Model建立起來

php artisan meke:model ???/???/{Your Model Name}

當然別忘了該指定的東西自己指一指

public function __construct()
{
    // 指定告訴Laravel 要對應哪一個Table
    $this->setTable("XXX");
    // XXX 就是你資料庫Table的名稱
}

再來我們來看我們寫的Service Insert 紀錄

<?php namespace App\Services\Log;

use \App\Http\Models\SysLoginLog;

class LogService
{
	public function InsertUserLoginLog($_compID, $_userID, $_userIP, $_userBrowser, $_userDevice, $_loginStatus)
	{
		$IsSuccess = false;
		$Message= "";

		$newLoginLog = new SysLoginLog;
		$newLoginLog->CompID = $_compID;
		$newLoginLog->UserID = $_userID;
		$newLoginLog->loginTime = date('Y-m-d H:i:s');
		$newLoginLog->userIP = $_userIP;
		$newLoginLog->userBrowser = $_userBrowser;
		$newLoginLog->userDevice = $_userDevice;
		$newLoginLog->loginStatus = $_loginStatus;

		try {
			$newLoginLog->save();
			$IsSuccess = true;
			$Message = "Success Insert";
		} catch (Exception $e) {
			$Message = $e;
		}

		return [
			'IsSuccess' => $IsSuccess,
			'Message' => $Message
		];
	}
} 

然後,我們要從Controller 去呼叫 我們的Service

$LogService = new LogService;
$RequestResult = $LogService->InsertUserLoginLog($compID, $userID, $userIP, $userBrowser, $userDevice, $loginStatus);

最後,是你的 routes.php
同樣的,你自己要去思考 哪些是要驗證Token 哪些不需要
像是 set_user_default_compid & set_user_loginlog 都是需要有登入時候再來做的

Route::group(['middleware' => 'jwt.auth'], function () {
    // Route::post('get_user_details', 'AuthController@get_user_details');  // 測試用方法
    Route::post('set_user_default_compid', 'AuthController@set_user_default_compid'); // 更改登入預設公司ID
    // 正式方法Log部分
    Route::group(['prefix' => 'log'], function(){
        Route::post('set_user_loginlog', 'LogApiController@set_user_loginlog'); // 寫入登入紀錄 
    });
});

拍一下POSTMAN 跑起來的樣子
https://ithelp.ithome.com.tw/upload/images/20171226/201077672qBZDVfA21.png

這樣我們就做完一個API的功能了

再來看一下比較不一樣的 寄信功能
首先 我們使用mailgun 去做寄信的功能

先看你的 /config/mail.php
我的部分都是吃 .env檔案

MAIL_DRIVER=mailgun
MAIL_HOST=smtp.mailgun.org
MAIL_PORT=587
MAIL_USERNAME=postmaster@xxx.xxx.xxx
MAIL_PASSWORD=???
MAIL_ENCRYPTION=

填好這邊 再來是你的 /config/service.php

'mailgun' => [
    'domain' => 'xxx.xxx.xxx',// 你UserName @ 後面的部分
    'secret' => '???',//你的API KEY
],

最後就是在 controller 裡面來做寄信的動作囉,別忘了在最上面要先
use Mail;
use View; -> 用來載入Email的客製模板

$set = [];
$set['view'] = 'emails.ForgotPwd'; // 這個路徑就在你的view底下 view/email/ForgotPwd.blade.php
$set['fromEmail'] = 'support@???.com.tw';
$set['fromName'] = 'Succmail|客服人員';
$set['to'] = $email; //測試用
$set['to_name'] = 'Succmail|忘記密碼用戶';
$set['subject'] = '忘記密碼通知信|Succmail';

$data = [
    'verifyLink' => "xxx.xxx.xxx?email=".$email
];

$mailResult = Mail::send( $set['view'], ['data' => $data], function ($m) use ( $set ) {
        $m->from($set['fromEmail'], $set['fromName'])->to($set['to'], $set['to_name'])->subject( $set['subject'] );
});

https://ithelp.ithome.com.tw/upload/images/20171226/201077675fUOOE5uwR.png

打開信箱就會收到囉~

這樣你就可以有後端的東西可以試著去呼叫了!!


上一篇
【Day 7】Semantic UI in React.js by NPM
下一篇
【Day 9】A Part2 of implementation of Service in Laravel
系列文
React.js & Laravel 30天訓練30

尚未有邦友留言

立即登入留言