phptools yes, we are "guessing" facades from the register method. If it's not clear, what type it returns, we don't recognize it at all.

This mechanism should provide good-enough IntelliSense for developers not using ide-helper or .phpstorm.meta. ...

Anyways; we'll work on it, any feedback appreciated so we can make it better.

JakubMisek

Thanks! I just found what PHP Tools can't parse, it is common to write as follows too:

$this->app->singleton('payment/paypal', function ($app) {
    return app(Payment\PayPal::class); // this is supposed to work too
});

JakubMisek

After some thought, it might be a good idea to make the language server understand:

app(PayPal::class) will return an instance of PayPal
app(Format::class) will return an instance of Format
likewise for resolve(...)

To prevent wrong behavior with other PHP frameworks, this could be a configurable Laravel setting.

phptools you're right. We have relied on ide-helper and generated phpstorm meta actually, but it's a good idea to support those cases out-of-the-box. We already handle most of the Laravel/Facade/Services cases anyways.

    2 months later

    Hi, possible?

    Otherwise my code looks very ugly like this

    $paypal = app(PayPal::class);
    /** @var \App\External\PayPal $paypal */
    $paypal->doSomething();
      5 days later

      phptools code like

      $paypal = app(PayPal::class);

      needs the app() function to be annotated so the editor will understand its return type.

      There are several ways of doing so, but I guess the app() function is from Laravel package so you cannot change it.

      • using generics:
        /**
         * @template TName
         * @param class-string<TName> $abstract
         * @return TName
         */
        function app($abstract = null, array $parameters = []) {
      • or using the (usually generated) .phpstorm.meta.php
        \app(0), map([
                '' => '@',
                ]);

        JakubMisek

        1. Yes, it is Laravel but I need it only 2 or 3 functions.

        2. Must the filename be .phpstorm.meta.php? Where should it be located?

          phptools

          Must the filename be .phpstorm.meta.php? Where should it be located?

          Yes, it's a special notation introduced by JetBrains (docs).

          The file can be anywhere in your workspace, named .phpstorm.meta.php with the following content:

          (edited)

          namespace PHPSTORM_META {
            override(
              \app(0), map([ '' => '@', ])
            );
          }

          Usually, it's generated using tools like https://github.com/barryvdh/laravel-ide-helper

            9 days later

            Let me manually create the file and try. Thanks!

            I created the .phpstorm.meta.php file in 1 of the folders of my multiroot workspace, with and without <?php.

            Still doesn't detect.

              phptools sorry for that! the snippet was not complete.

              This is correct:

              namespace PHPSTORM_META {
                override(
                  \app(0), map([ '' => '@', ])
                );
              }
                Write a Reply...