[수시 업데이트] 라벨6로 실시간 채팅.

사이트 축소판 그림
https://reffect.co.jp/laravel/laravel-broadcasting-understandig
https://readouble.com/laravel/6.x/ja/broadcasting.html
↓ 그래서 브라우저를 업데이트하지 않고 실시간으로 알림을 하는 건가요? 믿을만한qita 보도입니다.
https://qiita.com/att55/items/da663f6e713c3bd073e8
대단히 감사합니다😀
라벨 버전 6 과예요.
완성계
gif라서 동작이 느려 보이지만 동작이 더 빨라요.
다시 불러오지 않아도 상대방의 브라우저에서 정보를 업데이트할 수 있습니다.

동작의 인상은 이렇습니다.

0.push의 등록


composier에push를 사용하는 데 필요한 환경을 설치합니다
"~4.0"을 추가하지 않으면 laavel6가 순조롭게 돌아가지 못합니다
composer require pusher/pusher-php-server "~4.0"

1.config 디렉토리의 app 입니다.php BroadcastServiceProvider 의견 떼기


app.php
App\Providers\BroadcastServiceProvider::class,

2. .env 파일의 BROADCOTDRIVER 값은 push입니다.


.env
BROADCAST_DRIVER=pusher
또?env 파일에 pi 키를 등록합니다.
push의 Getting Started 2단계에서 Laavel로 서버를 선택하면 다음 키를 얻을 수 있습니다.env 파일로 설정합니다.
PUSHER_APP_ID=英数字列が入ってます
PUSHER_APP_KEY=英数字列が入ってます
PUSHER_APP_SECRET=英数字列が入ってます

3. 이벤트 제작


SholdBroadcast 인터페이스를 계승하여broadcastOn에서return new Channel(채널 이름)로 사용합니다.
이벤트 이름은 MessageAdded, 채널 이름은 message-added-channel입니다.
이때 이벤트가 발생하면push에 데이터를 보낼 수 있습니다.
MessageAdded.php
<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class MessageAdded implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $message;
    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct($message)
    {
        $this->message = $message;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new Channel('message-added-channel',[$this->message]);
    }
}

4.laavel-echo와pushher-js 라이브러리 설치


브라우저에서pusher로부터 정보를 받는 데 사용되는 총서를 설치합니다.
npm install --save laravel-echo pusher-js
resource\js\bootstrap.js 다음 코드의 주석 삭제
bootstrap.js
import Echo from 'laravel-echo';

window.Pusher = require('pusher-js');

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: process.env.MIX_PUSHER_APP_KEY,
    cluster: process.env.MIX_PUSHER_APP_CLUSTER,
    encrypted: true
});

5. 이번에 사용한 blade 만들기


chatroom.blade.php
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta name="csrf-token" content="{{ csrf_token() }}">

        <title>Todos</title>
    </head>
    <body>
        <div id="message_area">

        </div>
        <div>
           <textarea id = "message" rows="5" cols="100"></textarea>
           <button id="submit">送信</button>
        </div>

        <script src="/js/app.js"></script>
        <script src="{{asset('js/chat.js')}}"></script>
    </body>
</html>

6. 컨트롤러


ChatroomController.php
<?php

namespace App\Http\Controllers;

use App\Events\MessageAdded;
use Illuminate\Http\Request;
use App\Message;
use PHPUnit\Util\Test;
use Illuminate\Support\Facades\Auth;

class ChatroomController extends Controller
{
    //チャット画面を表示
    public function index()
    {
        return view('chatroom');
    }

    //新しいメッセージが来たとき
    public function newmessage(Request $request)
    {
        $message = new Message();
        $message->message = $request->message;
        $message->user_id = Auth::id();
        $message->save();

        //イベント発動
        //新しいメッセージをpusherに
        event(new MessageAdded([$message,Auth::user()]));
    }

    //最初にアクセスした時、全メッセージを返す
    public function allmessage()
    {
        return Message::with('user')->get();
    }
}

7. 비동기 통신용 JavaScript(Xml HttpRequest 사용) 쓰기


aax통신을 할 때 항상 jQuery에 의존하기 때문에 이번에는 다음과 같은 보도를 참고했습니다.
https://www.sejuku.net/blog/30245
chat.js
window.Echo.channel('message-added-channel')
.listen('MessageAdded',function(data){
   console.log('received a message');
   console.log(data);
   let newmessage = data.message[0].message;
   let name = data.message[1].name;
   let message = document.querySelector('#message_area');
   message.insertAdjacentHTML('beforeend',name+" "+newmessage +" "+data.message[0].created_at+"<br>");
 });

 //一度だけ実行される処理
 var xhr = new XMLHttpRequest();
 xhr.open('GET', '/allmessage');
 xhr.send();

 //最初にアクセスした時全てのメッセージを取得
 xhr.onreadystatechange = function() {
    if(xhr.readyState === 4 && xhr.status === 200) {
       const json = xhr.responseText;
       const obj = JSON.parse(json);
       console.log(obj);
       const message = document.querySelector('#message_area');
       for(let i = 0; i < obj.length; i++){
       message.insertAdjacentHTML('beforeend' , obj[i].user.name+" "+obj[i].message +" "+obj[i].created_at+"<br>");
       }
    }
}

 const submitbutton = document.querySelector('#submit');

 //送信ボタンをクリックした時
 submitbutton.addEventListener('click',()=>{
     const message = document.querySelector('#message');
     console.log(message.value);

     const xhr = new XMLHttpRequest();
     let token = document.getElementsByName('csrf-token').item(0).content;

     xhr.open('POST','/newmessage')
     xhr.setRequestHeader('X-CSRF-Token', token);
     xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');
     console.log(message.value);
     xhr.send("message="+message.value);
     message.value = '';
 });

8. 라우팅


web.php
<?php

use App\Events\MessageAdded;
use Symfony\Component\EventDispatcher\Event;
use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return view('welcome');
});

Auth::routes();

Route::get('/home', 'HomeController@index')->name('home');

// Route::get('/test', function () {
//     event(new MessageAdded('message!!!'));
// });

//ajax通信のルーティング
Route::post('/newmessage', 'ChatroomController@newmessage');
Route::get('/allmessage','ChatroomController@allmessage');

//チャットルームを表示
Route::get('/chatroom', 'ChatroomController@index')->middleware('auth');

좋은 웹페이지 즐겨찾기