2016-04-25 13 views
-1

PhpStorm hat eine nützliche Funktion, wenn schnell Getter und Setter zu schaffen:PhpStorm - Einstellung Getter und Setter

Code -> generate -> select the items to generate 

Dies ist ideal für Grund Setter/Getter zu setzen.

Aber von Zeit zu Zeit möchte ich mehr als nur Setter und Getters setzen. Zum Beispiel möchte ich vielleicht Setter und Getter für eine Beziehung von eins zu viele oder von vielen zu vielen erstellen.

heißt

Viele zu viele

/** 
* {@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); 
    } 
} 

Gibt es eine Möglichkeit, dies über den gleichen Code-Generierung Prozess zu tun?

Antwort

2

Leider unterstützt ATM PhpStorm keine solche Funktionalität.

https://youtrack.jetbrains.com/issue/WI-25003 - sehen Sie sich dieses Ticket (Star/Abstimmung/Kommentar) an, um über den Fortschritt informiert zu werden (bisher ist es für keine bestimmte zukünftige Version geplant - möglicherweise wegen sehr niedriger Stimmenzahl - Art: Nr Stimmen = kein Interesse = keine Notwendigkeit, Ressourcen in es jetzt zu investieren).

Verwandte: https://youtrack.jetbrains.com/issue/WI-19891


Die einzige Alternative, die ich von jetzt denken kann (das würde verwenden, die Code-Generierung Funktionalität) .. ist Vorlage für die Getter/Setter so zu modifizieren, dass es mehr als eine Methode enthält (example). Auf diese Weise können Sie setXXX/addXXX sowie getXXX/removeXXX Methoden auf einmal erstellen.

Offensichtlich wäre es in allen Fällen angewendet werden, so dass, wenn Sie gerade brauchen get/set dann würden Sie manuell add/remove Methoden entfernen müssen - das ist ein Nachteil solcher Ansatz ist.

Beachten Sie, dass & Code-Vorlagen-Datei konnte IDE weit (Default Schema) oder projektspezifische (Project Schema) sein .. so können Sie solche kombinierten Getter/Setter in bestimmten Projekten nur verwenden.

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


Die einzige andere Alternative ist Hälfte manuelle und erfordert, dass Sie Live Templates zu verwenden.

  • Machen Live-Vorlage (eine Zeitjob)
  • Sie müssen manuell den Ort finden, wo Sie diesen Code wollen
  • Invoke Live-Template Expansion platziert werden (so dass Codevorlage eingefügt wird)
  • Füllen Sie alle Live-Vorlagenvariablen aus, um den Code zu vervollständigen.

Mit Ihrem addXXX/removeXXX Codebeispiel Sie kann am Ende mit nur Füllung 1 oder 2 Vorlagenvariablen (nur eine schnelle Einschätzung auf, was ich sehe, die gleiche Variable so mehrfach verwendet werden kann, wird ausgefüllt werden wenige Stellen gleichzeitig, eingegebener Text kann transformiert werden (begrenzter Satz von Transformationen), so dass er automatisch in einer anderen Variablen wiederverwendet werden kann (z. B. wird owner eingegeben und an anderer Stelle automatisch Owner)

+0

Vielen Dank dafür. Ich probiere live templates aus. Ich habe einen für PHP-Code hinzugefügt, aber es funktioniert nicht. Muss ich es irgendwie aktivieren? – HappyCoder

+0

Screenshots bitte + beschreiben, was Sie tun (wo es nicht funktioniert). Ohne sie wird es nur wildes Raten sein (z. B. Kein Kontext überhaupt ... oder falscher Kontext wurde angegeben; falscher Erweiterungsschlüssel wird verwendet; ungültiger/falscher Live-Vorlagenkörper usw.). – LazyOne

+0

ntw - alles sortiert, danke für Ihre Hilfe! Sehr geschätzt und sehr genossen, nachdem ich zu PHPstorm gewechselt bin. – HappyCoder

0

Überprüfen Sie diese:

#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; 
} 

Ich habe es geschafft, so etwas zu erstellen, fühlen sich frei, auf Ihre Bedürfnisse zu ändern. Dies ist die fließende Setter Live-Vorlage.

Es funktioniert mit Doctrine Collection/ArrayCollection, Arrays. Die Erweiterung dieser Funktionalität ist so einfach wie das Erstellen einer neuen #elseif Anweisung.

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

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