如何在laravel web.php文件中使用控制器方法定义事件?

时间:2017-10-05 06:29:52

标签: php laravel vue.js

我在web.php中定义了控制器方法调用,如下所示。

Route::post('/order', 'OrderController@create');

我想在调用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类中接收事件。请在此处说明问题所在。

2 个答案:

答案 0 :(得分:1)

第1步: 请检查您的应用程序namespace App\Providers;此路径以获取侦听器映射事件。

第2步: 在你的函数中添加这一行:

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

$ data是可选的。

第3步: 在侦听器中编写您想要执行的所有代码,这些代码已经映射过。

答案 1 :(得分:1)

好的,如果你想要或者直接从控制器调用事件,你可以使用观察者。

以下是使用观察者的方法

<?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)
{
    //
}
}
您的AppServiceProvider中的

Order::observe(OrderObserver::class);方法

中包含boot

现在每次创建或删除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
  }

}