LaravelとVueで、Lineのようなリアルタイムチャットを作ってみます


Laravelのプロジェクトは、既に作ってあるものとします。

データベースを作成します。

php artisan make:model Message -m

作成された、マイグレーションファイルに以下をコーディング

     public function up()
    {
        Schema::create('messages', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->text('body'); // メッセージ本文
            $table->text('user');
            $table->timestamps();
        });
    }

マイグレーション実行

php artisan migrate

データベース状況は以下の通りです。

データ追加の時にエラーにならないように、guarded を追加します。

class Message extends Model
{
    //
    protected $guarded = ['id'];
}

チャットページの作成

routes/web.php に route を追加します。

Route::get('/chat', 'ChatController@index');

コントローラを作成します。

php artisan make:controller ChatController

作成した ChatController に viewの設定をします。ユーザーIDが必要なので、ログイン必須とします。

public function __construct()
{
   $this->middleware('auth');
}
public function index() {
    return view('chat'); // フォームページのビュー
}

ビューを追加します。

ビューを追加します。

<html>
<body>
    <div id="chat">
        <textarea v-model="message"></textarea>
        <br>
        <button type="button" @click="send()">送信</button>
        <hr>
        <div v-for="m in messages">
            <span v-text="m.created_at"></span>
            <span v-text="m.body"></span>
        </div>

    </div>
    <script src="/js/app.js"></script>
    <script>

        new Vue({
            el: '#chat',
            data: {
                message: '',
                messages: []
            },
            methods: {
                getMessages() {

                    const url = '/ajax/chat';
                    axios.get(url)
                        .then((response) => {
                            this.messages = response.data;
                        });

                },
                send() {
                    const url = '/ajax/chat';
                    const params = { message: this.message };
                    axios.post(url, params)
                        .then((response) => {
                            // 成功したらメッセージをクリア
                            this.message = '';
                        });
                }
            },
            mounted() {
                this.getMessages();
                Echo.channel('chat')
                    .listen('MessageCreated', (e) => {
                        this.getMessages(); // メッセージを再読込
                    });
            }
        });

    </script>
</body>
</html>

vue エラー

ERROR in ./resources/js/components/ExampleComponent.vue 1:0
というエラーが出た場合、
webpack.mix.js を 以下のように編集してください。
mix.js(‘resources/js/app.js’, ‘public/js’).vue() // ⭐️ 追記

ちなみに、pusher は、vuejs は、2にしか対応されていないので、vuejs は、ver2 を使ってください。

vuejsバージョンチェック方法
npm list vue
vue-hoge@1.0.0 /Users/fuga/project/vue-hoge
└── vue@2.6.10