diff --git a/src/Generator.php b/src/Generator.php index 74d8fd8..39e2bf5 100644 --- a/src/Generator.php +++ b/src/Generator.php @@ -1,235 +1,245 @@ - - * @copyright 2014 Barry vd. Heuvel / Fruitcake Studio (http://www.fruitcakestudio.nl) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link https://github.com/barryvdh/laravel-ide-helper - */ - -namespace Barryvdh\LaravelIdeHelper; - -use Illuminate\Foundation\AliasLoader; -use Illuminate\Config\Repository as ConfigRepository; -use Symfony\Component\Console\Output\OutputInterface; - -class Generator -{ - /** @var \Illuminate\Config\Repository */ - protected $config; - - /** @var \Illuminate\View\Factory */ - protected $view; - - /** @var \Symfony\Component\Console\Output\OutputInterface */ - protected $output; - - protected $extra = array(); - protected $magic = array(); - protected $interfaces = array(); - protected $helpers; - - /** - * @param \Illuminate\Config\Repository $config - * @param \Illuminate\View\Factory $view - * @param \Symfony\Component\Console\Output\OutputInterface $output - * @param string $helpers - */ - public function __construct(ConfigRepository $config, - /* Illuminate\View\Factory */ $view, - OutputInterface $output = null, - $helpers = '' - ) { - $this->config = $config; - $this->view = $view; - - // Find the drivers to add to the extra/interfaces - $this->detectDrivers(); - - $this->extra = array_merge($this->extra, $this->config->get('laravel-ide-helper::extra')); - $this->magic = array_merge($this->magic, $this->config->get('laravel-ide-helper::magic')); - $this->interfaces = array_merge($this->interfaces, $this->config->get('laravel-ide-helper::interfaces')); - // Make all interface classes absolute - foreach ($this->interfaces as &$interface) { - $interface = '\\' . ltrim($interface, '\\'); - } - $this->helpers = $helpers; - } - - /** - * Generate the helper file contents; - * - * @param string $format The format to generate the helper in (php/json) - * @return string; - */ - public function generate($format = 'php') - { - // Check if the generator for this format exists - $method = 'generate'.ucfirst($format).'Helper'; - if (method_exists($this, $method)) { - return $this->$method(); - } - - return $this->generatePhpHelper(); - } - - public function generatePhpHelper() - { - $app = app(); - return $this->view->make('laravel-ide-helper::ide-helper') - ->with('namespaces', $this->getNamespaces()) - ->with('helpers', $this->helpers) - ->with('version', $app::VERSION) - ->render(); - } - - public function generateJsonHelper() - { - $classes = array(); - foreach ($this->getNamespaces() as $aliases) { - foreach($aliases as $alias) { - $functions = array(); - foreach ($alias->getMethods() as $method) { - $functions[$method->getName()] = '('. $method->getParamsWithDefault().')'; - } - $classes[$alias->getAlias()] = array( - 'functions' => $functions, - ); - } - } - - $flags = JSON_FORCE_OBJECT; - if (defined('JSON_PRETTY_PRINT')) { - $flags |= JSON_PRETTY_PRINT; - } - - return json_encode(array( - 'php' => array( - 'classes' => $classes, - ), - ), $flags); - } - - protected function detectDrivers() - { - try{ + + * @copyright 2014 Barry vd. Heuvel / Fruitcake Studio (http://www.fruitcakestudio.nl) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link https://github.com/barryvdh/laravel-ide-helper + */ + +namespace Barryvdh\LaravelIdeHelper; + +use /** @noinspection PhpUndefinedNamespaceInspection,PhpUndefinedClassInspection */Illuminate\Foundation\AliasLoader; +use Illuminate\Config\Repository as ConfigRepository; +use Symfony\Component\Console\Output\OutputInterface; + +class Generator +{ + /** @var \Illuminate\Config\Repository */ + protected $config; + + /** @var \Illuminate\View\Factory */ + protected $view; + + /** @var \Symfony\Component\Console\Output\OutputInterface */ + protected $output; + + protected $extra = array(); + protected $magic = array(); + protected $interfaces = array(); + protected $helpers; + + /** + * @param \Illuminate\Config\Repository $config + * @param \Illuminate\View\Factory $view + * @param \Symfony\Component\Console\Output\OutputInterface $output + * @param string $helpers + */ + public function __construct(ConfigRepository $config, $view, OutputInterface $output = null, $helpers = '') + { + $this->config = $config; + $this->view = $view; + + // Find the drivers to add to the extra/interfaces + $this->detectDrivers(); + + $this->extra = array_merge($this->extra, $this->config->get('laravel-ide-helper::extra')); + $this->magic = array_merge($this->magic, $this->config->get('laravel-ide-helper::magic')); + $this->interfaces = array_merge($this->interfaces, $this->config->get('laravel-ide-helper::interfaces')); + + // Make all interface classes absolute + foreach ($this->interfaces as &$interface) { + $interface = '\\' . ltrim($interface, '\\'); + } + $this->helpers = $helpers; + } + + /** + * Generate the helper file contents; + * + * @param string $format The format to generate the helper in (php/json) + * @return string; + */ + public function generate($format = 'php') + { + // Check if the generator for this format exists + $method = 'generate' . ucfirst($format) . 'Helper'; + if (method_exists($this, $method)) { + return $this->$method(); + } + + return $this->generatePhpHelper(); + } + + public function generatePhpHelper() + { + $app = app(); + return $this->view->make('laravel-ide-helper::ide-helper') + ->with('namespaces', $this->getNamespaces()) + ->with('helpers', $this->helpers) + ->with('version', $app::VERSION) + ->render(); + } + + public function generateJsonHelper() + { + $classes = array(); + foreach ($this->getNamespaces() as $aliases) { + foreach ($aliases as $alias) { + $functions = array(); + foreach ($alias->getMethods() as $method) { + $functions[$method->getName()] = '(' . $method->getParamsWithDefault() . ')'; + } + $classes[$alias->getAlias()] = array( + 'functions' => $functions, + ); + } + } + + $flags = JSON_FORCE_OBJECT; + if (defined('JSON_PRETTY_PRINT')) { + $flags |= JSON_PRETTY_PRINT; + } + + return json_encode(array( + 'php' => array( + 'classes' => $classes, + ), + ), $flags); + } + + protected function detectDrivers() + { + try { if (class_exists('Auth') && is_a('Auth', '\Illuminate\Support\Facades\Auth', true)) { - $class = get_class(\Auth::driver()); - $this->extra['Auth'] = array($class); - $this->interfaces['\Illuminate\Auth\UserProviderInterface'] = $class; - } - }catch (\Exception $e) {} - - try{ - if (class_exists('DB') && is_a('DB', '\Illuminate\Support\Facades\DB', true)) { - $class = get_class(\DB::connection()); - $this->extra['DB'] = array($class); - $this->interfaces['\Illuminate\Database\ConnectionInterface'] = $class; - } - }catch (\Exception $e) {} - - try{ - if (class_exists('Cache') && is_a('Cache', '\Illuminate\Support\Facades\Cache', true)) { - $driver = get_class(\Cache::driver()); - $store = get_class(\Cache::getStore()); - $this->extra['Cache'] = array($driver, $store); - $this->interfaces['\Illuminate\Cache\StoreInterface'] = $store; - } - }catch (\Exception $e) {} - - try{ - if (class_exists('Queue') && is_a('Queue', '\Illuminate\Support\Facades\Queue', true)) { - $class = get_class(\Queue::connection()); - $this->extra['Queue'] = array($class); - $this->interfaces['\Illuminate\Queue\QueueInterface'] = $class; - } - }catch (\Exception $e) {} - - try{ - if (class_exists('SSH') && is_a('SSH', '\Illuminate\Support\Facades\SSH', true)){ - $class = get_class(\SSH::connection()); - $this->extra['SSH'] = array($class); - $this->interfaces['\Illuminate\Remote\ConnectionInterface'] = $class; - } - }catch (\Exception $e) {} - - } - - /** - * Find all namespaces/aliases that are valid for us to render - * - * @return array - */ - protected function getNamespaces() - { - $namespaces = array(); - - // Get all aliases - foreach (AliasLoader::getInstance()->getAliases() as $name => $facade) { - $magicMethods = array_key_exists($name, $this->magic) ? $this->magic[$name] : array(); - $alias = new Alias($name, $facade, $magicMethods, $this->interfaces); - if ($alias->isValid()) { - - //Add extra methods, from other classes (magic static calls) - if (array_key_exists($name, $this->extra)) { - $alias->addClass($this->extra[$name]); - } - - $namespace = $alias->getNamespace(); - if (!isset($namespaces[$namespace])) { - $namespaces[$namespace] = array(); - } - $namespaces[$namespace][] = $alias; - } - - } - - return $namespaces; - } - - /** - * Get the driver/connection/store from the managers - * - * @param $alias - * @return array|bool|string - */ - public function getDriver($alias) - { - try { - if ($alias == "Auth") { - $driver = \Auth::driver(); - } elseif ($alias == "DB") { - $driver = \DB::connection(); - } elseif ($alias == "Cache") { - $driver = get_class(\Cache::driver()); - $store = get_class(\Cache::getStore()); - return array($driver, $store); - } elseif ($alias == "Queue") { - $driver = \Queue::connection(); - } else { - return false; - } - - return get_class($driver); - } catch (\Exception $e) { - $this->error("Could not determine driver/connection for $alias."); - return false; - } - } - - /** - * Write a string as error output. - * - * @param string $string - * @return void - */ - protected function error($string) - { - if($this->output){ - $this->output->writeln("$string"); - }else{ - echo $string . "\r\n"; - } - } -} + /** @noinspection PhpUndefinedClassInspection */ + $class = get_class(\Auth::driver()); + $this->extra['Auth'] = array($class); + $this->interfaces['\Illuminate\Auth\UserProviderInterface'] = $class; + } + } catch (\Exception $e) {} + + try { + if (class_exists('DB') && is_a('DB', '\Illuminate\Support\Facades\DB', true)) { + /** @noinspection PhpUndefinedClassInspection */ + $class = get_class(\DB::connection()); + $this->extra['DB'] = array($class); + $this->interfaces['\Illuminate\Database\ConnectionInterface'] = $class; + } + } catch (\Exception $e) {} + + try { + if (class_exists('Cache') && is_a('Cache', '\Illuminate\Support\Facades\Cache', true)) { + /** @noinspection PhpUndefinedClassInspection */ + $driver = get_class(\Cache::driver()); + /** @noinspection PhpUndefinedClassInspection */ + $store = get_class(\Cache::getStore()); + $this->extra['Cache'] = array($driver, $store); + $this->interfaces['\Illuminate\Cache\StoreInterface'] = $store; + } + } catch (\Exception $e) {} + + try { + if (class_exists('Queue') && is_a('Queue', '\Illuminate\Support\Facades\Queue', true)) { + /** @noinspection PhpUndefinedClassInspection */ + $class = get_class(\Queue::connection()); + $this->extra['Queue'] = array($class); + $this->interfaces['\Illuminate\Queue\QueueInterface'] = $class; + } + } catch (\Exception $e) {} + + try { + if (class_exists('SSH') && is_a('SSH', '\Illuminate\Support\Facades\SSH', true)) { + /** @noinspection PhpUndefinedClassInspection */ + $class = get_class(\SSH::connection()); + $this->extra['SSH'] = array($class); + $this->interfaces['\Illuminate\Remote\ConnectionInterface'] = $class; + } + } catch (\Exception $e) {} + + } + + /** + * Find all namespaces/aliases that are valid for us to render + * + * @return array|Alias[][] + */ + protected function getNamespaces() + { + $namespaces = array(); + + // Get all aliases + /** @noinspection PhpUndefinedClassInspection */ + foreach (AliasLoader::getInstance()->getAliases() as $name => $facade) { + $magicMethods = array_key_exists($name, $this->magic) ? $this->magic[$name] : array(); + $alias = new Alias($name, $facade, $magicMethods, $this->interfaces); + if ($alias->isValid()) { + + //Add extra methods, from other classes (magic static calls) + if (array_key_exists($name, $this->extra)) { + $alias->addClass($this->extra[$name]); + } + + $namespace = $alias->getNamespace(); + if (!isset($namespaces[$namespace])) { + $namespaces[$namespace] = array(); + } + $namespaces[$namespace][] = $alias; + } + + } + + return $namespaces; + } + + /** + * Get the driver/connection/store from the managers + * + * @param $alias + * @return array|bool|string + */ + public function getDriver($alias) + { + try { + if ($alias == 'Auth') { + /** @noinspection PhpUndefinedClassInspection */ + $driver = \Auth::driver(); + } elseif ($alias == 'DB') { + /** @noinspection PhpUndefinedClassInspection */ + $driver = \DB::connection(); + } elseif ($alias == 'Cache') { + /** @noinspection PhpUndefinedClassInspection */ + $driver = get_class(\Cache::driver()); + /** @noinspection PhpUndefinedClassInspection */ + $store = get_class(\Cache::getStore()); + return array($driver, $store); + } elseif ($alias == 'Queue') { + /** @noinspection PhpUndefinedClassInspection */ + $driver = \Queue::connection(); + } else { + return false; + } + + return get_class($driver); + } catch (\Exception $e) { + $this->error("Could not determine driver/connection for $alias."); + return false; + } + } + + /** + * Write a string as error output. + * + * @param string $string + * @return void + */ + protected function error($string) + { + if ($this->output) { + $this->output->writeln("$string"); + } else { + echo $string . "\r\n"; + } + } +}