telescope icon indicating copy to clipboard operation
telescope copied to clipboard

EventWatcher throws error when project is run through google drive when determining if string has the '@' symbol.

Open lucas-quinn-guru opened this issue 5 months ago • 1 comments

Telescope Version

5.2.2

Laravel Version

11.22.0

PHP Version

8.2

Database Driver & Version

PostgreSQL 15.1 on aarch64-apple-darwin22.1.0, compiled by Apple clang version 12.0.5 (clang-1205.0.22.9), 64-bit

Description

Google Drives stores directory structure under a users email address which catches an error during a class_implements() check since code is using the @ as a delimiter and string check.

I was able to fix this locally, but not sure it it's correct by adding GoogleDrive as an option to reject().

    protected function formatListeners($eventName)
    {
        return collect(app('events')->getListeners($eventName))
            ->map(function ($listener) {
                $listener = (new ReflectionFunction($listener))
                        ->getStaticVariables()['listener'];

                if (is_string($listener)) {
                    return Str::contains($listener, '@') ? $listener : $listener.'@handle';
                } elseif (is_array($listener) && is_string($listener[0])) {
                    return $listener[0].'@'.$listener[1];
                } elseif (is_array($listener) && is_object($listener[0])) {
                    return get_class($listener[0]).'@'.$listener[1];
                } elseif (is_object($listener) && is_callable($listener) && ! $listener instanceof Closure) {
                    return get_class($listener).'@__invoke';
                }

                return $this->formatClosureListener($listener);
            })->reject(function ($listener) {
                if( Str::contains($listener, 'Laravel\\Telescope') || Str::contains($listener, 'GoogleDrive') ) {
                    return true;
                }
                return false;
            })->map(function ($listener) {
                if (Str::contains($listener, '@') ) {
                    $queued = in_array(ShouldQueue::class, class_implements(Str::beforeLast($listener, '@')));
                }

                return [
                    'name' => $listener,
                    'queued' => $queued ?? false,
                ];
            })->values()->toArray();
    }

Steps To Reproduce

run any project with telescope and filamentphp installed stored and run from GoogleDrive.

lucas-quinn-guru avatar Sep 10 '24 06:09 lucas-quinn-guru