Laravel On IBM Cloud(+ Laravelの良いところ紹介)

## 始めに
この投稿内容8/1に開催されたbmxug.tokyo 始めに
この投稿内容は7/4に開催されたbmxug.tokyo これから始めるPaaS開発相談会([connpass](https://bmxug.connpass.com/event/94157/))でお話しした内容です。 

先日、Qiitaでも書いた`Laravel`を`IBM Cloud`へデプロイする方法を紹介するとともに、`Laravel`ってこんなところ便利だよ！という情報を共有させてもらいました。

## IBM Cloudへのデプロイ方法について
基本的には、[以前の記事(IBM CloudにLaravelをデプロイする方法)](https://qiita.com/motuo/items/b7d1fdf297349daca9fd)に書いてある通りですが、勉強会では下記の様な話題が出ました。

* **現在のLTSバージョンは、5.5となるので、本番で使うLaravelのバージョンは特段の理由が無い限り、5.5としましょう。**

具体的には、

```
laravel new testProject
```

としてしまうと、現状は5.6がインストールされてしまうので

```
composer create-project "laravel/laravel=5.5.*" testProject
```

とするのが良いと思います。

* 以前の記事に書いてある、manifest.ymlのbuildpackの指定は無くても良いようです。<br>デフォルトのbuildpackとgitのbuildpackのバージョンは若干異なるようですので、特段の理由がない場合はbuildpackを指定しなくても良いでしょう。(By @tokida)

ちなみに、2018/8/2時点では、gitの最新リリースバージョンが(4.3.58)[※参照](https://github.com/cloudfoundry/php-buildpack)で、IBM Cloudのbuildpackは4.3.59がデフォルトで採用されるみたいです。言語によってはこのバージョンの差がかなり大きかったり、Node等ではIBM Cloud側にDebug用の機能が含まれていたりするそうなので、buildpackに何を採用するかは意識した方が良さそうです。
![buildpacks.png](https://qiita-image-store.s3.amazonaws.com/0/154110/059962e5-afa8-59cc-ab19-58e6c77cf24e.png)

**Buildpack確認コマンド**

```
ibmcloud cf buildpacks
```

また、当日はあまり紹介できませんでしたがGithubやPipelineと連動させた自動デプロイ等も簡単に実現できるので、興味がある方はこちらの記事も見てみると面白いと思います。
[IBM Cloudのツールチェーンを使って快適なDevOpsを実現する。(Laravel)](https://qiita.com/motuo/items/ccbcde97571ded58c2ad)

## Laravelってこれが便利だよ！集

`IBM Cloud`だけではなく、こちらの話でもかなり盛り上がったのでいくつか紹介します。
### 仕組(書き方)
#### ルーティングが便利
リクエスト単位で呼び出す処理を定義できる`Route`が非常に便利です。
この様に、getやpostで呼び出すControllerやメソッドを定義したり、

```php
Route::get('/main', 'MainController@index')->name('main');//初期表示
Route::post('/main', 'MainController@search')->name('search');//検索
Route::post('/main/csvDownload', 'MainController@csvDownload')->name('csvDownload');//CSVダウンロード
```

簡単な物であれば、Controllerとセットで

```php
Route::resource('test', 'TestController',['only'=>['index','store']]);
```

なんて使い方をすることが出来ます。

(参考資料)
・[ルーティング](https://readouble.com/laravel/5.5/ja/routing.html)
・[コントローラ](https://readouble.com/laravel/5.5/ja/controllers.html)

#### ORMが便利
CRUDの基本的な物や他のテーブルとのリレーションを簡単に定義する事が出来ます。また、
コマンドラインより

```php
php artisan make:model Test -a
```

と打つと、それに紐づく`Migration`(テーブル定義)、`Model`、`Contorller`が自動生成されるので便利です。

(参考資料)
・[モデル](https://readouble.com/laravel/5.5/ja/eloquent.html)

#### サービスコンテナが便利
インターフェースと実装の結合が簡単に出来るところです。例えば`Controller`から何らかの機能を呼び出したいときでも、インターフェースに依存させるだけで処理を組み上げることが出来ます。
こうする事で、クラス同士を疎結合にしてテストをしやすくしたり、変更に強いプログラムを作る事が出来ます。

具体例を挙げると長くなるので、詳しくは書けませんが「Laravel DI」とかでググるとたくさんの資料が見つかります。

(参考資料)
・[サービスコンテナ](https://readouble.com/laravel/5.5/ja/container.html)

#### Viewが便利
Laravelには`blade`というシンプルかつ、強力なテンプレートが付いています。
UIの部品をコンポーネント化したり、簡単な分岐やループをサクサク書ける点が素敵です。
`Vue`等と併用する事も出来ます。
`PHP`で書かれたレガシーなコードそのまま貼り付けて動かす事も出来ます。が、折角`Laravel`を使うのであれば
きちんとbladeで処理を書くことをお勧めしますw。

(参考資料)
・[Bladeテンプレート](https://readouble.com/laravel/5.5/ja/blade.html)

### ライブラリ
既に多くのライブラリが存在しています。いくつか、話題になったものを残しておきます。
ちなみに、[packalyst](https://packalyst.com/)には多くのライブラリがあるので、困った時にはまずこちらを探すようにしましょう。

#### laravel-debugbar
Laravelのデバッグ用のライブラリです。メモリ使用量やレスポンスまでの時間、発行したクエリなどをブラウザで見えるようにしてくれるので開発時には必須のライブラリと言えるでしょう。

(参考資料)
・[github](https://github.com/barryvdh/laravel-debugbar)

#### Laravel-Excel
LaravelでExcelファイルを読み込んだり、書き出したりすることのできるライブラリです。
Excelに関する需要は多いので、有用なのではないでしょうか。

(参考資料)
・[github](https://github.com/Maatwebsite/Laravel-Excel)

#### CHARTS
Blade上に簡単にグラフなどを表現する事の出来るライブラリです。UIでグラフを出すと良く喜ばれますw

(参考資料)
・[github](https://github.com/ConsoleTVs/Charts)

#### Admin LTE
@ssakaigawaさんの紹介で取り上げて貰いました。簡単に管理画面を構築できるライブラリです。
・[github](https://github.com/jeroennoten/Laravel-AdminLTE)

### テスト

#### Dusk
会場が若干、ざわめいた(様な気がする)自動ブラウザテスト用の機能が用意されています。
デフォルトではGoogle Chromeのドライバーが必要なのですが、上手く使えばIBM CloudのCI/CDとの連携も出来るかもしれません。

(参考資料)
・[ブラウザテスト](https://readouble.com/laravel/5.5/ja/dusk.html)

phpunitも同梱されているので、テストも容易に始められるのがLaravelの素敵なところだと思います。

## 最後に

次回の勉強会は9月5日の予定です！  
Laravelに限らず、IBM Cloudを使った仕組を考えたり、有識者の意見を聞ける場になりますので、ご都合合う方は[bmxugのConnpass](https://bmxug.connpass.com/)をチェックしてみてくださいね。