2018/09/06

[Laravel] Form Request

Form Request 建立時預設會產生

// 授權可否使用此Request
public function authorize();

// 驗證規則
public function rules();


另外還有兩個方法可以設定

// 錯誤文字的回應格式,與 lang 下的 validation 合併
public function messages() : array;

// 欄位的顯示名稱,與 lang 下的 validation.attributes 合併
public function attributes() : array;


在 Controller 可以直接使用 validated 拿到 rules 定義的資料

public function update(FormRequest $request)
{
$data = $request->validated();
}


以上的設定方式與以下等效

$data = $request->validate($rules, $messages, $attributes);


不過這樣會讓 Controller 變大,而且沒遵守 SRP

ps.
illuminate\Http\Request::validate 這個 method 是 另外用 Macro 加進去的,
api是找不到的。

SourceCode:
https://github.com/laravel/framework/blob/5.5/src/Illuminate/Foundation/Providers/FoundationServiceProvider.php#L36

2018/09/05

[Laravel] 利用 intended 跳回之前的頁面

有時候需要記錄網址,做完某些事情之後再跳回去。

例如:訪問一個需要登入的頁面,先跳去登入,登入成功後在跳回。

Laravel 原生就有一個

redirect()->intended();

可以做到這件事情

不過你需要記錄你從哪跳來的

session()->put('url.intended', url()->previous());


intended 裡面可以傳入失效的備援網址

redirect()->intended('/');

這樣即使 session.url.intended 失效也會跳回首頁

2018/08/10

Naming convention for Eloquent relation method

Laravel Relation Function Name 如果要使用兩個字時,需要注意命名規則。

習慣上我會使用 camelCase 命名:如

public function mobilePhones () {
    return $this->hasMany(MobilePhone::class);
}

但是直接使用 $user->mobilePhones 去拿資料時,
Eloquent 是不會到 db 抓資料的,
只會給回傳空的 Collection


使用 $user->mobile_phones 會回傳 null

解決方法是採用 snake_case 命名

public function mobile_phones () {
    return $this->hasMany(MobilePhone::class);
}

就可以使用 $user->mobile_phones 抓到資料了

2018/05/20

建置 Gitlab Ci/CD :: CD - 使用 Deployer

Deployer 是一套用途很廣泛的PHP部屬工具,
也有另一套 Laravel 的部屬工具 Ennoy
考量可能有其他的專案可能也需要部屬,我選擇 Deployer 來部屬。

建置 Gitlab Ci/CD :: CD - 準備 QA/Production Server

建立好CI之後,可以接著建置CD。

CD會使用 QA/Prod. Server上的一個使用者 (通常叫他 deployer)
透過 SSH Key 的驗證,直接操作遠端主機進行軟體的部屬。

所以 Server 需要安裝 SSH Server, 跟可以被外接連接的網路。
(可以想作 Gitlab會 SSH 到 Server)

建置 Gitlab Ci/CD :: gitlab-ci.yml


分享我使用的設定檔跟說明,避免我自己忘記XD
https://github.com/Aspertw/laravel_cicd_deployer/blob/stage-test/.gitlab-ci.yml

Gitlab 官方已經為多種環境寫了範例的設定檔,
從範例開始會比較簡單,你可以在這邊找到,包含Laravel

建置 Gitlab Ci/CD :: CI

寫在前面

Gitlab的CI非常簡單,只要在專案建立 .gitlab-ci.yml 設定檔
每次 commit 就會照著設定跑一次。

不過事情還是沒有這麼簡單,
因為Gitlab還需要一個角色來執行這件事情 - gitlab-runner

所以麻煩的點會是在 runner 執行的部分,
runner 又有不同的執行方式 (executor),
官方說明文件有一大塊是在說明 runner 的設定,就知道他有多複雜了。

我是使用 docker 來執行,這樣每次的測試環境都是乾淨的。


建置 Gitlab Ci/CD :: 安裝 Gitlab

自從上一份工作用過CI/CD回不去了,
所以這次要來自己架一套Gitlab做CI/CD。

名詞解釋


  • Gitlab: 一套類似Github的軟體,可以在自己的設備建置如Github的私有服務。
  • CI: Continuous Integration 持續整合,持續的驗證軟體是否正確及產生分析報告等。
  • CD: Continuous Delivery 持續部屬,將驗證完成的軟體自動化發佈到正式伺服器。
  • Deployer: 一套PHP的部屬工具,方便做部屬時要做的指令與環境等。https://deployer.org/
  • Laravel: PHP Framework 也是一套用過就回不去的開發工具。https://laravel.com/

2018/04/28

利用 Home Assistant 打造智慧家庭 :: 串接 BroadLink

BroadLink RM 設備請先利用 e-Control (易控) App 設定完成。

註: BroadLink有兩個APP,分別是易控(e-Control)跟智慧星(IHC)
註2: 建議使用易控設定;國外大神有寫程式可匯出易控APP的資料,如果需要使用RF的就需要先在APP學習後再利用程式匯出。
註3: 以上兩點看不懂沒關系,等碰到問題就知道了 XD



2018/04/26

利用 Home Assistant 打造智慧家庭 :: 安裝

因為懶惰,希望可以躺在床上直接口說開關電燈。
因為懶惰,所以建置智慧家庭。
這篇文要介紹怎麼用簡易的設備架設出來。

使用設備

  • Synology NAS (Docker)
    我是用Docker建置Home Assistant服務,它可以串接各式各樣的服務作為控制中心;除了使用Docker外,也可以使用其他平台架設,詳細請參考官方文件
  • BroadLink RM Pro (紅外線控制設備)
    BroadLink 是中國大陸的設備廠商,專門製造遙控設備,由於起步得早社群支援很高;RM Pro 是有紅外線與RF遙控的發送設備,如只需要紅外線也可以考慮 MINI 版本,兩者價差大約五百台幣。
  • Google Home (Mini)
    Google Assistant 實體設備,可以直接用來語音控制等功能;目前只有幾個地方開賣,我是在日本購買的。
  • Siri
    Apple的語音助理,也可用來控制設備

2018/01/24

[Docker] 使用外部Docker Host來執行吧 (synology, ubuntu)

TL;DR

用了一陣子的Docker,
最近才知道原來執行Container的主機可以不是本機。
原來Docker是Server/Client架構。 Orz...

因為我的主機是Windows 10 Home
沒有Hyper-V可以跑Docker Native
用Virtual Box有時候有些奇怪的問題出現
就想把執行Container的工作丟給真正的Linux主機


Synology Docker

由於Synology有Docker套件可以用
就找了如何連接NAS的Docker來用

在這篇文章找到修改的方法
https://github.com/docker/machine/issues/1200
※修改NAS檔案可能造成悲劇,請小心

修改
/var/packages/Docker/etc/dockerd.json

加入 
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"],







重啟 NAS 的 Docker
$ /var/packages/Docker/scripts/start-stop-status stop
$ /var/packages/Docker/scripts/start-stop-status start
執行 sudo docker version 看是否正常


這樣NAS的部分就結束了

接下來到本機電腦
Linux 用 export DOCKER_HOST=tcp://ip:2375
Windows 用 set DOCKER_HOST=tcp://ip:2375
也可以用環境變數設定

同樣用docker version確認是否一切安好

Ubuntu

Ubuntu我用Raspberry pi 3測完速度很悲劇就砍了
以下是憑印象,如有出入一定是正常的

安裝好的Docker是無法由外部連接的
新增 /etc/systemd/system/docker.service.d/docker.conf 檔案
(docker.service.d 目錄要自己建立)
https://docs.docker.com/engine/admin/#configure-the-docker-daemon

檔案內容
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://ip:2375

重啟Docker Service
$ service docker restart

確認是否安好
$ docker version