2015-09-25 3 views
0

Во-первых, я хотел бы извиниться, если это дублированный или повторяющийся вопрос.Laravel Dependency Injection, используя функцию настройки

Я «новый» для инъекций зависимости. Я понял, как это сделать в функциях __constructor, но не уверен в функции setter. Я хочу правильно использовать DI, вопрос: я использую это правильный путь в следующем коде:

public function setNotification(Notification $notification) 
{ 
    $this->notification = $notification; 
} 

public function handle(PostWasCommented $event) 
{ 
    $post = $event->comment->post; 

    $post->load('blog'); 

    $followers = $post->followers; 

    $online_ids = Redis::pipeline(function($pipe) use ($event, $followers, $post) 
    { 
     foreach($followers as $follower){ 
      if(Auth::id() != $follower->user_id){ 
       $this->setNotification(new Notification()); 
       $this->notification->from_id = Auth::id(); 
       $this->notification->to_id = $follower->user_id; 
       $this->notification->type = 'PostComment'; 
       $this->notification->source_id = $event->comment->id; 
       $this->notification->parent_id = $event->comment->post_id; 
       $this->notification->blog_name = $post->blog->link_name; 

       if($post->user_id == $follower->user_id) 
        $this->notification->my_post = true; 
       else 
        $this->notification->my_post = false; 

       $this->notification->save(); 

       $pipe->get('user'.$follower->user_id); 
      } 
     } 
    }); 

я узнал, используя массовое назначение может может помочь мне :)

+1

Я не уверен, что я вижу инъекцию зависимости здесь. Единственное, что _may_ qualify является аргументом 'PostWasCommented', но я не думаю, что это то, о чем вы просите здесь. –

ответ

1

Ты делаешь это неправильно. Инъекция, как следует из названия, имеет смысл только в том случае, если зависимость вводится снаружи.

Вместо того, что у вас есть это инъекционный метод сеттер setNotification() который вы звоните из в пределах того же класса с new Notification() объект в качестве аргумента.

Впрыскивание не происходит. Ваш класс по-прежнему тесно связан с Notification, а метод setNotification() не имеет никакой цели.

+0

Как мне это сделать? предполагая, что я хочу вводить новое уведомление каждый раз, когда цикл foreach запускается ... –

+0

Если ваш объект должен потреблять кучу объектов «Уведомление», то правильным способом будет создание фабричного объекта уведомления и, вместо этого, инъекция. – lafor

+0

Я думаю, что понимаю, что вы имеете в виду, я хотел бы получить более подробный ответ. решение, которое я нашел, и будет использовать, больше построено в рамках Laravel - Mass Assignment. –

0

я узнал решение, большое спасибо за всю информацию :)

public function __construct(Notification $notification) 
{ 
    $this->notification = $notification; 
} 

public function handle(PostWasCommented $event) 
{ 
    $post = $event->comment->post; 

    $post->load('blog'); 

    $followers = $post->followers; 

    $online_ids = Redis::pipeline(function($pipe) use ($event, $followers, $post) 
    { 
     foreach($followers as $follower){ 
      if(Auth::id() != $follower->user_id){ 

       $my_post = false; 
       if($post->user_id == $follower->user_id) 
        $my_post = true; 

       $this->notification->create([ 
        'from_id' => Auth::id(), 
        'to_id' => $follower->user_id, 
        'type' => 'PostComment', 
        'source_id' => $event->comment->id, 
        'parent_id' => $event->comment->post_id, 
        'blog_name' => $post->blog->link_name, 
        'my_post' => $my_post 
       ]); 

       $this->notification->save(); 

       $pipe->get('user'.$follower->user_id); 
      } 
     } 
    }); 

не должен забывать, чтобы добавить $ заполняемого массива в модели.

protected $fillable = ['from_id', 'from_id', 'to_id', 'type', 'source_id', 'parent_id', 'blog_name', 'my_post'];