Compare commits

...
29 Commits
Author SHA1 Message Date
Barry vd. Heuvel ce4e9804ef Use full namespace 2013-06-06 13:48:53 +02:00
Barry vd. Heuvel 12845b38f0 Use declaring class
When function is inherited, link to the original class.
2013-06-06 13:45:32 +02:00
Barry vd. Heuvel 0b3b8b95cd Merge sublime and netbeans/phpstorm
Gives some warnings for phpStorm, but only in the helper file, so
doesn't affect the autocomplete / warnings in application code.
2013-06-06 13:45:05 +02:00
Barry vd. Heuvel 2ee05260d5 Simplify sublime output 2013-06-06 13:19:15 +02:00
Barry vd. Heuvel ec302acc3f Make __construct return @self 2013-06-05 17:45:24 +02:00
Barry vd. Heuvel e0b47835f4 roll back static for relations 2013-06-04 15:36:39 +02:00
Barry vd. Heuvel a0f6a370e1 Tweak return values 2013-06-04 15:34:56 +02:00
Barry vd. Heuvel 77c8bfa05a Fix default model path 2013-06-04 14:46:18 +02:00
Barry vd. Heuvel 62deba4171 Make builder work for relations
Fixes #22
2013-06-04 14:12:47 +02:00
Barry vd. Heuvel 32918908fc Add delete to non-static methods 2013-06-04 14:12:23 +02:00
Barry vd. Heuvel cca1b5896e Only allow relative path 2013-05-30 21:26:02 +02:00
Barry vd. Heuvel 3afc4a3ade Add dir option and fix namespace for models 2013-05-30 21:22:00 +02:00
Barry vd. Heuvel 3ac68d5446 Change order 2013-05-30 21:40:02 +03:00
Barry vd. Heuvel 26f09bccbf Throw error when compiled.php exists 2013-05-30 21:39:12 +03:00
Barry vd. Heuvel a4ab0a5969 Allow writing directly to models 2013-05-30 12:45:26 +02:00
Barry vd. Heuvel b0b324b8cc Use reflection and reflectiondocblock
Load the original docblock and append the changes. This way, you can
just copy the new comments in whole (next step, replace in file..)
2013-05-30 11:54:45 +02:00
Barry vd. Heuvel dab594804b Map enum to string
Fixes #19
2013-05-30 10:15:56 +02:00
Barry vd. Heuvel 83d5fe048d Revert changes 2013-05-29 17:32:38 +02:00
Barry vd. Heuvel 77b1bc923e Set mapping for enum 2013-05-29 18:31:33 +03:00
Barry vd. Heuvel 9090aeb766 Catch getType
Hopefully fixes #19
2013-05-29 18:24:43 +03:00
Barry vd. Heuvel a5c16b0751 update readme 2013-05-29 10:28:23 +02:00
Barry vd. Heuvel 16b3b872a3 Update license (MIT)
To source/readme
2013-05-29 10:24:30 +02:00
Barry vd. Heuvel 507775fda6 Update version in readme 2013-05-28 20:48:07 +02:00
Barry vd. Heuvel 83ab04be40 Update composer 2013-05-28 17:00:09 +02:00
Barry vd. Heuvel 8e0eace591 Specify version for new beta2 2013-05-27 22:22:23 +02:00
Barry vd. Heuvel 9dbcaa15b1 More fixes 2013-05-27 21:23:52 +02:00
Barry vd. Heuvel edf418f9ac Refactor variables and better namespace support 2013-05-27 21:02:46 +02:00
Barry vd. Heuvel eb3c3a7fe3 Add namespace DocBlock context
So they can be expanded correctly
2013-05-27 20:45:04 +02:00
Barry vd. Heuvel fde71b0ee8 Use DocBlock Serializer
Instead of doing it here.
2013-05-26 23:10:09 +02:00
6 changed files with 245 additions and 127 deletions
+3 -1
View File
@@ -1,6 +1,8 @@
{
"name": "barryvdh/laravel-ide-helper",
"description": "Laravel IDE Helper, generates correct PHPDocs for all Facade classes, to improve auto-completion.",
"keywords": ["laravel", "autocomplete", "phpstorm", "netbeans", "sublime", "codeintel", "phpdoc"],
"license": "MIT",
"authors": [
{
"name": "Barry vd. Heuvel",
@@ -12,7 +14,7 @@
"illuminate/support": "4.0.x",
"illuminate/console": "4.0.x",
"illuminate/filesystem": "4.0.x",
"phpdocumentor/reflection-docblock": "2.0.*",
"phpdocumentor/reflection-docblock": "dev-master#6d705c1a0f9e2a6d73d2e9ec0e538b9dfaf4315f",
"symfony/class-loader": "2.3.*"
},
"autoload": {
+19 -13
View File
@@ -1,17 +1,22 @@
## Laravel IDE Helper & Generator
## Laravel IDE Helper Generator
### Complete phpDocs, directly from the source
Add the helper file to your laravel folder (not in a public folder). The file isn't used by Laravel, but it has to be indexed by your IDE.
* Netbeans and PHPStorm version: https://gist.github.com/barryvdh/5227822
* SublimeText CodeIntel version: https://gist.github.com/barryvdh/5227814
* Generated version: https://gist.github.com/barryvdh/5227822
### Automatic phpDoc generation for Laravel Facades
#### NOTE: run before optimising. If bootstrap/compiled.php is loaded, it doesn't work.
php artisan clear-compiled
php artisan ide-helper:generate
php artisan optimize
Require this package in your composer.json:
"barryvdh/laravel-ide-helper": "dev-master"
"barryvdh/laravel-ide-helper": "1.*"
And add the ServiceProvider to the providers array in app/config/app.php
@@ -21,18 +26,14 @@ You can now re-generate the docs yourself (for future updates) in artisan
php artisan ide-helper:generate
If you use SublimeText CodeIntel, the format is a bit different. So add --sublime (or -S) to your command
php artisan ide-helper:generate -S
Note: You do need CodeIntel for Sublime Text: https://github.com/Kronuz/SublimeCodeIntel
You can configure your composer.json to do this after each commit:
"scripts":{
"post-update-cmd":[
"php artisan optimize",
"php artisan ide-helper:generate",
"php artisan optimize",
]
},
@@ -52,18 +53,23 @@ The Illuminate/Support/helpers.php is already set-up, but you can add/remove you
### Work in progress: Model docs
If you don't want to write your properties yourself, you can use the (experimental) command `ide-helper:models` to generate
phpDocs, based on table columns, relations and getters/setters. Very alpha, so please provide feedback if you want.
Docs are written to a phpfile in the root of the project, so you can move the docs to the real model.
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.
For now, only models in app/models are scanned. The optional argument tells what models to use.
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.
It should keep the existing comments and only append new properties/methods.
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.
It doesn't know if datetimes are returned as string or DateTime/Carbon, but I assume they are.
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.
### License
The Laravel IDE Helper Generator is open-sourced software licensed under the [MIT license](http://opensource.org/licenses/MIT)
@@ -1,9 +1,22 @@
<?php namespace Barryvdh\LaravelIdeHelper;
<?php
/**
* Laravel IDE Helper Generator
*
* @author Barry vd. Heuvel <[email protected]>
* @copyright 2013 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\Console\Command;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;
use DocBlock\Parser;
use Illuminate\Foundation\AliasLoader;
use phpDocumentor\Reflection\DocBlock;
use phpDocumentor\Reflection\DocBlock\Context;
use phpDocumentor\Reflection\DocBlock\Tag;
use phpDocumentor\Reflection\DocBlock\Serializer as DocBlockSerializer;
/**
* A command to generate autocomplete information for your IDE
*
@@ -25,6 +38,11 @@ class GeneratorCommand extends Command {
*/
protected $description = 'Generate a new IDE Helper file.';
protected $extra;
protected $nonstatic;
protected $onlyExtend;
protected $helpers;
/**
* Execute the console command.
@@ -33,34 +51,35 @@ class GeneratorCommand extends Command {
*/
public function fire()
{
$filename = $this->argument('filename');
if($this->option('memory')){
$this->useMemoryDriver();
}
$extra = \Config::get('laravel-ide-helper::extra');
$nonstatic = \Config::get('laravel-ide-helper::nonstatic');
$onlyExtend = \Config::get('laravel-ide-helper::only_extend');
if( $this->option('helpers') || (\Config::get('laravel-ide-helper::include_helpers') && ! $this->option('nohelpers'))){
$helpers = \Config::get('laravel-ide-helper::helper_files');
if (file_exists($compiled = base_path().'/bootstrap/compiled.php')){
$this->error('Error generating IDE Helper: first delete bootstrap/compiled.php (php artisan clear-compiled)');
}else{
$helpers = array();
}
$sublime = $this->option('sublime') || \Config::get('laravel-ide-helper::sublime');
$content = $this->generateDocs($extra, $nonstatic, $onlyExtend, $helpers, $sublime);
$written = \File::put($filename, $content);
if($written !== false){
$this->info("A new helper file was written to $filename");
}else{
$this->error("The helper file could not be created at $filename");
}
$filename = $this->argument('filename');
if($this->option('memory')){
$this->useMemoryDriver();
}
$this->extra = \Config::get('laravel-ide-helper::extra');
$this->nonstatic = \Config::get('laravel-ide-helper::nonstatic');
$this->onlyExtend = \Config::get('laravel-ide-helper::only_extend');
if( $this->option('helpers') || (\Config::get('laravel-ide-helper::include_helpers') && ! $this->option('nohelpers'))){
$this->helpers = \Config::get('laravel-ide-helper::helper_files');
}else{
$this->helpers = array();
}
$content = $this->generateDocs();
$written = \File::put($filename, $content);
if($written !== false){
$this->info("A new helper file was written to $filename");
}else{
$this->error("The helper file could not be created at $filename");
}
}
}
protected function useMemoryDriver(){
@@ -94,19 +113,16 @@ class GeneratorCommand extends Command {
return array(
array('helpers', "H", InputOption::VALUE_NONE, 'Include the helper files'),
array('memory', "M", InputOption::VALUE_NONE, 'Use sqlite memory driver'),
array('sublime', "S", InputOption::VALUE_NONE, 'Use different style for SublimeText CodeIntel'),
array('sublime', "S", InputOption::VALUE_NONE, 'DEPRECATED: Use different style for SublimeText CodeIntel'),
);
}
/**
* @param array $extra
* @param array $nonstatic
* @param array $onlyExtend
* @param array $helpers
* @param bool $sublime
* Generate the docs for all facades in the AliasLoader
*
* @return string
*/
protected function generateDocs($extra = array(), $nonstatic = array(), $onlyExtend = array(), $helpers = array(), $sublime = false){
protected function generateDocs(){
$aliasLoader = AliasLoader::getInstance();
@@ -155,19 +171,18 @@ namespace {\n\tdie('Only to be used as an helper for your IDE');\n}\n\n";
$output .= "namespace $namespace {\n";
if($root !== $facade or in_array($alias, $onlyExtend)){
if($root !== $facade or in_array($alias, $this->onlyExtend)){
//If the root class is not the same as the facade extend it.
$output .= " class $alias extends $facade{\n";
}else{
$output .= " class $alias{\n";
}
$output .= "\t/**\n\t * @var \\$root \$root\n\t */\n\t static private \$root;\n\n";
if(!in_array($alias, $onlyExtend))
if(!in_array($alias, $this->onlyExtend))
{
$usedMethods = array();
if(array_key_exists($alias, $nonstatic) ){
$nonstaticMethods = $nonstatic[$alias];
if(array_key_exists($alias, $this->nonstatic) ){
$nonstaticMethods = $this->nonstatic[$alias];
}else{
$nonstaticMethods = array();
}
@@ -180,15 +195,16 @@ namespace {\n\tdie('Only to be used as an helper for your IDE');\n}\n\n";
{
if(!in_array($method->name, $usedMethods)){
$static = !in_array($method->name, $nonstaticMethods);
$output .= $this->parseMethod($method, $alias, $root, $sublime, $static);
$declaringClass = $method->getDeclaringClass();
$output .= $this->parseMethod($method, $alias, "\\$declaringClass->name", $static);
$usedMethods[] = $method->name;
}
}
}
if(array_key_exists($alias, $extra)){
if(array_key_exists($alias, $this->extra)){
$i = 2;
foreach($extra[$alias] as $extraClass){
foreach($this->extra[$alias] as $extraClass){
if(!class_exists($extraClass) && !interface_exists($extraClass)){
continue;
}
@@ -203,7 +219,7 @@ namespace {\n\tdie('Only to be used as an helper for your IDE');\n}\n\n";
{
if(!in_array($method->name, $usedMethods)){
$static = !in_array($method->name, $nonstaticMethods);
$output .= $this->parseMethod($method, $alias, $extraClass, $sublime, $static, $rootParam);
$output .= $this->parseMethod($method, $alias, $extraClass, $static, $rootParam);
$usedMethods[] = $method->name;
}
@@ -236,33 +252,30 @@ namespace {\n\tdie('Only to be used as an helper for your IDE');\n}\n\n";
* @param \ReflectionMethod $method
* @param string $alias
* @param string $root
* @param bool $sublime
* @param bool $static
* @param string $rootParam
* @return string
*/
protected function parseMethod($method, $alias, $root, $sublime, $static = true, $rootParam = 'root'){
protected function parseMethod($method, $alias, $root, $static = true, $rootParam = 'root'){
$output = '';
if($method->name === '__clone'){
return $output;
}
$phpdoc = new \phpDocumentor\Reflection\DocBlock($method);
$namespace = $method->getDeclaringClass()->getNamespaceName();
$phpdoc = new DocBlock($method, new Context($namespace));
$serializer = new DocBlockSerializer(1, "\t");
$description = $phpdoc->getText();
$description = $phpdoc->getShortDescription();
$longDescription = $phpdoc->getLongDescription()->getContents();
if($longDescription){
$description .= "\n".$longDescription;
}
if(strpos($description, '{@inheritdoc}') !== false){
$inheritdoc = $this->getInheritDoc($method);
$inheritDescription = $inheritdoc->getShortDescription();
$inheritDescription = $inheritdoc->getText();
$inheritLongDescription = $inheritdoc->getLongDescription()->getContents();
if($inheritLongDescription){
$inheritDescription .= "\n".$inheritLongDescription;
}
$description = str_replace('{@inheritdoc}', $inheritDescription, $description);
$phpdoc->setText($description);
$inheritTags = $inheritdoc->getTags();
if($inheritTags){
foreach($inheritTags as $tag){
@@ -271,46 +284,48 @@ namespace {\n\tdie('Only to be used as an helper for your IDE');\n}\n\n";
}
}
}
$description = str_replace("\n", "\n\t * ", $description);
$output .= "\t/**\n\t * ".$description."\n";
$output .= "\t *\n\t * @static\n";
$phpdoc->appendTag(Tag::createInstance('@static', $phpdoc));
//Looping through the parameters and re-setting the type, to get the expanded type (with namespace)
//Should be fixed in a future version of ReflectionDocBlock I hope..
$paramTags = $phpdoc->getTagsByName('param');
if(!empty($paramTags)){
foreach ($paramTags as $tag)
{
$output .="\t * @param\t".$tag->getType()."\t".$tag->getVariableName()."\t".$tag->getDescription()."\n";
if($paramTags){
/** @var $tag */
foreach($paramTags as $tag){
$content = $tag->getContent();
//Closure should be \Closure..
$content = str_replace('\Closure', 'Closure', $content);
$content = str_replace('Closure', '\Closure', $content);
$tag->setContent($content);
$tag->setContent($tag->getType() . ' ' . $tag->getVariableName() . ' ' . $tag->getDescription());
}
}
$returnTags = $phpdoc->getTagsByName('return');
if($returnTags){
/** @var $tag */
$tag = reset($returnTags);
$returnValue = $tag->getType();
if(!$sublime and $alias == 'Eloquent' and
if($method->name == "__construct"){
$returnValue = '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
$returnValue = "static";
}elseif(!$sublime and $alias == 'Eloquent' and in_array($method->name, array('all', 'get'))){
$returnValue .= "|Eloquent[]|static[]";
$returnValue .= "static";
}elseif($alias == 'Eloquent' and in_array($method->name, array('all', 'get'))){
$returnValue .= "|\Eloquent[]|static[]";
}elseif($alias == 'Eloquent' and in_array($method->name, array('hasOne', 'hasMany', 'belongsTo', 'belongsToMany', 'morphOne', 'morphTo', 'morphMany'))){
$returnValue .= "|\Eloquent";
}
$output .= "\t * @return\t".$returnValue."\t".$tag->getDescription()."\n";
$tag->setContent($returnValue . " ". $tag->getDescription());
}else{
$returnValue = null;
}
$allTags = $phpdoc->getTags();
if($allTags){
foreach($allTags as $tag){
if(!in_array($tag->getName(), array('return', 'param'))){
$output .= "\t * @".$tag->getName() ." ". $tag->getContent()."\n";
}
}
}
$output .= "\t */\n\t public ".($static ? 'static' : '')." function ".$method->name."(";
$output .= $serializer->getDocComment($phpdoc) ."\n\t public ".($static ? 'static' : '')." function ".$method->name."(";
$params = array();
$paramsWithDefault = array();
@@ -337,14 +352,12 @@ namespace {\n\tdie('Only to be used as an helper for your IDE');\n}\n\n";
$output .= implode($paramsWithDefault, ", ");
$output .= "){\r\n";
$return = $returnValue !== "void" ? 'return' : '';
$return = ($returnValue && $returnValue !== "void" && $method->name !== "__construct") ? 'return' : '';
$output .= "\t\t$return $root::";
if($sublime){
$output .= "\t\t\$$rootParam = new $root();\r\n";
$output .= "\t\t$return \$$rootParam->";
}else{
$output .= "\t\t$return static::\$$rootParam->";
}
$output .= $method->name."(".implode($params, ", ").");\r\n";
$output .= "\t }\n\n";
@@ -364,8 +377,8 @@ namespace {\n\tdie('Only to be used as an helper for your IDE');\n}\n\n";
$method = $reflectionMethod->getPrototype();
}
if($method){
$phpdoc = new \phpDocumentor\Reflection\DocBlock($method);
if(strpos($phpdoc->getShortDescription(), '{@inheritdoc}') !== false || strpos($phpdoc->getLongDescription(), '{@inheritdoc}') !== false ){
$phpdoc = new DocBlock($method);
if(strpos($phpdoc->getText(), '{@inheritdoc}') !== false ){
//Not at the end yet, try another parent/interface..
return $this->getInheritDoc($method);
}else{
@@ -1,4 +1,14 @@
<?php namespace Barryvdh\LaravelIdeHelper;
<?php
/**
* Laravel IDE Helper Generator
*
* @author Barry vd. Heuvel <[email protected]>
* @copyright 2013 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\Support\ServiceProvider;
+110 -23
View File
@@ -1,8 +1,22 @@
<?php namespace Barryvdh\LaravelIdeHelper;
<?php
/**
* Laravel IDE Helper Generator
*
* @author Barry vd. Heuvel <[email protected]>
* @copyright 2013 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\Console\Command;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\ClassLoader\ClassMapGenerator;
use phpDocumentor\Reflection\DocBlock;
use phpDocumentor\Reflection\DocBlock\Context;
use phpDocumentor\Reflection\DocBlock\Tag;
use phpDocumentor\Reflection\DocBlock\Serializer as DocBlockSerializer;
/**
* A command to generate autocomplete information for your IDE
*
@@ -26,6 +40,9 @@ class ModelsCommand extends Command {
protected $properties = array();
protected $methods = array();
protected $write = false;
protected $dir;
/**
@@ -36,16 +53,19 @@ class ModelsCommand extends Command {
public function fire()
{
$filename = $this->option('filename');
$this->write = $this->option('write');
$this->dir = $this->option('dir');
$model = $this->argument('model');
$content = $this->generateDocs($model);
$written = \File::put($filename, $content);
if($written !== false){
$this->info("Model information was written to $filename");
}else{
$this->error("Failed to write model information to $filename");
if(!$this->write){
$written = \File::put($filename, $content);
if($written !== false){
$this->info("Model information was written to $filename");
}else{
$this->error("Failed to write model information to $filename");
}
}
}
@@ -73,6 +93,8 @@ class ModelsCommand extends Command {
{
return array(
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'),
);
}
@@ -119,24 +141,33 @@ class ModelsCommand extends Command {
protected function loadModels(){
$dir = base_path().'/'.$this->dir;
$models = array();
foreach(ClassMapGenerator::createMap(app_path().'/models') as $model=> $path){
$models[] = $model;
if(file_exists($dir)){
foreach(ClassMapGenerator::createMap($dir) as $model=> $path){
$models[] = $model;
}
}
return $models;
}
/**
* Load the properties from the database table.
*
* @param \Illuminate\Database\Eloquent\Model $model
*/
protected function getPropertiesFromTable($model){
$table = $model->getTable();
$schema = $model->getConnection()->getDoctrineSchemaManager($table);
$schema->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
$columns = $schema->listTableColumns($table);
$properties = array();
if($columns){
foreach ($columns as $column) {
$name = $column->getName();
$type = $column->getType()->getName();
switch($type){
case 'string':
case 'text':
@@ -170,6 +201,9 @@ class ModelsCommand extends Command {
}
}
/**
* @param \Illuminate\Database\Eloquent\Model $model
*/
protected function getPropertiesFromMethods($model){
$methods = get_class_methods($model);
if($methods){
@@ -232,6 +266,12 @@ class ModelsCommand extends Command {
}
}
/**
* @param string $name
* @param string|null $type
* @param bool|null $read
* @param bool|null $write
*/
protected function setProperty($name, $type = null, $read = null, $write = null){
if(!isset($this->properties[$name])){
$this->properties[$name] = array();
@@ -260,18 +300,38 @@ class ModelsCommand extends Command {
}
}
/**
* @param string $class
* @return string
*/
protected function createPhpDocs($class){
if(strpos($class, '\\') !== false){
$parts = explode('\\', $class);
$class = array_pop($parts);
$namespace = implode($parts, '\\');
}else{
$namespace = '';
$reflection = new \ReflectionClass($class);
$namespace = $reflection->getNamespaceName();
$classname = $reflection->getShortName();
$originalDoc = $reflection->getDocComment();
$phpdoc = new DocBlock($reflection, new Context($namespace));
if(!$phpdoc->getText()){
$phpdoc->setText("Generated properties for $class");
}
$output = "namespace $namespace{\n";
$output .= "\t/**\n\t *\n\t * Generated properties for $class\n\t *\n";
$properties = array();
$methods = array();
foreach($phpdoc->getTags() as $tag){
$name = $tag->getName();
if($name == "property" || $name == "property-read" || $name == "property-write"){
$properties[] =$tag->getVariableName();
}elseif($name == "method"){
$methods[] = $tag->getMethodName();
}
}
foreach($this->properties as $name => $property){
$name = "\$$name";
if(in_array($name, $properties)){
continue;
}
if($property['read'] && $property['write']){
$attr = 'property';
}elseif($property['write']){
@@ -279,16 +339,43 @@ class ModelsCommand extends Command {
}else{
$attr = 'property-read';
}
$type = $property['type'];
$output .= "\t * @$attr $type \$$name \n";
$tag = Tag::createInstance("@{$attr} {$property['type']} {$name}", $phpdoc);
$phpdoc->appendTag($tag);
}
foreach($this->methods as $name => $method){
$type = $method['type'];
$output .= "\t * @method $type $name() \n";
if(in_array($name, $methods)){
continue;
}
$name = "$name()";
$tag = Tag::createInstance("@method {$method['type']} {$name}", $phpdoc);
$phpdoc->appendTag($tag);
}
$output .= "\t *\n\t */\n\tclass $class {}\n}\n\n";
$serializer = new DocBlockSerializer();
$serializer->getDocComment($phpdoc);
$docComment = $serializer->getDocComment($phpdoc);
if($this->write){
$filename = $reflection->getFileName();
$contents = \File::get($filename);
if($originalDoc){
$contents = str_replace($originalDoc, $docComment, $contents);
}else{
$needle = "class {$classname}";
$replace = "{$docComment}\nclass {$classname}";
$pos = strpos($contents,$needle);
if ($pos !== false) {
$contents = substr_replace($contents,$replace,$pos,strlen($needle));
}
}
if(\File::put($filename, $contents)){
$this->info('Written new phpDocBlock to '.$filename);
}
}
$output = "namespace {$namespace}{\n{$docComment}\n\tclass {$classname} {}\n}\n\n";
return $output;
}
+1 -1
View File
@@ -70,7 +70,7 @@ return array(
*/
'nonstatic' => array(
'Eloquent' => array('freshTimestamp', 'newCollection', 'toArray', 'toJson', 'toSql'),
'Eloquent' => array('freshTimestamp', 'newCollection', 'toArray', 'toJson', 'toSql', 'delete'),
),
/*