Compare commits

..
12 Commits
Author SHA1 Message Date
Barry vd. Heuvel eda37f3442 Catch PDO errors when getting drivers/connections 2013-07-12 14:39:12 +02:00
Barry vd. Heuvel e9cbd7e732 Allow 4.1 (and future version) 2013-07-04 14:30:33 +02:00
Barry vd. Heuvel ac6740f59f Change aliasing way back
Not really nice in NetBeans.
Also reference the calling class and show the implementing class in
comments (phpStorm will understand it anyways)
2013-07-04 14:26:17 +02:00
Barry vd. Heuvel 60ec740b15 Update CodeIntel link 2013-07-02 22:22:56 +02:00
Barry vd. Heuvel aedd2ee127 Get classes from managers 2013-07-02 22:13:47 +02:00
Barry vd. Heuvel 007a96ef3f Update way of creating aliases
Again.. Sublime didn't really understand it. Passing null as parameters
to avoid errors.
2013-07-02 21:10:55 +02:00
Barry vd. Heuvel 63b1026fc3 Update phpDocs 2013-06-28 14:29:11 +02:00
Barry vd. Heuvel d042c6ea8e Only scan public methods
__call magic kicks in if the function is protected.
2013-06-28 13:24:24 +02:00
Barry vd. Heuvel ae0dce2abd Remove static overrides, because Laravel fixed this. 2013-06-28 13:22:28 +02:00
Barry vd. Heuvel 7f17da57b2 Update readme 2013-06-24 14:51:08 +02:00
Barry vd. Heuvel 0f22941e51 Update readme 2013-06-24 14:48:16 +02:00
Barry vd. Heuvel f7f0e025f3 Add reset option for Model command 2013-06-24 14:48:10 +02:00
5 changed files with 109 additions and 35 deletions
+4 -4
View File
@@ -11,11 +11,11 @@
],
"require": {
"php": ">=5.3.0",
"illuminate/support": "4.0.x",
"illuminate/console": "4.0.x",
"illuminate/filesystem": "4.0.x",
"illuminate/support": "4.x",
"illuminate/console": "4.x",
"illuminate/filesystem": "4.x",
"barryvdh/reflection-docblock": ">=2.0.1",
"symfony/class-loader": "2.3.*"
"symfony/class-loader": "~2.3"
},
"autoload": {
"psr-0": {
+20 -9
View File
@@ -8,7 +8,7 @@ If you don't want to generate it, you can add a pre-generated file to the root f
* Generated version: https://gist.github.com/barryvdh/5227822
Note: You do need CodeIntel for Sublime Text: https://github.com/Kronuz/SublimeCodeIntel
Note: You do need CodeIntel for Sublime Text: https://github.com/SublimeCodeIntel/SublimeCodeIntel
### Automatic phpDoc generation for Laravel Facades
@@ -54,19 +54,30 @@ If you don't want to write your properties yourself, you can use the command `id
phpDocs, based on table columns, relations and getters/setters. Still in beta, so please provide feedback if you want.
Docs are written to a phpfile (_ide_helper_models.php) in the root of the project, so you can move the docs to the real model.
You can now also write the comments directly to your Model file, using the -W argument. Please make sure to backup your models, before writing the info.
You can now also write the comments directly to your Model file, using the `--write (-W)` option. Please make sure to backup your models, before writing the info.
It should keep the existing comments and only append new properties/methods. The existing phpdoc is replaced, or added if not found.
With the `--reset (-R)` option, the existing phpdocs are ignored, only the newly found columns/relations are saved as phpdocs.
php artisan ide-helper:models Post
/**
* An Eloquent Model: 'Post'
*
* @property integer $id
* @property integer $author_id
* @property string $title
* @property string $text
* @property \Carbon\Carbon $created_at
* @property \Carbon\Carbon $updated_at
* @property-read \User $author
* @property-read \Illuminate\Database\Eloquent\Collection|\Comment[] $comments
*/
For now, only models in app/models are scanned. The optional argument tells what models to use (also outside app/models).
`php artisan ide-helper:models Post,User`
Note: With namespaces, uses \\ instead of \
`php artisan ide-helper:models API\\User`
This creates a file with the phpDocs for each Model. You should check and change them to be more accurate.
Also, all relations are Eloquent|Eloquent[] by default, you can change them to the actual Model.
After copying the phpdocs to your model, you can clear the file, so your IDE only uses the real source.
php artisan ide-helper:models Post,User
Note: With namespaces, uses `\\` instead of `\`: `php artisan ide-helper:models API\\User`
### License
@@ -157,6 +157,12 @@ exit('Only to be used as an helper for your IDE');\n\n";
$addOutput = ($root !== $facade);
$output .= $this->getMethods($root, $alias, $usedMethods, $addOutput);
$driver = $this->getDriver($alias);
if($driver){
$output .= $this->getMethods($driver, $alias, $usedMethods);
}
//Add extra methods, from other classes (magic static calls)
if(array_key_exists($alias, $this->extra)){
$output .= $this->getMethods($this->extra[$alias], $alias, $usedMethods);
@@ -183,6 +189,12 @@ exit('Only to be used as an helper for your IDE');\n\n";
return $output;
}
/**
* Get the real root of a facade
*
* @param $facade
* @return bool|string
*/
protected function getRoot($facade){
try{
//If possible, get the facade root
@@ -210,6 +222,37 @@ exit('Only to be used as an helper for your IDE');\n\n";
}
}
public function getDriver($alias){
try{
if($alias == "Auth"){
$driver = \Auth::driver();
}elseif($alias == "DB"){
$driver = \DB::connection();
}elseif($alias == "Cache"){
$driver = \Cache::driver();
}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;
}
}
/**
* Get the methods for one or multiple classes.
*
* @param $classes
* @param $alias
* @param $usedMethods
* @param bool $addOutput
* @return string
*/
protected function getMethods($classes, $alias, &$usedMethods, $addOutput = true){
if(!is_array($classes)){
$classes = array($classes);
@@ -221,14 +264,14 @@ exit('Only to be used as an helper for your IDE');\n\n";
}
$reflection = new \ReflectionClass($class);
$methods = $reflection->getMethods();
$methods = $reflection->getMethods(\ReflectionMethod::IS_PUBLIC);
if($methods)
{
foreach ($methods as $method)
{
if(!in_array($method->name, $usedMethods)){
if($method->isPublic() && $addOutput){
$output .= $this->parseMethod($method, $alias);
if( $addOutput){
$output .= $this->parseMethod($method, $alias, $reflection);
}
$usedMethods[] = $method->name;
}
@@ -237,15 +280,13 @@ exit('Only to be used as an helper for your IDE');\n\n";
}
return $output;
}
/**
* @param \ReflectionMethod $method
* @param string $alias
* @param string $root
* @param bool $static
* @param string $rootParam
* @return string
*/
protected function parseMethod($method, $alias){
protected function parseMethod($method, $alias, $class){
$output = '';
// Don't add the __clone() functions
@@ -281,8 +322,14 @@ exit('Only to be used as an helper for your IDE');\n\n";
$return = ($returnValue && $returnValue !== "void" && $method->name !== "__construct") ? 'return' : '';
//Reference the 'real' function in the declaringclass
$root = $method->getDeclaringClass()->getName();
$output .= "\t\t$return \\$root::";
$declaringClass = $method->getDeclaringClass();
$root = $class->getName();
if($declaringClass->name != $root){
$output .= "\t\t//Method inherited from $declaringClass->name\r\n";
}
$output .= "\t\t$return $root::";
//Write the default parameters in the function call
$output .= $method->name."(".implode($params, ", ").");\r\n";
@@ -291,6 +338,12 @@ exit('Only to be used as an helper for your IDE');\n\n";
return $output;
}
/**
* Get the description and get the inherited docs.
*
* @param $phpdoc
* @param $method
*/
protected function normalizeDescription(&$phpdoc, $method){
//Get the short + long description from the DocBlock
$description = $phpdoc->getText();
@@ -314,6 +367,14 @@ exit('Only to be used as an helper for your IDE');\n\n";
}
}
/**
* Make some changes to the return types, if needed.
*
* @param $phpdoc
* @param $method
* @param $alias
* @return null
*/
protected function normalizeReturn(&$phpdoc, $method, $alias){
//Get the return type and adjust them for beter autocomplete
$returnTags = $phpdoc->getTagsByName('return');
@@ -324,14 +385,6 @@ exit('Only to be used as an helper for your IDE');\n\n";
if($method->name == "__construct"){
$tag->setType('self');
}elseif($alias == 'Eloquent' and
(in_array($method->name, array('pluck', 'first', 'fill', 'newInstance', 'newFromBuilder', 'create', 'find', 'findOrFail'))
or $returnValue === '\Illuminate\Database\Query\Builder')){
//Reference the calling class, to provide more accurate auto-complete
$tag->addType('static');
}elseif($alias == 'Eloquent' and in_array($method->name, array('all', 'get'))){
$tag->addType('\Eloquent[]');
$tag->addType('static[]');
}elseif($alias == 'Eloquent' and in_array($method->name, array('hasOne', 'hasMany', 'belongsTo', 'belongsToMany', 'morphOne', 'morphTo', 'morphMany'))){
$tag->addType('\Eloquent');
}
@@ -341,6 +394,12 @@ exit('Only to be used as an helper for your IDE');\n\n";
return $returnValue;
}
/**
* Get the parameters and format them correctly
*
* @param $method
* @return array
*/
public function getParameters($method){
//Loop through the default values for paremeters, and make the correct output string
$params = array();
@@ -42,6 +42,7 @@ class ModelsCommand extends Command {
protected $methods = array();
protected $write = false;
protected $dir;
protected $reset;
@@ -56,6 +57,7 @@ class ModelsCommand extends Command {
$this->write = $this->option('write');
$this->dir = $this->option('dir');
$model = $this->argument('model');
$this->reset = $this->option('reset');
$content = $this->generateDocs($model);
@@ -95,6 +97,7 @@ class ModelsCommand extends Command {
array('filename', 'F', InputOption::VALUE_OPTIONAL, 'The path to the helper file', '_ide_helper_models.php'),
array('dir', 'D', InputOption::VALUE_OPTIONAL, 'The model dir','app/models'),
array('write', 'W', InputOption::VALUE_NONE, 'Write to Model file'),
array('reset', 'R', InputOption::VALUE_NONE, 'Remove the original phpdocs instead of appending'),
);
}
@@ -310,7 +313,12 @@ class ModelsCommand extends Command {
$namespace = $reflection->getNamespaceName();
$classname = $reflection->getShortName();
$originalDoc = $reflection->getDocComment();
$phpdoc = new DocBlock($reflection, new Context($namespace));
if($this->reset){
$phpdoc = new DocBlock('', new Context($namespace));
}else{
$phpdoc = new DocBlock($reflection, new Context($namespace));
}
if(!$phpdoc->getText()){
$phpdoc->setText("An Eloquent Model: '$class'");
-4
View File
@@ -40,10 +40,6 @@ return array(
*/
'extra' => array(
'Auth' => array('Illuminate\Auth\Guard'),
'Cache' => array('Illuminate\Cache\StoreInterface', 'Illuminate\Cache\Repository'),
'DB' => array('Illuminate\Database\Connection'),
'Queue' => array('Illuminate\Queue\QueueInterface'),
'Eloquent' => array('Illuminate\Database\Eloquent\Builder', 'Illuminate\Database\Query\Builder'),
),