2016-04-25 366 views
-1

PhpStorm有一个有用的功能时,快速创建getter和setter方法:PhpStorm - 设置getter和setter方法

Code -> generate -> select the items to generate 

这是伟大的设置基本制定者/吸气。

但是我不时想要设置的不仅仅是setter和getters。例如,我可能想要为一对多或多对多关系创建setters和getters。

多对多

/** 
* {@inheritDoc} 
*/ 
public function getOwner() 
{ 
    return $this->owner->toArray(); 
} 

/** 
* Set the list of user 
* @param Collection $owner 
*/ 
public function setOwner(Collection $owner) 
{ 
    $this->registeredUsers->clear(); 

    foreach ($owner as $item) { 
     $this->owner[] = $item; 
    } 
} 

/** 
* Add merchant to the collection 
* @param Collection $owner 
*/ 
public function addOwner(Collection $owner) 
{ 
    foreach($owner as $item) { 
     $this->owner->add($item); 
    } 
} 

/** 
* @param Collection $owner 
*/ 
public function removeOwner(Collection $owner) 
{ 
    foreach($owner as $item) { 
     $this->owner->removeElement($item); 
    } 
} 

有没有办法通过相同的代码生成过程要做到这一点?

回答

2

不幸的是,ATM PhpStorm不支持​​这种功能。

https://youtrack.jetbrains.com/issue/WI-25003 - 观看此票(明星/投票/评论)以获得有关任何进度的通知(迄今为止尚未计划针对任何特定的未来版本 - 可能是因为投票数极少 - 类型:否票=没有兴趣=现在不需要投入资源)。

相关:https://youtrack.jetbrains.com/issue/WI-19891


我能想到的,现在,唯一的选择(这将使用代码生成功能)..如此,它包含一种以上的方法来修改的getter/setter模板(example)。这样您就可以一次生成setXXX/addXXX以及getXXX/removeXXX方法。

很明显,它会应用于所有情况,所以如果您只需要get/set,那么您需要手动删除add/remove方法 - 这是这种方法的缺点。

注意,文件&代码模板可以在IDE范围内(Default模式)或特定项目(Project模式)..所以你可能只在某些项目中使用这样的组合getter/setter方法。

https://www.jetbrains.com/help/phpstorm/2016.1/file-and-code-templates-2.html


的唯一选择就是半手工并要求使用Live Templates

  • 进行实际现场模板(一次工作)
  • 您需要手动查找要放置该代码
  • 调用动态模板扩展的地方(这样的代码模板被插入)
  • 填写所有实时模板变量以完成代码。

与您addXXX/removeXXX代码示例,你可以结束了只是填充在我所看到的1个或2个模板变量(只是一个快速的估计;同一变量可以多次使用,以便将被填充,输入的文本可以被转换(有限的一组转换),所以它可以在另一个变量中自动重新使用(例如,您正在输入owner,并在另一个地方自动使用它作为Owner

+0

谢谢你。我正在尝试生活的tempaltes。我为PHP代码添加了一个,但它不起作用。我需要以某种方式激活它吗? – HappyCoder

+0

截图请描述你做了什么(它不工作)。如果没有它们,它将只是疯狂的猜测(例如,根本没有上下文......或指定了错误的上下文;使用了错误的扩展键;无效/错误的活模板体等)。 – LazyOne

+0

ntw - 全部排序,感谢您的帮助!非常感谢并且非常享受已经转移到PHPstorm。 – HappyCoder

0

查看:

#set ($array = $TYPE_HINT.split('\|')); 
#set ($IS_COLLECTION = false); 
#set ($FIXED_RETURN_TYPE = $RETURN_TYPE); 
#set ($NAME_LENGTH = $FIELD_NAME.length()); 
#set ($NAME_BEFORE_LAST = $FIELD_NAME.length() - 1); 
#set ($LAST_CHARACTER = $FIELD_NAME.substring($NAME_BEFORE_LAST, $NAME_LENGTH)); 
#set ($METHOD_NAME_BEFORE_LAST = $NAME.length() - 1); 

#if (${LAST_CHARACTER} == 's') 
    #set ($FIXED_PROPERTY_NAME = $FIELD_NAME.substring(0, $NAME_BEFORE_LAST)); 
    #set ($FIXED_METHOD_NAMING_PART = $NAME.substring(0, $METHOD_NAME_BEFORE_LAST)); 
#else 
    #set ($FIXED_PROPERTY_NAME = $FIELD_NAME); 
    #set ($FIXED_METHOD_NAMING_PART = $NAME); 
#end 

#foreach($hint in $array) 
    #if ($hint.toString().contains('[]')) 
     #set ($ENTRY_HINT = $hint.toString().replace('[]', '')); 
     #set ($HAS_ENTRY_HINT = true); 
    #end 
#end 

#foreach($hint in $array) 
    #if ($hint == 'Collection') 
     #set ($IS_COLLECTION = true) 
     #set ($FIXED_RETURN_TYPE = 'Collection') 
     #break 
    #elseif ($hint == 'ArrayCollection') 
     #set ($IS_COLLECTION = true) 
     #set ($FIXED_RETURN_TYPE = 'Collection') 
     #break 
    #elseif ($hint == 'array') 
     #set ($IS_COLLECTION = true) 
     #set ($FIXED_RETURN_TYPE = 'array') 
    #elseif ($hint.toString().contains('[]')) 
     #set ($IS_COLLECTION = true) 
     #set ($FIXED_RETURN_TYPE = 'array') 
    #end 
#end 

#if ($IS_COLLECTION) 
/** 
* @param ${ENTRY_HINT} $${FIXED_PROPERTY_NAME} 
* 
* @return ${CLASS_NAME} 
*/ 
public function add${FIXED_METHOD_NAMING_PART}(#if (${HAS_ENTRY_HINT})${ENTRY_HINT} #else#end$${FIXED_PROPERTY_NAME})#if(${RETURN_TYPE}): ${CLASS_NAME}#else#end 
{ 
#if ($FIXED_RETURN_TYPE == 'Collection') 
    if(false === $this->${FIELD_NAME}->contains($${FIXED_PROPERTY_NAME})) { 
     $this->${FIELD_NAME}->add($${FIXED_PROPERTY_NAME}); 
    } 
#else 
    if(false === in_array($${FIXED_PROPERTY_NAME}, $this->${FIELD_NAME}, true)) { 
     $this->${FIELD_NAME}[] = $${FIXED_PROPERTY_NAME}; 
    } 
#end 

    return $this; 
} 

/** 
* @param ${ENTRY_HINT} $${FIXED_PROPERTY_NAME} 
* 
* @return ${CLASS_NAME} 
*/ 
public function remove${FIXED_METHOD_NAMING_PART}(#if (${HAS_ENTRY_HINT})${ENTRY_HINT} #else#end$${FIXED_PROPERTY_NAME})#if(${RETURN_TYPE}): ${CLASS_NAME}#else#end 
{ 
#if ($FIXED_RETURN_TYPE == 'Collection') 
    if(true === $this->${FIELD_NAME}->contains($${FIXED_PROPERTY_NAME})) { 
     $this->${FIELD_NAME}->removeElement($${FIXED_PROPERTY_NAME}); 
    } 
#else 
    if(true === in_array($${FIXED_PROPERTY_NAME}, $this->${FIELD_NAME}, true)) { 
     $index = array_search($${FIXED_PROPERTY_NAME}, $this->${FIELD_NAME}); 
     array_splice($this->${FIELD_NAME}, $index, 1); 
    } 
#end 

    return $this; 
} 
#end 
/** 
* @param ${TYPE_HINT} $${PARAM_NAME} 
* @return ${CLASS_NAME} 
*/ 
public function set${NAME}(#if (${SCALAR_TYPE_HINT})${SCALAR_TYPE_HINT} #else#end$${PARAM_NAME})#if(${RETURN_TYPE}): ${CLASS_NAME}#else#end 
{ 
    $this->${FIELD_NAME} = $${PARAM_NAME}; 
    return $this; 
} 

我已经设法创建了类似的东西,随时修改您的需求。这是流利的设置器活动模板。

它适用于Doctrine的Collection/ArrayCollection数组。扩展此功能与创建新的#elseif语句一样简单。

/** 
* @var array|string[] 
*/ 
protected $oneField; 

/** 
* @var ArrayCollection|Collection|Another[] 
* 
* @ORM\OneToMany(targetEntity="Acme\DemoBundle\Entity\Another") 
*/ 
protected $anotherField;