構築環境
ブロードキャストは、RedisとSocket.ioで動かしてます。 ユーザーは、仮に2種類として、user,admin とします。 下記コードから解読して理解しよう。受信先
仮に、ルーム番号1Echo.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