Ejemplo n.º 1
0
 public function whenDiscussionWillBeSaved(DiscussionWillBeSaved $event)
 {
     if (isset($event->data['relationships']['tags']['data'])) {
         $discussion = $event->discussion;
         $actor = $event->actor;
         $linkage = (array) $event->data['relationships']['tags']['data'];
         $newTagIds = [];
         foreach ($linkage as $link) {
             $newTagIds[] = (int) $link['id'];
         }
         $newTags = Tag::whereIn('id', $newTagIds)->get();
         $primaryCount = 0;
         $secondaryCount = 0;
         foreach ($newTags as $tag) {
             if (!$tag->can($actor, 'startDiscussion')) {
                 throw new PermissionDeniedException();
             }
             if ($tag->position !== null && $tag->parent_id === null) {
                 $primaryCount++;
             } else {
                 $secondaryCount++;
             }
         }
         $this->validatePrimaryTagCount($primaryCount);
         $this->validateSecondaryTagCount($secondaryCount);
         $oldTags = [];
         if ($discussion->exists) {
             $oldTags = $discussion->tags()->get();
             $oldTagIds = $oldTags->lists('id');
             if ($oldTagIds == $newTagIds) {
                 return;
             }
             $discussion->raise(new DiscussionWasTagged($discussion, $actor, $oldTags->all()));
         }
         Discussion::saved(function ($discussion) use($newTagIds) {
             $discussion->tags()->sync($newTagIds);
         });
     }
 }