Compare commits

...
22 Commits
Author SHA1 Message Date
Barry vd. Heuvel df8852e8dd Use FQN for extending/root
Otherwise it doesn't work in namespaces.
2014-03-18 14:22:52 +01:00
Barry vd. Heuvel 95ab3676dc Merge pull request #71 from szkuwa/master
Wrapping everything with namespaces to allow namespaced aliases
2014-03-18 14:14:18 +01:00
Michał Bieda bf6ca64a08 Wrapping everything with namespaces to allow namespaced aliases 2014-03-18 13:59:57 +01:00
Barry vd. Heuvel 4e36c08168 Update readme 2014-03-05 18:35:42 +01:00
Barry vd. Heuvel 0577429e4e Merge pull request #67 from SebSept/master
"An Eloquent Model:" is not necessary, removed it.
2014-03-04 08:49:25 +01:00
Sébastien Monterisi 77fbef112d "An Eloquent Model:" is not necessary, removed it.
Not needind it since that information is gathered by IDE* with class definition.

```class Party extends Eloquent {```

*:(almost all ide will, I guess)
2014-03-04 02:25:02 +01:00
Barry vd. Heuvel bb92081dde Merge pull request #65 from hailwood/patch-1
Update ModelsCommand.php
2014-02-25 10:03:02 +01:00
Matthew Hailwood 23b41db33d Update ModelsCommand.php
Fix for #61 - also returns query builder instance
2014-02-23 18:05:03 +13:00
Barry vd. Heuvel 7b47af171d Use getDates() for type check
Fixes #63
2014-02-21 12:00:54 +01:00
Barry vd. Heuvel 512574de9a Add dynamic whereField()
Fixes #61
Also added backslash to method return types and use full Str facade, not
an alias.
2014-02-21 11:51:39 +01:00
Barry vd. Heuvel 46558e9060 Typo in method name check
Fixes #62
2014-02-21 11:28:59 +01:00
Barry vd. Heuvel f79776d06f Merge pull request #60 from briankiewel/patch-1
Update readme.md
2014-02-19 14:40:47 +01:00
Brian Kiewel 6a1f7d61cf Update readme.md
Escaped underscores in model file name and spelling correction
2014-02-19 08:35:43 -05:00
Barry vd. Heuvel 14cd044103 Catch exception for normalizing
Mainly for catching exceptions in inheritdoc etc. Should fix #59
2014-02-14 11:48:19 +01:00
Barry vd. Heuvel b6a9d8e4f9 Update readme 2014-02-07 10:36:05 +01:00
Barry vd. Heuvel e6493fd9e8 Tweak multiple models
Use array instead of comma seperated
2014-02-07 10:05:51 +01:00
Barry vd. Heuvel caeb0227b6 Check if the class is a model before instantiating 2014-02-07 09:51:09 +01:00
Barry vd. Heuvel 948eb369a6 Add additional directories
For #57 (and #58), tweak a bit.
Make the input option an array, so commandline can also add multiple
dirs. Add app/models to the config, prepend the base_path() to every
dir.
2014-02-07 09:50:07 +01:00
Matthew Hailwood 107fda3c20 Add support for model_locations 2014-02-07 12:11:17 +13:00
Matthew Hailwood 0166a1bc9b Update config.php
Add model_locations key
2014-02-07 12:09:31 +13:00
Barry vd. Heuvel cae77c279d Allow multi-line relations
Fixes #56
Searches for $this->hasMany( etc.
Also allows both " and ' quotes.
2014-02-06 10:45:31 +01:00
Barry vd. Heuvel 2c3c1e96d5 Add CacheStore 2014-02-03 13:10:09 +01:00
4 changed files with 177 additions and 119 deletions
+6 -3
View File
@@ -30,6 +30,7 @@ You can configure your composer.json to do this after each commit:
"scripts":{ "scripts":{
"post-update-cmd":[ "post-update-cmd":[
"php artisan clear-compiled",
"php artisan ide-helper:generate", "php artisan ide-helper:generate",
"php artisan optimize", "php artisan optimize",
] ]
@@ -53,7 +54,7 @@ The Illuminate/Support/helpers.php is already set-up, but you can add/remove you
If you don't want to write your properties yourself, you can use the command `ide-helper:models` to generate If you don't want to write your properties yourself, you can use the command `ide-helper:models` to generate
phpDocs, based on table columns, relations and getters/setters. Still in beta, so please provide feedback if you want. phpDocs, based on table columns, relations and getters/setters. Still in beta, so please provide feedback if you want.
You can now also write the comments directly to your Model file, using the `--write (-W)` option. By default, you are asked to overwrite or You can now also write the comments directly to your Model file, using the `--write (-W)` option. By default, you are asked to overwrite or
write to a seperate file (_ide_helper_models.php) (You can force No with `--nowrite (-N)`). write to a separate file (\_ide\_helper\_models.php) (You can force No with `--nowrite (-N)`).
Please make sure to backup your models, before writing the info. 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. 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. With the `--reset (-R)` option, the existing phpdocs are ignored, only the newly found columns/relations are saved as phpdocs.
@@ -75,11 +76,13 @@ With the `--reset (-R)` option, the existing phpdocs are ignored, only the newly
By default, models in app/models are scanned. The optional argument tells what models to use (also outside app/models). By default, 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 php artisan ide-helper:models Post User
You can also scan a different directory, using the --dir option (relative from the base path): You can also scan a different directory, using the --dir option (relative from the base path):
php artisan ide-helper:models --dir="app/workbench/name/package/models" php artisan ide-helper:models --dir="app/workbench/name/package/models" --dir="app/src/Model"
You can publish the config file (`php artisan config:publish barryvdh/laravel-ide-helper`) and set the default directories.
Models can be ignored using the --ignore (-I) option Models can be ignored using the --ignore (-I) option
@@ -125,60 +125,68 @@ class GeneratorCommand extends Command {
$aliasLoader = AliasLoader::getInstance(); $aliasLoader = AliasLoader::getInstance();
$output = "<?php $outputString = "<?php
/** /**
* An helper file for Laravel 4, to provide autocomplete information to your IDE * An helper file for Laravel 4, to provide autocomplete information to your IDE
* Generated with https://github.com/barryvdh/laravel-ide-helper * Generated with https://github.com/barryvdh/laravel-ide-helper
* *
* @author Barry vd. Heuvel <[email protected]> * @author Barry vd. Heuvel <[email protected]>
*/ */\n\n";
exit('Only to be used as an helper for your IDE');\n\n"; $output['__root'] = "\texit('Only to be used as an helper for your IDE');\n\n";
//Get all aliases //Get all aliases
$aliases = $aliasLoader->getAliases(); $aliases = $aliasLoader->getAliases();
foreach($aliases as $alias => $facade){ foreach($aliases as $alias => $facade){
$facade = '\\'.ltrim($facade, '\\');
$root = $this->getRoot($facade); $root = $this->getRoot($facade);
if(!$root){ if(!$root){
continue; continue;
} }
try{ try{
if (strpos($alias, '\\')){
$nsParts = explode('\\', $alias);
$alias = array_pop($nsParts);
$ns = implode('\\', $nsParts);
} else {
$ns = '__root';
}
if (!isset($output[$ns])) $output[$ns] = '';
//Some classes extend the facade //Some classes extend the facade
if(interface_exists($facade)){ if(interface_exists($facade)){
$output .= "interface $alias extends $facade{\n"; $output[$ns] .= "\tinterface $alias extends $facade{\n";
}elseif(class_exists($facade)){ }elseif(class_exists($facade)){
$output .= "class $alias extends $facade{\n"; $output[$ns] .= "\tclass $alias extends $facade{\n";
}else{ }else{
$output .= "class $alias{\n"; $output[$ns] .= "\tclass $alias{\n";
} }
$usedMethods = array(); $usedMethods = array();
//Only add the methods to the output when the root is not the same as the facade. //Only add the methods to the output when the root is not the same as the facade.
$addOutput = ($root !== $facade); $addOutput = ($root !== $facade);
$output .= $this->getMethods($root, $alias, $usedMethods, $addOutput); $output[$ns] .= $this->getMethods($root, $alias, $usedMethods, $addOutput);
$driver = $this->getDriver($alias); $driver = $this->getDriver($alias);
if($driver){ if($driver){
$output .= $this->getMethods($driver, $alias, $usedMethods); $output[$ns] .= $this->getMethods($driver, $alias, $usedMethods);
} }
//Add extra methods, from other classes (magic static calls) //Add extra methods, from other classes (magic static calls)
if(array_key_exists($alias, $this->extra)){ if(array_key_exists($alias, $this->extra)){
$output .= $this->getMethods($this->extra[$alias], $alias, $usedMethods); $output[$ns] .= $this->getMethods($this->extra[$alias], $alias, $usedMethods);
} }
//Add extra methods, from other classes (magic static calls) //Add extra methods, from other classes (magic static calls)
if(array_key_exists($alias, $this->magic)){ if(array_key_exists($alias, $this->magic)){
$output .= $this->addMagicMethods($this->magic[$alias], $alias, $usedMethods); $output[$ns] .= $this->addMagicMethods($this->magic[$alias], $alias, $usedMethods);
} }
$output .= "}\n\n"; $output[$ns] .= "\t}\n";
}catch(\Exception $e){ }catch(\Exception $e){
$this->error("Exception: ".$e->getMessage()."\nCould not analyze $root."); $this->error("Exception: ".$e->getMessage()."\nCould not analyze $root.");
@@ -186,6 +194,13 @@ exit('Only to be used as an helper for your IDE');\n\n";
} }
foreach ($output as $ns => $body){
if ($ns == '__root') $ns = '';
$outputString .= "namespace $ns{\n";
$outputString .= $body;
$outputString .= "}\n\n";
}
//Include the helper file, if requested //Include the helper file, if requested
if(!empty($this->helpers)){ if(!empty($this->helpers)){
foreach($this->helpers as $helper){ foreach($this->helpers as $helper){
@@ -195,7 +210,7 @@ exit('Only to be used as an helper for your IDE');\n\n";
} }
} }
return $output; return $outputString;
} }
/** /**
@@ -232,6 +247,12 @@ exit('Only to be used as an helper for your IDE');\n\n";
} }
/**
* Get the driver/connection/store from the managers
*
* @param $alias
* @return array|bool|string
*/
public function getDriver($alias){ public function getDriver($alias){
try{ try{
if($alias == "Auth"){ if($alias == "Auth"){
@@ -239,7 +260,9 @@ exit('Only to be used as an helper for your IDE');\n\n";
}elseif($alias == "DB"){ }elseif($alias == "DB"){
$driver = \DB::connection(); $driver = \DB::connection();
}elseif($alias == "Cache"){ }elseif($alias == "Cache"){
$driver = \Cache::driver(); $driver = get_class(\Cache::driver());
$store = get_class(\Cache::getStore());
return array($driver, $store);
}elseif($alias == "Queue"){ }elseif($alias == "Queue"){
$driver = \Queue::connection(); $driver = \Queue::connection();
}else{ }else{
@@ -343,10 +366,14 @@ exit('Only to be used as an helper for your IDE');\n\n";
//Create a DocBlock and serializer instance //Create a DocBlock and serializer instance
$phpdoc = new DocBlock($method, new Context($namespace)); $phpdoc = new DocBlock($method, new Context($namespace));
$serializer = new DocBlockSerializer(1, "\t"); $serializer = new DocBlockSerializer(1, "\t\t");
//Normalize the description and inherit the docs from parents/interfaces //Normalize the description and inherit the docs from parents/interfaces
$this->normalizeDescription($phpdoc, $method); try{
$this->normalizeDescription($phpdoc, $method);
}catch(\Exception $e){
$this->info("Cannot normalize method $alias::$methodName..");
}
//Correct the return values //Correct the return values
$returnValue = $this->getReturn($phpdoc); $returnValue = $this->getReturn($phpdoc);
@@ -358,7 +385,7 @@ exit('Only to be used as an helper for your IDE');\n\n";
$phpdoc->appendTag(Tag::createInstance('@static', $phpdoc)); $phpdoc->appendTag(Tag::createInstance('@static', $phpdoc));
//Write the output, using the DocBlock serializer //Write the output, using the DocBlock serializer
$output .= $serializer->getDocComment($phpdoc) ."\n\t public static function ".$methodName."("; $output .= $serializer->getDocComment($phpdoc) ."\n\t\t public static function ".$methodName."(";
$output .= implode($paramsWithDefault, ", "); $output .= implode($paramsWithDefault, ", ");
$output .= "){\n"; $output .= "){\n";
@@ -368,17 +395,18 @@ exit('Only to be used as an helper for your IDE');\n\n";
//Reference the 'real' function in the declaringclass //Reference the 'real' function in the declaringclass
$declaringClass = $method->getDeclaringClass(); $declaringClass = $method->getDeclaringClass();
$root = $class->getName(); $declaringClassName = '\\'.ltrim($declaringClass->name, '\\');
$root = '\\'.ltrim($class->getName(), '\\');
if($declaringClass->name != $root){ if($declaringClass->name != $root){
$output .= "\t\t//Method inherited from $declaringClass->name\n"; $output .= "\t\t\t//Method inherited from $declaringClassName\n";
} }
$output .= "\t\t$return $root::"; $output .= "\t\t\t$return $root::";
//Write the default parameters in the function call //Write the default parameters in the function call
$output .= $method->name."(".implode($params, ", ").");\n"; $output .= $method->name."(".implode($params, ", ").");\n";
$output .= "\t }\n\n"; $output .= "\t\t }\n\n";
return $output; return $output;
} }
+108 -95
View File
@@ -3,13 +3,15 @@
* Laravel IDE Helper Generator * Laravel IDE Helper Generator
* *
* @author Barry vd. Heuvel <[email protected]> * @author Barry vd. Heuvel <[email protected]>
* @copyright 2013 Barry vd. Heuvel / Fruitcake Studio (http://www.fruitcakestudio.nl) * @copyright 2014 Barry vd. Heuvel / Fruitcake Studio (http://www.fruitcakestudio.nl)
* @license http://www.opensource.org/licenses/mit-license.php MIT * @license http://www.opensource.org/licenses/mit-license.php MIT
* @link https://github.com/barryvdh/laravel-ide-helper * @link https://github.com/barryvdh/laravel-ide-helper
*/ */
namespace Barryvdh\LaravelIdeHelper; namespace Barryvdh\LaravelIdeHelper;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Str;
use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\ClassLoader\ClassMapGenerator; use Symfony\Component\ClassLoader\ClassMapGenerator;
@@ -17,6 +19,7 @@ use phpDocumentor\Reflection\DocBlock;
use phpDocumentor\Reflection\DocBlock\Context; use phpDocumentor\Reflection\DocBlock\Context;
use phpDocumentor\Reflection\DocBlock\Tag; use phpDocumentor\Reflection\DocBlock\Tag;
use phpDocumentor\Reflection\DocBlock\Serializer as DocBlockSerializer; use phpDocumentor\Reflection\DocBlock\Serializer as DocBlockSerializer;
/** /**
* A command to generate autocomplete information for your IDE * A command to generate autocomplete information for your IDE
* *
@@ -42,7 +45,7 @@ class ModelsCommand extends Command {
protected $properties = array(); protected $properties = array();
protected $methods = array(); protected $methods = array();
protected $write = false; protected $write = false;
protected $dir; protected $dirs = array();
protected $reset; protected $reset;
@@ -56,14 +59,14 @@ class ModelsCommand extends Command {
{ {
$filename = $this->option('filename'); $filename = $this->option('filename');
$this->write = $this->option('write'); $this->write = $this->option('write');
$this->dir = $this->option('dir'); $this->dirs = array_merge($this->laravel['config']->get('laravel-ide-helper::model_locations'), $this->option('dir'));
$model = $this->argument('model'); $model = $this->argument('model');
$ignore = $this->option('ignore'); $ignore = $this->option('ignore');
$this->reset = $this->option('reset'); $this->reset = $this->option('reset');
//If filename is default and Write is not specified, ask what to do //If filename is default and Write is not specified, ask what to do
if(!$this->write && $filename === $this->filename && !$this->option('nowrite')){ if(!$this->write && $filename === $this->filename && !$this->option('nowrite')){
if($this->confirm("Do you want to overwrite the existing model files for '$model'? Choose no to write to $filename instead? (Yes/No): ")){ if($this->confirm("Do you want to overwrite the existing model files? Choose no to write to $filename instead? (Yes/No): ")){
$this->write = true; $this->write = true;
} }
} }
@@ -89,7 +92,7 @@ class ModelsCommand extends Command {
protected function getArguments() protected function getArguments()
{ {
return array( return array(
array('model', InputArgument::OPTIONAL, 'Which models to include', '*'), array('model', InputArgument::OPTIONAL | InputArgument::IS_ARRAY, 'Which models to include', array()),
); );
} }
@@ -102,7 +105,7 @@ class ModelsCommand extends Command {
{ {
return array( return array(
array('filename', 'F', InputOption::VALUE_OPTIONAL, 'The path to the helper file', $this->filename), array('filename', 'F', InputOption::VALUE_OPTIONAL, 'The path to the helper file', $this->filename),
array('dir', 'D', InputOption::VALUE_OPTIONAL, 'The model dir','app/models'), array('dir', 'D', InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'The model dir', array()),
array('write', 'W', InputOption::VALUE_NONE, 'Write to Model file'), array('write', 'W', InputOption::VALUE_NONE, 'Write to Model file'),
array('nowrite', 'N', InputOption::VALUE_NONE, 'Don\'t write to Model file'), array('nowrite', 'N', InputOption::VALUE_NONE, 'Don\'t write to Model file'),
array('reset', 'R', InputOption::VALUE_NONE, 'Remove the original phpdocs instead of appending'), array('reset', 'R', InputOption::VALUE_NONE, 'Remove the original phpdocs instead of appending'),
@@ -110,7 +113,7 @@ class ModelsCommand extends Command {
); );
} }
protected function generateDocs($model, $ignore = ''){ protected function generateDocs($loadModels, $ignore = ''){
$output = "<?php $output = "<?php
@@ -123,10 +126,13 @@ class ModelsCommand extends Command {
*/ */
\n\n"; \n\n";
if($model === '*'){ if(empty($loadModels)){
$models = $this->loadModels(); $models = $this->loadModels();
}else{ }else{
$models = explode(',', $model); $models = array();
foreach($loadModels as $model){
$models = array_merge($models, explode(',', $model));
}
} }
$ignore = explode(',', $ignore); $ignore = explode(',', $ignore);
@@ -146,6 +152,9 @@ class ModelsCommand extends Command {
$reflectionClass = new \ReflectionClass($name); $reflectionClass = new \ReflectionClass($name);
if (!$reflectionClass->IsInstantiable()) { if (!$reflectionClass->IsInstantiable()) {
throw new \Exception($name . ' is not instanciable.'); throw new \Exception($name . ' is not instanciable.');
}elseif(!$reflectionClass->isSubclassOf('Illuminate\Database\Eloquent\Model')){
$this->comment("Class '$name' is not a model");
continue;
} }
$model = new $name(); $model = new $name();
@@ -167,11 +176,13 @@ class ModelsCommand extends Command {
protected function loadModels(){ protected function loadModels(){
$dir = base_path().'/'.$this->dir;
$models = array(); $models = array();
if(file_exists($dir)){ foreach($this->dirs as $dir){
foreach(ClassMapGenerator::createMap($dir) as $model=> $path){ $dir = base_path() . '/' . $dir;
$models[] = $model; if(file_exists($dir)){
foreach(ClassMapGenerator::createMap($dir) as $model=> $path){
$models[] = $model;
}
} }
} }
return $models; return $models;
@@ -192,37 +203,41 @@ class ModelsCommand extends Command {
if($columns){ if($columns){
foreach ($columns as $column) { foreach ($columns as $column) {
$name = $column->getName(); $name = $column->getName();
$type = $column->getType()->getName(); if(in_array($name, $model->getDates())){
$type = '\Carbon\Carbon';
switch($type){ }else{
case 'string': $type = $column->getType()->getName();
case 'text': switch($type){
case 'date': case 'string':
case 'time': case 'text':
case 'guid': case 'date':
$type = 'string'; case 'time':
break; case 'guid':
case 'integer': case 'datetimetz':
case 'bigint': case 'datetime':
case 'smallint': $type = 'string';
$type = 'integer'; break;
break; case 'integer':
case 'decimal': case 'bigint':
case 'smallint':
$type = 'integer';
break;
case 'decimal':
case 'float': case 'float':
$type = 'float'; $type = 'float';
break; break;
case 'boolean': case 'boolean':
$type = 'boolean'; $type = 'boolean';
break; break;
case 'datetimetz': //String or DateTime, depending on $dates default:
case 'datetime': $type = 'mixed';
$type = '\Carbon\Carbon'; break;
break; }
default:
$type = 'mixed';
break;
} }
$this->setProperty($name, $type, true, true); $this->setProperty($name, $type, true, true);
$this->setMethod(Str::camel("where_".$name), '\Illuminate\Database\Query\Builder|\\'.get_class($model), array('$value'));
} }
} }
} }
@@ -233,66 +248,64 @@ class ModelsCommand extends Command {
protected function getPropertiesFromMethods($model){ protected function getPropertiesFromMethods($model){
$methods = get_class_methods($model); $methods = get_class_methods($model);
if($methods){ if($methods){
foreach($methods as $method){ foreach($methods as $method){
if(\Str::startsWith($method, 'get') && \Str::endsWith($method, 'Attribute') && $method !== 'setAttribute'){ if(Str::startsWith($method, 'get') && Str::endsWith($method, 'Attribute') && $method !== 'getAttribute'){
//Magic get<name>Attribute //Magic get<name>Attribute
$name = \Str::snake(substr($method, 3, -9)); $name = Str::snake(substr($method, 3, -9));
if(!empty($name)){ if(!empty($name)){
$this->setProperty($name, null, true, null); $this->setProperty($name, null, true, null);
} }
}elseif(\Str::startsWith($method, 'set') && \Str::endsWith($method, 'Attribute') && $method !== 'setAttribute'){ }elseif(Str::startsWith($method, 'set') && Str::endsWith($method, 'Attribute') && $method !== 'setAttribute'){
//Magic set<name>Attribute //Magic set<name>Attribute
$name = \Str::snake(substr($method, 3, -9)); $name = Str::snake(substr($method, 3, -9));
if(!empty($name)){ if(!empty($name)){
$this->setProperty($name, null, null, true); $this->setProperty($name, null, null, true);
} }
}elseif(\Str::startsWith($method, 'scope') && $method !== 'scopeQuery'){ }elseif(Str::startsWith($method, 'scope') && $method !== 'scopeQuery'){
//Magic set<name>Attribute //Magic set<name>Attribute
$name = \Str::camel(substr($method, 5)); $name = Str::camel(substr($method, 5));
if(!empty($name)){ if(!empty($name)){
$reflection = new \ReflectionMethod($model, $method); $reflection = new \ReflectionMethod($model, $method);
$args = $this->getParameters($reflection); $args = $this->getParameters($reflection);
//Remove the first ($query) argument //Remove the first ($query) argument
array_shift($args); array_shift($args);
$this->setMethod($name, $reflection->class, $args); $this->setMethod($name, '\\'.$reflection->class, $args);
} }
}elseif(!method_exists('Eloquent', $method) && !\Str::startsWith($method, 'get')){ }elseif(!method_exists('Eloquent', $method) && !Str::startsWith($method, 'get')){
//Use reflection to inspect the code, based on Illuminate/Support/SerializableClosure.php //Use reflection to inspect the code, based on Illuminate/Support/SerializableClosure.php
$reflection = new \ReflectionMethod($model, $method); $reflection = new \ReflectionMethod($model, $method);
$file = new \SplFileObject($reflection->getFileName()); $file = new \SplFileObject($reflection->getFileName());
$file->seek($reflection->getStartLine() - 1); $file->seek($reflection->getStartLine() - 1);
$code = ''; $code = '';
while ($file->key() < $reflection->getEndLine()) while ($file->key() < $reflection->getEndLine())
{ {
$code .= $file->current(); $file->next(); $code .= $file->current(); $file->next();
} }
$begin = strpos($code, 'function('); $begin = strpos($code, 'function(');
$code = substr($code, $begin, strrpos($code, '}') - $begin + 1); $code = substr($code, $begin, strrpos($code, '}') - $begin + 1);
$begin = stripos($code, 'return $this->'); foreach(array('hasMany', 'belongsToMany', 'hasOne', 'belongsTo') as $relation){
$parts = explode("'", substr($code, $begin+14),3); //"return $this->" is 14 chars $search = '$this->'.$relation.'(';
if (isset($parts[2])) if($pos = stripos($code, $search)){
{ $code = substr($code, $pos + strlen($search));
list($relation, $returnModel, $rest) = $parts; $arguments = explode(',', substr($code, 0, stripos($code, ')')));
$returnModel = "\\".ltrim($returnModel, "\\"); //Remove quotes, ensure 1 \ in front of the model
$relation = trim($relation, ' ('); $returnModel = "\\".ltrim(trim($arguments[0], " \"'"), "\\");
if($relation === "belongsToMany" or $relation === 'hasMany'){
//Collection or array of models (because Collection is Arrayable)
$this->setProperty($method, '\Illuminate\Database\Eloquent\Collection|'.$returnModel.'[]', true, null);
}else{
//Single model is returned
$this->setProperty($method, $returnModel, true, null);
}
}
}
if($relation === "belongsTo" or $relation === 'hasOne'){ }
//Single model is returned }
$this->setProperty($method, $returnModel, true, null);
}elseif($relation === "belongsToMany" or $relation === 'hasMany'){
//Collection or array of models (because Collection is Arrayable)
$this->setProperty($method, '\Illuminate\Database\Eloquent\Collection|'.$returnModel.'[]', true, null);
}
}else{
//Not a relation
}
}
}
} }
} }
@@ -346,7 +359,7 @@ class ModelsCommand extends Command {
} }
if(!$phpdoc->getText()){ if(!$phpdoc->getText()){
$phpdoc->setText("An Eloquent Model: '$class'"); $phpdoc->setText($class);
} }
$properties = array(); $properties = array();
+14
View File
@@ -29,6 +29,20 @@ return array(
base_path().'/vendor/laravel/framework/src/Illuminate/Support/helpers.php', base_path().'/vendor/laravel/framework/src/Illuminate/Support/helpers.php',
), ),
/*
|--------------------------------------------------------------------------
| Model locations to include
|--------------------------------------------------------------------------
|
| Define in which directories the ide-helper:models command should look
| for models.
|
*/
'model_locations' => array(
'app/models',
),
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------