2016-04-25 79 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;