larastan / larastan

⚗️ Adds code analysis to Laravel improving developer productivity and code quality.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

'Static call to instance method' issue in custom facades

MMMahmoodian opened this issue · comments

  • Larastan Version: 2.6.4
  • --level used: 1

Description

Hey there. I recently found Larastan/PHPStan and we're trying to implement it in one of our projects. Its a pretty huge project and we are starting at level 1. One of the most common issues we are facing is 'Static call to instance method'. We have a facade for generating our responses and we added the methods to the facade class with method annotation but it doesn't work. I checked other built-in facades like Auth and they are perfectly fine. I compared them but didn't find any major differences. I added both the function call and facade below.
This is my first time opening an issue in an open-source repository. So beforehand I'm sorry if I'm doing it the wrong way. If you need any more information please let me know.

Laravel code where the issue was found

Calling static function:

    public function foo()
    {
        return Response::success([], Response::HTTP_OK);
    }

My facade:

<?php

namespace Dataak\Response\Facades;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\Facade;

/**
 * @method static success($result, int $statusCode = 200, $meta = null)
 * @method static error(string $error, int $statusCode = 500, bool $external = false, $meta = null)
 * @method static unauthorized(int $statusCode = 401, bool $external = false, $meta = null)
 * @method static unauthorizedAction(bool $external = false, int $statusCode = 401, $meta = null)
 * @method static validationError($field, $messages = null, bool $external = false, $meta = null, int $statusCode = 422)
 * @method static withEloquent(Builder $builder, int $statusCode = 200, ?callable $callable = null)
 * @method static singleObject($object, int $statusCode = 200, ?callable $callable = null)
 * @method static bulk(array $valueObjects, int $statusCode = 200, $meta = null)
 * @method static unauthenticated($statusCode = 401, int $statusCode = 401, $meta = null)
 * @method static allow($message = null, $statusCode = null)
 * @method static deny($message = null, $statusCode = null)
 */
class Response extends Facade
{
    const HTTP_CONTINUE = 100;
    const HTTP_SWITCHING_PROTOCOLS = 101;
    const HTTP_PROCESSING = 102;            // RFC2518
    const HTTP_EARLY_HINTS = 103;           // RFC8297
    const HTTP_OK = 200;
    const HTTP_CREATED = 201;
    const HTTP_ACCEPTED = 202;
    const HTTP_NON_AUTHORITATIVE_INFORMATION = 203;
    const HTTP_NO_CONTENT = 204;
    const HTTP_RESET_CONTENT = 205;
    const HTTP_PARTIAL_CONTENT = 206;
    const HTTP_MULTI_STATUS = 207;          // RFC4918
    const HTTP_ALREADY_REPORTED = 208;      // RFC5842
    const HTTP_IM_USED = 226;               // RFC3229
    const HTTP_MULTIPLE_CHOICES = 300;
    const HTTP_MOVED_PERMANENTLY = 301;
    const HTTP_FOUND = 302;
    const HTTP_SEE_OTHER = 303;
    const HTTP_NOT_MODIFIED = 304;
    const HTTP_USE_PROXY = 305;
    const HTTP_RESERVED = 306;
    const HTTP_TEMPORARY_REDIRECT = 307;
    const HTTP_PERMANENTLY_REDIRECT = 308;  // RFC7238
    const HTTP_BAD_REQUEST = 400;
    const HTTP_UNAUTHORIZED = 401;
    const HTTP_PAYMENT_REQUIRED = 402;
    const HTTP_FORBIDDEN = 403;
    const HTTP_NOT_FOUND = 404;
    const HTTP_METHOD_NOT_ALLOWED = 405;
    const HTTP_NOT_ACCEPTABLE = 406;
    const HTTP_PROXY_AUTHENTICATION_REQUIRED = 407;
    const HTTP_REQUEST_TIMEOUT = 408;
    const HTTP_CONFLICT = 409;
    const HTTP_GONE = 410;
    const HTTP_LENGTH_REQUIRED = 411;
    const HTTP_PRECONDITION_FAILED = 412;
    const HTTP_REQUEST_ENTITY_TOO_LARGE = 413;
    const HTTP_REQUEST_URI_TOO_LONG = 414;
    const HTTP_UNSUPPORTED_MEDIA_TYPE = 415;
    const HTTP_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
    const HTTP_EXPECTATION_FAILED = 417;
    const HTTP_I_AM_A_TEAPOT = 418;                                               // RFC2324
    const HTTP_MISDIRECTED_REQUEST = 421;                                         // RFC7540
    const HTTP_UNPROCESSABLE_ENTITY = 422;                                        // RFC4918
    const HTTP_LOCKED = 423;                                                      // RFC4918
    const HTTP_FAILED_DEPENDENCY = 424;                                           // RFC4918
    const HTTP_TOO_EARLY = 425;                                                   // RFC-ietf-httpbis-replay-04
    const HTTP_UPGRADE_REQUIRED = 426;                                            // RFC2817
    const HTTP_PRECONDITION_REQUIRED = 428;                                       // RFC6585
    const HTTP_TOO_MANY_REQUESTS = 429;                                           // RFC6585
    const HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = 431;                             // RFC6585
    const HTTP_UNAVAILABLE_FOR_LEGAL_REASONS = 451;
    const HTTP_INTERNAL_SERVER_ERROR = 500;
    const HTTP_NOT_IMPLEMENTED = 501;
    const HTTP_BAD_GATEWAY = 502;
    const HTTP_SERVICE_UNAVAILABLE = 503;
    const HTTP_GATEWAY_TIMEOUT = 504;
    const HTTP_VERSION_NOT_SUPPORTED = 505;
    const HTTP_VARIANT_ALSO_NEGOTIATES_EXPERIMENTAL = 506;                        // RFC2295
    const HTTP_INSUFFICIENT_STORAGE = 507;                                        // RFC4918
    const HTTP_LOOP_DETECTED = 508;                                               // RFC5842
    const HTTP_NOT_EXTENDED = 510;                                                // RFC2774
    const HTTP_NETWORK_AUTHENTICATION_REQUIRED = 511;

    public static function getFacadeAccessor()
    {
        return 'dataak-response';
    }
}

Hi,

This is somewhat expected. Feel free to use a regex to ignore these errors. Something like '#^Static call to instance method Dataak\\\Response\\\Facades\\[a-zA-Z0-9\\_]+::[a-zA-Z0-9\\_]+\(\)#' should work.