Edit File: ExtractTags.php
<?php namespace Laravel\Telescope; use Illuminate\Broadcasting\BroadcastEvent; use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Model; use Illuminate\Events\CallQueuedListener; use Illuminate\Mail\SendQueuedMailable; use Illuminate\Notifications\SendQueuedNotifications; use ReflectionClass; use stdClass; class ExtractTags { /** * Get the tags for the given object. * * @param mixed $target * @return array */ public static function from($target) { if ($tags = static::explicitTags([$target])) { return $tags; } return static::modelsFor([$target])->map(function ($model) { return FormatModel::given($model); })->all(); } /** * Determine the tags for the given job. * * @param mixed $job * @return array */ public static function fromJob($job) { if ($tags = static::extractExplicitTags($job)) { return $tags; } return static::modelsFor(static::targetsFor($job))->map(function ($model) { return FormatModel::given($model); })->all(); } /** * Determine the tags for the given array. * * @param array $data * @return array */ public static function fromArray(array $data) { return collect($data)->map(function ($value) { return static::resolveValue($value); })->collapse()->filter()->map(function ($model) { return FormatModel::given($model); })->all(); } /** * Extract tags from job object. * * @param mixed $job * @return array */ protected static function extractExplicitTags($job) { return $job instanceof CallQueuedListener ? static::tagsForListener($job) : static::explicitTags(static::targetsFor($job)); } /** * Determine tags for the given queued listener. * * @param mixed $job * @return array */ protected static function tagsForListener($job) { return collect( [static::extractListener($job), static::extractEvent($job)] )->map(function ($job) { return static::from($job); })->collapse()->unique()->toArray(); } /** * Determine tags for the given job. * * @param array $targets * @return array */ protected static function explicitTags(array $targets) { return collect($targets)->map(function ($target) { return method_exists($target, 'tags') ? $target->tags() : []; })->collapse()->unique()->all(); } /** * Get the actual target for the given job. * * @param mixed $job * @return array */ protected static function targetsFor($job) { switch (true) { case $job instanceof BroadcastEvent: return [$job->event]; case $job instanceof CallQueuedListener: return [static::extractEvent($job)]; case $job instanceof SendQueuedMailable: return [$job->mailable]; case $job instanceof SendQueuedNotifications: return [$job->notification]; default: return [$job]; } } /** * Get the models from the given object. * * @param array $targets * @return \Illuminate\Support\Collection */ protected static function modelsFor(array $targets) { return collect($targets)->map(function ($target) { return collect((new ReflectionClass($target))->getProperties())->map(function ($property) use ($target) { $property->setAccessible(true); if (PHP_VERSION_ID < 70400 || ! is_object($target) || $property->isInitialized($target)) { return static::resolveValue($property->getValue($target)); } })->collapse()->filter(); })->collapse()->unique(); } /** * Extract the listener from a queued job. * * @param mixed $job * @return mixed * * @throws \ReflectionException */ protected static function extractListener($job) { return (new ReflectionClass($job->class))->newInstanceWithoutConstructor(); } /** * Extract the event from a queued job. * * @param mixed $job * @return mixed */ protected static function extractEvent($job) { return isset($job->data[0]) && is_object($job->data[0]) ? $job->data[0] : new stdClass; } /** * Resolve the given value. * * @param mixed $value * @return \Illuminate\Support\Collection|null */ protected static function resolveValue($value) { switch (true) { case $value instanceof Model: return collect([$value]); case $value instanceof Collection: return $value->flatten(); } } }
Back to File Manager