2017-10-05 9 views
0

私は以下のようにweb.phpでコントローラメソッド呼び出しを定義しています。laravel web.phpファイルのコントローラメソッドでイベントを定義する方法は?

Route::post('/order', '[email protected]'); 

OrderController @ createメソッドが呼び出されたときにイベントを呼び出すとします。どうやってやるの?私のイベントコールは

event(new NewOrderAdded()); 

私のイベントクラスです。

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

    /** 
    * Create a new event instance. 
    * 
    * @return void 
    */ 
    public function __construct() 
    { 
     // 
    } 

    /** 
    * Get the channels the event should broadcast on. 
    * 
    * @return \Illuminate\Broadcasting\Channel|array 
    */ 
    public function broadcastOn() 
    { 
     return new Channel('public-test-channel'); 
    } 
} 

コントローラクラス

class OrderController extends Controller 
{ 
    public function create(Request $request){ 
    $order = new Order([ 
     'user_id' => $request->get('user_id'), 
     'person_id' => json_encode($request->get('person_id')), 
     'date_of_booking' => $request->get('date_of_booking'), 
     'total_order_price' =>$request->get('total_order_price'), 
     'ticket_id' => json_encode($request->get('ticket_id')), 
     'timeslot' => $request->get('timeslot'), 
     'status' => 'pending', 
     'add_on_id' => json_encode($request->get('add_on_id')) 
    ]); 
    $order->save(); 
    event(new NewOrderAdded($order)); 
    return response()->json(array('order_id'=>$order->id)); 
    } 
} 

ここで私はイベントを受信したいCLASです。 ViewBookings.vue

<script> 
import moment from 'moment'; 
export default{ 
    data(){ 
    return{ 
     users:[] 
    } 
    }, 
    created:function(){ 
    this.listen(); 
    }, 
    methods:{ 
    listen(){ 
     Echo.channel('public-test-channel') 
      .listen('NewOrderAdded', (data) => { 
       console.log("Event received"); 
      }); 
    } 
    } 
} 
</script> 

私はこのコードを試してみましたが、私はViewBookings.vueクラスのイベントを受け取ることができないのです。ここで問題が何かを提案してください。

+1

を使用したい場合は、ちょうどあなたのコントローラ – usrNotFound

+0

@usrNotFoundが、どのようにそれを呼び出しますか? – Hitendra

+0

コントローラにイベントをディスパッチする方法を確認してください。https://laravel.com/docs/5.5/events#dispatching-events – C2486

答えて

1

ステップ1: namespace App\Providers;このイベントからリスナーへのマッピングのパスを確認してください。

ステップ2: あなたの関数では、この行を追加します。

Event::fire(app()->make('App\Events\YourEventClassName', [$data])); 

$データはオプションです。

ステップ3: すでにマップしているリスナーで行うすべてのコードを記述します。

0

コントローラから直接イベントを呼びたい場合やコールする場合は、オブザーバーを使用することができます。ここで

あなたはboot方法今

にあなたが作成するたびにOrder::observe(OrderObserver::class);を含めるかOrder作成されたオブジェクトまたは削除意志がトリガ削除あなたのAppServiceProviderにオブザーバー

<?php 

namespace App\Observers; 


use App\Order; 


class OrderObserver 
{ 
/** 
* Listen to the Order created event. 
* 
* @param Order $order 
* @return void 
*/ 
public function created(Order $order) 
{ 
    // 
} 

/** 
* Listen to the Order deleting event. 
* 
* @param Order $order 
* @return void 
*/ 
public function deleting(Order $order) 
{ 
    // 
} 
} 

を使用する方法です。

それとも、コントローラに

<?php 

namespace App\Http\controller; 


class OrderController extends Controller 
{ 

    public function store(Request $request) 
    { 
    //....... 
    //after saving call your 
    event(new NewOrderAdded()) //even better pass user object here 
    } 

} 
関連する問題