2015-02-01 12 views
12

तो मैं नई लैरवेल 5 इवेंट पद्धति का प्रयास कर रहा हूं।लार्वेल 5 इवेंट हैंडलर फायरिंग

// Events 
use App\Events\KitchenStored; 

class EloquentKitchen implements KitchenInterface { 

    public function store($input) { 
     $kitchen  = new $this->kitchen; 
     $kitchen->name = $input['name']; 
     $kitchen->save(); 

     \Event::fire(new KitchenStored($kitchen)); 

     return $kitchen; 
    } 

कौन सा सफलतापूर्वक इस ईवेंट सक्रिय:

मेरी भंडार में, मैं घटना "KitchenStored" के रूप में तो फायरिंग कर रहा हूँ

<?php namespace App\Events; 

use App\Events\Event; 

use Illuminate\Queue\SerializesModels; 

class KitchenStored extends Event { 

    use SerializesModels; 

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

} 

हालांकि, यह इस पर निर्भर नहीं जुड़ता है हैंडलर:

<?php namespace App\Handlers\Events; 

use App\Events\KitchenStored; 

use Illuminate\Queue\InteractsWithQueue; 
use Illuminate\Contracts\Queue\ShouldBeQueued; 

class AttachCurrentUserToKitchen { 

    /** 
    * Create the event handler. 
    * 
    * @return void 
    */ 
    public function __construct() 
    { 
     dd('handler'); 
    } 

    /** 
    * Handle the event. 
    * 
    * @param KitchenStored $event 
    * @return void 
    */ 
    public function handle(KitchenStored $event) 
    { 
     // 
    } 

} 

जो मुझे पता है क्योंकि डीडी ('हैंडलर'); अनुरोध जीवन चक्र के दौरान नहीं निकाल दिया गया है।

<?php namespace App\Providers; 

use Illuminate\Contracts\Events\Dispatcher as DispatcherContract; 
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; 

class EventServiceProvider extends ServiceProvider { 

    /** 
    * The event handler mappings for the application. 
    * 
    * @var array 
    */ 
    protected $listen = [ 
     App\Events\KitchenStored::class => [ 
      App\Handlers\Events\AttachCurrentUserToKitchen::class 
     ] 
    ]; 

    /** 
    * Register any other events for your application. 
    * 
    * @param \Illuminate\Contracts\Events\Dispatcher $events 
    * @return void 
    */ 
    public function boot(DispatcherContract $events) 
    { 
     parent::boot($events); 
     Event::listen('App\Events\KitchenStored', 
        'App\Handlers\Events\AttachCurrentUserToKitchen'); 
    } 

} 

किसी को भी बेहतर तो मैं साफ कोड मैं आज तक के साथ जा रहा रख सकते हैं इस प्रक्रिया की व्याख्या कर सकते:

मैं अपने यहां श्रोता के साथ घटना पंजीकृत किया है?

बहुत धन्यवाद

उत्तर

15

EventServiceProvider.php में, शामिल प्रमुख \ जब एक वर्ग ::class अंकन का उपयोग संदर्भित:

protected $listener = [ 
    \App\Events\KitchenStored::class => [ 
     \App\Handlers\Events\AttachCurrentUserToKitchen::class, 
    ], 
]; 

तुम भी use बयान जोड़ सकते हैं और अपने श्रोता मैपिंग कम रख सकता है:

use App\Events\KitchenStored; 
use App\Handlers\Events\AttachCurrentUserToKitchen; 
... 
protected $listener = [ 
    KitchenStored::class => [ 
     AttachCurrentUserToKitchen:class, 
    ], 
]; 

या बस का उपयोग स्ट्रिंग नोटेशन:

protected $listener = [ 
    'App\Events\KitchenStored' => [ 
     'App\Handlers\Events\AttachCurrentUserToKitchen', 
    ], 
]; 
+1

इसे अधिक ध्यान देना चाहिए। आम मुद्दा ... – AJReading

+2

:: कक्षा नोटेशन का उपयोग करना स्वत: पूर्णता के कारण, वर्तनी त्रुटियों से परहेज करना बेहतर है। – systemovich

+1

@systemovich omg yes ... एक श्रोता को स्थानांतरित कर दिया और यह काम करना बंद कर दिया, इस पथ को छोड़कर सभी पथों को स्वचालित रूप से दोबारा प्रतिक्रिया दी गई, इस समस्या को खोजने के लिए हमेशा के लिए लिया गया क्योंकि यह कोई त्रुटि नहीं फेंकता है –

14

आप php artisan optimize चलाते हैं तो आपका ईवेंट हैंडलर्स सुन शुरू कर देना चाहिए।

उस के लिए लारचैट स्लैक चैनल से मैटस्टॉफर को क्रेडिट करें।

+1

मेरे लिए यह समस्या का समाधान नहीं करता है। –

+0

वास्तव में बेवकूफ लेकिन मैंने 'EventServiceProvider' कक्षा में सही कक्षाओं को आयात करने के लिए सुनिश्चित करके मेरी समस्या हल की। – adis

+0

फिर, संगीतकार डंप-ऑटोलोड की तरह, यह निश्चित रूप से एक समाधान हो सकता है हालांकि उपयोगकर्ता के लिए अभी समाधान नहीं है! –

0

मेरे पास एक समान समस्या थी और मैंने इसे विक्रेता \ compiled.php फ़ाइल को हटाकर इसे ठीक किया। फिर मैं फिर से "संगीतकार अद्यतन" चलाता हूं और अब हैंडलर अपेक्षित रूप से फायरिंग कर रहा है।

7

मैं

composer dumpautoload 

पीछा दौड़ा

php artisan clear-compiled 

द्वारा तब मेरे घटनाओं फायरिंग शुरू कर दी।

+0

4 अपवॉट्स, ऐसा लगता है कि समुदाय असहमत है। –

+0

एक गैर डीबग पर्यावरण में, यह निश्चित रूप से कारण हो सकता है। मैं पूरी तरह सहमत हूँ! –

+0

यह मेरे लिए काम किया। मैं एक कस्टम पैकेज में एक ईवेंट और श्रोताओं को जोड़ने की कोशिश कर रहा था जिसे मैं लिख रहा हूं। मैंने उन्हें अपने वास्तविक ऐप में विकसित किया, लेकिन फिर जब मैंने उन्हें पैकेज में स्थानांतरित कर दिया, तो मुझे श्रोताओं के लिए कक्षा नहीं मिली। इसने एकदम जादू की तरह काम किया! –

संबंधित मुद्दे