The problem with Silex, and Pimple in general, is that when you do:
$app = new \Pimple\Container();
$app['Foo'] = function () { return new \Acme\Foo(); };
$app['Bar'] = function () { return new \Acme\Bar(); };
PHPStorm has no way of knowing what’s going on in, or how to auto-complete, $app.
I’ve gotten around this in the past by creating an “Inception Proxy” alongside a .phpstorm.meta.php configuration but for a new Silex project I’ve inherited this is not possible.
Pro-tip: If your IDE doesn’t know what’s going on then neither will the poor jerks who inherit your code.
Looking for a solution to this I discovered the PHPStorm Silex Plugin. It’s a bit wonky but it does the job. (sometimes the IDE doesn’t recognize $app and I don’t know why yet.)
For the Silex Plugin to work it requires a manually created configuration file in the project root named “pimple.json”. This file more or less duplicates the functionality of .phpstorm.meta.php but I digress… Pimple.json can be automatically generated using Pimple Dumper.
The format of “pimple.json” looks like:
[
{
"name": "routes",
"type": "class",
"value": "Symfony\\Component\\Routing\\RouteCollection"
},
{
"name": "request.http_port",
"type": "int",
"value": 80
},
{
"name": "charset",
"type": "string",
"value": "UTF-8"
}
]
Once that file is in place, and you jiggle the IDE/Plugin, auto-complete comes alive! Horray for sanity.