1. 初めに

購入いただきありがとうございます。

1.1 当書について

Laravelの機能の中でも初心者には理解しづらく、一般に関心も薄いArtisanコマンドとイベントシステム、キューの3コンポーネントについて、チュートリアルを通じて学ぶ電子書籍です。チュートリアルではシンプルなWebサービスの「ハブサイト」を作成します。

ハブサイトとは、IFTTT(イフト)やZapier(ザピエル)のWebサービスのように、別々のWebサイトサービスを結び付けるサービスです。これらのサービスはアプリからの投稿や、定期的にWebサービスをチェックした結果に基づいて、別のサービスに情報を送ります。様々なWebサービスを結びつけ、便利に活用できるのです。起動側のサービスと受け手側のサービスを1対1で結びつけます。

両サイトはユーザー操作が簡単で、利用してみれば使い方は習得できます。ハブサービスがどのようなものであるか概念がつかめない方は、一度使用してみてください。

IFTTTは無料ですが、対応サービスの中には十分に機能を利用していなかったり、古いAPIに対応したままで現状のサービスではうまく動作しなかったりするものがあります。

Zapierは無料で使用できるタスク(2つのサービスを結びつけたもの)が5つしかなかったり、チェック間隔が長かったり、一日当りの実行数の制限が実用にはきつかったりします。ただし現状のWebサービスにきちんと対応しているため有料版を利用すると便利です。

Webサービスはより便利することで利用者を獲得するため、APIを利用し他サービスと連携できるように進化しています。たとえばカレンダーサービスのSunrizeカレンダーは、Google、FaceBook、GitHub、Wunderlistなど多くの「タスク」や「スケジュール」を扱うサービスと連携できます。しかし存在している多くのWebサービスと連携するのは大変です。全てのサービスに対し様々な連携を提供することは無理でしょう。

こうした状況でハブサイトは、さまざまなサービスを「連携」することに特化し運営されています。ユーザーは起点となるサービスと情報の受け手のサービスをペアで登録します。定期的に起点のサービスを調べ、登録した変化が発生したら、受け手側のサービスへ情報を転送します。

最近では、Yahoo Japanからハードとも連携できるmyThingsというサービスもランチされました。本書でも紹介しているチャットサービスのSlackは、日本時間の2015年12月16日に外部との連携サービスをSlackディレクトリーとして、Webに公開し、その拡張性を広く知らしめようとしています。こうした「連携」を提供するサービスはこれからも段々増えていくでしょう。

今回のチュートリアルは、Webページを作成しません。その代わりにLaravelの機能を利用し、最終的に次のような形態でHubサイトを実現します。

  • Webサービスをチェックする機能をコマンドで実装する。
  • 上記チェックコマンドをスケジューラーで定期的に実行する。
  • チェック時、状況をイベントで発行する。
  • イベントとそれを処理するリスナーの組み合わせをLaravelのメカニズムで指定する。
  • リスナーにより、特定のWebサービスに通知する。
  • イベントリスナーをキュー経由で実行してみる。
  • Jobクラスを使用しチェック機能をキュー経由で実行してみる。

Hubサイトとして機能や設計的なベストではありませんが、Laravelの裏側に用意された機能と仕組みを学ぶためには面白い内容にしています。

これにより、以下の機能に触れてみましょう。

  • Artisan CLI
  • Artisanコマンドスケジューラー
  • イベント(ただし、ブロードキャストは扱いません)
  • キュー

今のところ、用語がわからなくても安心してください。この後に学習しましょう。

1.2 必要なスキルと要件

この書籍を読まれる方は、多少なりともLaravelに慣れたレベルの方を想定しています。

  • PHPは一通りOK
  • Laravelで作ったWebサービスを自力で実働環境へデプロイし、実行できる

「公式ドキュメントを読み、Web上で適切な情報を見つけ、わからない点はコアのPHPクラスを読んで解決できるレベルの方」には、本書は必要ありません。そこまでのレベルには行き着いていないが、Artisanコマンドやスケジューラー、イベントシステム、キューをどのように活用するのか具体的なイメージを掴みたい学習者向けの内容です。

Hubサイトですから、実際に様々なサービスと連携します。動作させるためのVPSなどは用意しなくても、インターネットに接続できる開発環境があれば、内容を試すことが可能です。もちろん、以下のような一般的なサーバー上で実行することも可能です。

  • サクラやカゴヤ、z.com、AWS、Linode、DigitalOceanなどのVPSやクラウドサービス
  • もしくはLaravelの動作要件を満たし、毎分のcron設定が可能な共有サーバー
  • もしくはインターネットへ公開しているオンプレミスのWebサーバー

サーバーとして動作させるOSは、Linuxディストリビューションの”Ubuntu”を想定しています。その理由は公式Vagrant BoxであるHomesteadでも利用されているからです。しかし他のLinuxディストリビューションでも、本書が取り扱う範囲では大差はないかと思います。Unix系の場合は使用するコマンドやオプションが多少異なることもあります。Windowsサーバーでは、大幅に異なるでしょう。

1.3 コードについて

掲載したコードはGithubから入手可能です。通常の著作物の一部として公開しています。

書籍中のコード中の長い行はLeanpubの電子書籍生成システムにより、複数行へ分割されます。分割された行の最後へ’\‘が付加されます。(コード以外の部分で英単語が分割される場合は、行末がハイフン(-)になります。)

コードのフォーマットに特別な意図はありません。チュートリアルを実行する場合は、お好きなようにリフォーマットしてください。

テストの実行は本書の範囲外です。

書籍上で「何をやっているか」が一目で追いやすいように、原則メソッド内にロジックをだらだらと書いています。コードをきれいにまとめ上げてはいません。(コードをどのように書くべきか、構成すべきかは、個人やチームにより差がある部分です。コーディング規則で縛って「…すべき!…すべき!」といじめるつもりはありません。)

また、知識を吸収する学習段階で「べきべき」を持ちだすと、抵抗感により習得が遅れるものです。この書籍の内容を実用にするのであれば、最終的にぜひ皆さんの「…べき」に従いリファクタリングしてください。私も本書を書く気にさせた元々のシステムをこの本のバージョンで置き換えるつもりですが、その際に私の気に入るように手を加えるつもりです。(たとえば、外部Composerパッケージを使っている箇所はServiceにしていますが、本来はインターフェイスを導入し、交換性を上げるべきでしょう。しかし、インターフェイスによる分離や複雑なデザインパターンの導入は、コードの読みやすさを大きく損ねてしまいます。それは本書の目的とそぐいません。実用としてシステムを構築する場合は、外部パッケージはいつメンテが放棄されるか分かりませんので、交換性を備えておくのは賢い考えです。)

1.4 謝辞

図中の図形デザインは、Freepikにより作成されたものです。

All icons in this book are designed by Freepik.

1.5 改訂版について

Laravel5.0のリリースの後、長期メンテナンス版(3年間)のバージョン5.1LTSが発表されました。

メジャーバージョンは同じで、内部的な動作は5.0と大差ないのですが、5.1LTSのドキュメントで説明されなくなった5.0の機能もあります。そうした多くの機能はバージョン5.1LTSでも利用できます。

LTSリリースに合わせドキュメントも大幅に書き直されました。用語と概念はわかりやすいように整理されました。ドキュメントで紹介されている基本的な手法や用語が変更になりました。つまり5.0より概念はわかりやすく、かつ機能は使いやすくなっています。

そして何しろLTSです。長期サポート版です。バグフィックスは2年間、セキュリティー脆弱性の修正は3年間提供されます。安心して利用できます。

そこで、今回は5.1LTSに合わせ内容を改定しました。前バージョンの本書はzipファイルで提供します。