Loading...
LaravelPHP

Laravel5.4 MultiAuth & Broadcast

構築環境

ブロードキャストは、RedisとSocket.ioで動かしてます。 ユーザーは、仮に2種類として、user,admin とします。 下記コードから解読して理解しよう。

受信先

仮に、ルーム番号1
Echo.private('room.1')
  .listen('TestEvent', (e) => {
    console.log(e);
  });

モデル

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Room extends Model
{
    protected $table = 'room';
    protected $fillable = [
        'user_id', 'admin_id'
    ];

    // <editor-fold desc="リレーション定義">
    /**
     * ユーザーのリレーション定義
     * @return \Illuminate\Database\Eloquent\Relations\HasOne
     */
    public function user()
    {
        return $this->hasOne(User::class, 'id', 'user_id');
    }
    /**
     * 管理者のリレーション定義
     * @return \Illuminate\Database\Eloquent\Relations\HasOne
     */
    public function admin()
    {
        return $this->hasOne(Admin::class, 'id', 'customer_id');
    }
    // </editor-fold>
}

サービスプロバイダー

ブロードキャスト・サービスプロバイダー
<?php
namespace App\Providers;

use Log;
use App\Rome;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Broadcast;

class BroadcastServiceProvider extends ServiceProvider
{
    /**
     * あらゆるアプリケーション サービスをブートス トラップできます。
     *
     * @return void
     */
    public function boot()
    {
        Broadcast::routes();
        /*
         * 管理者またはユーザーの個人的なチャネルを認証.
         * @param User|Admin $user 
         * @param int        $roomId ルームID
         */
        Broadcast::channel('room.*', function ($user, $roomId) {
            // 存在するルームか?
            if( !is_null($room = Rome::find($roomId)){
                // そのルームのユーザーまたは管理者IDと一致するか?
                if( $user instanceof User){
                    return $t->user_id == $user->id;
                }else if( $user instanceof Admin){
                    return $t->admin_id == $user->id;
                }
            }
            return false;
        });
    }
}
Auth・サービスプロバイダー
<?php

namespace App\Providers;

use Auth;
use Gate;
use Illuminate\Contracts\Auth\Access\Gate as GateContract;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * アプリケーションのポリシーマッピング。
     *
     * @var array
     */
    protected $policies = [
        'App\Model' => 'App\Policies\ModelPolicy'
    ];

    /**
     * アプリケーションの認証/認証サービスを登録します。
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();

        /**
         * MultiAuth 対応のために!!
         */
        Auth::resolveUsersUsing(function ($guard = null) {
            if( is_null($guard) ){
                if( Auth::guard('admin')->check()) return Auth::guard('admin')->user();
                else if( Auth::guard('user')->check()) return Auth::guard('user')->user();
            }
            return Auth::guard($guard)->user();
        });
    }
}
ここで重要なのが、33行目のAuth::resolveUsersUsingこのぶぶんで、ブロードキャストのMultiAuthに対応するようになる。

さいごに

ええええええ!?たったこれだけで、理解しろと?

はい、理解してください。これで、意味不明な方は、kaokenとの相性が悪いということですw毎度スパルタでごめんね~~

以上 メモ代わりに書いたコードでした orz

コメントを残す

%d人のブロガーが「いいね」をつけました。