Friction River Software

  • お問い合わせ

CakePHP5入門【CakePHP5実用編①】要件定義

A子

Webアプリケーションとして、チャットサービスを作ろう!

C菜

また、いきなりの無茶ぶりです~

B美

ふむ、LINEのようなやつかな?

A子、あんた…
クライアントサーバ型でリアルタイムチャットを実現することの難易度(難しさ)って、ちゃんと分かってる?

A子

ん?
クライアント(ブラウザ)がサーバ(Webサーバ)に要求リクエストすると、サーバはクライアントに対して応答レスポンスを返す
…ってのがクライアントサーバ型だよね?

自分の発言をブラウザから送信することで、それがサーバに届いて処理される…
別に問題ないじゃん
(前に作った「掲示板」と同じ仕組みよね?)

C菜

いえ、ちょっと待ってください~

例えば、A子社長、B美部長、私(C菜)の三人がチャットサービスを利用しているとして~
私の送信した文章がWebサーバに届くのは問題ないです~

でも、それを即座にA子社長とB美部長にも届けなければなりませんよね~?
それって、(クライアントからの要求リクエスト無しに)サーバからクライアントへ通知するということになりませんか~?

B美

さっすがC菜、よく分かってるわね

A子

えーっと、ん?
あっ、そうか!

だったら、事前に(からの)要求リクエストをしておいて、サーバは応答レスポンスを保留状態にしておく…って方法はどう?

B美

お、ちょっと驚いたわね
(それを思いついたことに…)

実は、その技術(「Cometコメット」と呼ばれています)ってすでにあるのよ
ただし、現在ではほとんど使われてないけどね

C菜

ということは~

今はもっと良い技術があるのでしょうか~?

B美

その通り!

今の時代、サーバからクライアントへアクションを起こすには「WebSocketウェブソケット」を使うのが一般的ね
(これって「双方向通信」を実現する技術なの)

A子

「双方向通信」って電話みたいな形態だよね

そっかー
電話って、たしかにクライアントサーバ型じゃないもんね

B美

そういうこと

ただ、Webサーバとは別に、WebSocketサーバを起動しておかないといけないけどね
(要するに、Webサーバは「クライアントサーバ型」だけど、WebSocketサーバはそうじゃないってことよ)

C菜

CakePHPでも実現できるのでしょうか~?

B美

ちゃんとPHP言語のライブラリがあるわよ

CakePHPでもcomposerで簡単にインストールできるし…

A子

おぉ!
だったら簡単だね

ライブラリの名前は?

B美

Ratchetラチェット
(正確には「cboden/ratchet」)

CakePHP5のプロジェクトディレクトリに移動したあと

composer require cboden/ratchet[Enter]

…って打ち込むだけ

C菜

使い方については、ChatGPTに聞いても良いでしょうか~?

B美

もちろん!

詳細に教えてくれるはずよ

A子

んじゃ、さっそくやってみよう

B美

ちょっと待って!

(実験用ではなく)きちんとしたWebアプリケーションとして実装するなら、まずは要件定義から始めなさいね

C菜

「画像投稿掲示板」のときのように、盛り込みたい機能を列挙していけば良いんですよね~?

A子

うーん、面倒だけど仕方ない…(苦笑)
でも、機能としては単純なものよ

・LINEっぽいやつ

ただ、それだけ(笑)

C菜

もっと細かく決めないとダメですよ~
例えば

・発言をデータベースに格納するのか?ログファイルに書き込むのか?
・誰でも自由に利用できるようにするのか?それともログイン必須にするのか?
・自由にチャットルームを作ることができて、そこには招待した人だけが参加できるようにするのか?
・画像ファイルを貼り付けられるようにするのか?

などが、パッと思いついたところですね~

A子

過去の発言って必要かな?

その場限りの発言で良いんじゃない?

C菜

あとから遅れて会話に参加する場合、それまでの話の流れが分からないと困ると思いますよ~

A子

うーん、たしかに…

でも、かなり前の発言から最新の発言までを全部表示するの?

C菜

チャットルーム単位で、全ての発言を表示すればどうでしょう~?

そのチャットルームに入室した時点で、それまでの発言を全て表示するんですよ~

A子

あー、だったら「ファイル」ではなく「データベース」のほうが良いかもね

あと、ログインは必須にしよう
(内緒話ができるように(笑))

C菜

チャットルームへの入室制限はどうします~?
(招待した人だけが入室できるようにするのか…ってことです~)

A子

かなり面倒くさい気がする(苦笑)

ログインしたユーザだったら、誰でも入室できる…で良いんじゃない?

C菜

わかりました~

画像ファイル投稿はどうしましょう~?

A子

うーん
「画像投稿掲示板」で経験したから、それほど難易度は高くないと思うけど…

いや、やめておこう
ベースはできるだけシンプルにして、制作難易度は下げておいたほうが良いと思う

あ、あと前回作った認証アプリ(authapp)を改造して作ろう
(さらに制作難易度が下がるからね)

C菜

それでは、まとめますね~

【要件定義】
・前回の認証アプリ(authapp)をベースに発展させていく(ログイン必須)
・チャットルームを作り、そこへ入室することでメンバー間のチャットを行う
・誰でも新たなチャットルームを作ることができるとともに、その部屋には誰でも入室できる
・チャット内容はデータベース上に格納され、入室時点までの過去ログが全て画面上に表示される
・双方向通信についてはWebSocket(Ratchet)により行う
・テキスト情報以外の送信は不可(画像ファイル等の貼り付けはできない)

という感じで、どうでしょうか~

B美

ねぇ、チャットルームの「削除」はどうするの?

永続的なものにするの?
(削除しないと、どんどん増えていくわよ)

A子

そのチャットルームを作成した人がその部屋の管理人になって、その人じゃなければ削除できないってことにしたらどう?

C菜

なるほどですねぇ
良いと思います~

あ、でも「削除」方法ですけど~
(物理的な完全削除じゃなく)削除フラグを立てる形のほうが良いと思いますよ~

B美

んじゃ、とりあえずの仕様はこんな感じで…
(あとは臨機応変に変更していけば良いわ)

【要件定義】
・前回の認証アプリ(authapp)をベースに発展させていく(ログイン必須)
・チャットルームを作り、そこへ入室することでメンバー間のチャットを行う
・誰でも新たなチャットルームを作ることができるとともに、その部屋には誰でも入室できる
・チャット内容はデータベース上に格納され、入室時点までの過去ログが全て画面上に表示される
・双方向通信についてはWebSocket(Ratchet)により行う
・テキスト情報以外の送信は不可(画像ファイル等の貼り付けはできない)
・チャットルームの管理人はその部屋の作成者とする
・チャットルームの管理人のみがその部屋の削除を行うことができる(ただし「削除フラグ」を立てる形式)

A子

うん、良いと思う

それじゃ、次回はデータベース設計だね