class: home,center,middle ##.huge[IDE Friendly Code] # Tipps für bessere IDE Unterstützung in Magento 1 und 2 --- # .huge[Über mich] .popup.certs[ .left[ ![Fabian Schmengler](images/fs_250x250.jpg) ] Fabian Schmengler Magento Wizard @ integer_net GmbH ] --- # Was kann die IDE für uns tun? - Code Vervollständigung - Automatisches Refactoring - Navigation durch den Code -- - .grey[(und noch viel mehr)] # Aber wie können wir das optimal ausnutzen? --- class: middle, center ## Der größte Feind: #.huge["Magie"] --- # Magie in Magento ## Magic Methods: - `Varien_Object::getXxx()` - `Varien_Object::setXxx()` - `Varien_Object::hasXxx()` - `Varien_Object::unsXxx()` -- #.red[Schon mal vertippt?] --- # Magie in Magento ## Service Locator: - `Mage::getModel($alias)` - `Mage::getResourceModel($alias)` - `Mage::helper($alias)` - `$layout->createBlock($alias)` -- #.red[Schon mal vertippt?] --- # Magie in Magento 2 ##.green[Weniger Magie:] - Explizite Abhängigkeiten durch Dependency Injection -- - Explizite Interfaces statt Magic Getter und Setter -- - Funktioniert gut, solange konsequent gegen Interface programmiert wird --- # Magie in Magento 2 ##.red[Mehr Magie: Generierter Code] - `Interceptor` - `Factory` - `Proxy` - `Extensible` ## IDE hilft erst, wenn Klassen generiert und indexiert sind --- class: center, top, mellon background-image: url(images/mellon.jpg) #.huge[Sprich Freund und tritt ein] --- class: center, middle #.huge[Was tun?] --- # Antimagie (Mehr Magie!) ## PhpStorm Plugin Magicento - erkennt Aliase für Models und Helper - Navigation durch Code dadurch besser möglich -- ## Hilft nicht bei - Umbenennen von Klassen - Erkennen von magischen Methoden --- class: center, middle #.huge[Reminder:] .huge[ > If you find you need an extension to your ide to understand what's going on. > It's probably not simple. ] *\- Greg Young in "8 Lines of Code"* --- class: center, middle #.red.huge[NOT SIMPLE] ## Code sollte einfach zu verstehen sein --- class: center, middle #.huge[Magie Entzaubern!] --- class: center, middle #.huge[PhpDoc] ## Unterstützt von allen PHP IDEs .left[```php /** * @annotation parameter */ ```] --- # @return für Rückgabetyp ```php /** * @return Mage_Catalog_Model_Product */ protected function _getProduct() { return Mage::registry('current_product'); } ``` -- # @var für Feldtyp ```php /** * @var Mage_Catalog_Model_Product */ protected $_product; ``` --- # @method für Magic Methods ```php /** * @method setName() IntegerNet_Example_Model_Something setName(string $name) * @method getName() string getName() */ class IntegerNet_Example_Model_Something extends Mage_Core_Model_Abstract { } ``` ``` * @method setName() IntegerNet_Example_Model_Something setName(string $name) | | | | | | | | | | | | | Methode |<--------------------------- Signatur ----------------->| | | | | | | | | | | | Rückgabetyp | | Parameter | ``` - Rückgabetyp wichtig für Method Chaining! - PhpStorm kennt auch Rückgabetyp `$this` --- # @var für Variablen-Typ # NICHT-STANDARD! IDE abhängig! ```php /** * @var Mage_Catalog_Model_Product $product */ $product = Mage::getModel('catalog/product')->load($id); ``` ```php /** * @var $product Mage_Catalog_Model_Product */ $product = Mage::getModel('catalog/product')->load($id); ``` ```php /* @var $product Mage_Catalog_Model_Product */ $product = Mage::getModel('catalog/product')->load($id); ``` --- #
@var für Variablen-Typ
## Besser: Feld, falls sinnvoll ```php /** @var Mage_Catalog_Helper_Data */ protected $_catalogHelper; ``` ```php $this->_catalogHelper = Mage::helper('catalog'); ``` -- ## Sonst: Methode ```php /** @return Mage_Catalog_Model_Product */ protected function _createProduct() { return Mage::getModel('catalog/product'); } ``` ```php $product = $this->_createProduct()->load($id); ``` --- # @var für Variablen-Typ ## In Templates unverzichtbar ```php ``` - Kontext in Datei fehlt sonst völlig - PHPStorm Format i.d.R. gute Wahl --- # PhpDoc: Was bringt das? - Akkurate Ergebnisse für "Find Usages" in IDE - Funktionierende Code Completion - "Jump to Source" Navigation - IDE warnt (zu Recht!) bei falscher Schreibweise - Ermöglicht umbenennen von Methoden mit IDE Refactoring Tools --- # Klassenkonstanten statt Magic Strings ## Magento 1: ```php $something = Mage::getModel('example/something'); ``` ## Besser: ```php class IntegerNet_Example_Model_Something extends Mage_Core_Model_Abstract { const ALIAS = 'example/something'; } ``` ```php $something = Mage::getModel(IntegerNet_Example_Model_Something::ALIAS); ``` --- # Klassenkonstanten statt Magic Strings ## Magento 2: ```php return $this->objectManager->get('IntegerNet\Example\Model\Something'); ``` ## Besser: ```php return $this->objectManager->get(\IntegerNet\Example\Model\Something::class); ``` ### .red[Disclaimer:] ObjectManager nur in Factory Klassen benutzen! --- # Magento 2: Konstanten für Parameter ## Benannte Parameter ```php class Mascot { const PARAM_TYPE = 'mascotType'; const PARAM_NAME = 'mascotName' public function __construct($mascotType, $mascotName) { } } ``` ```php $mascotFactory->create([ Mascot::PARAM_TYPE => 'Orange Pig', Mascot::PARAM_NAME => 'Hogento', ]); ``` --- # Klassenkonstanten: Was bringt das? - Code Completion - IDE warnt bei falscher Schreibweise - Ändert sich der Wert (z.B. Klassenalias), muss nur 1 Stelle geändert werden --- # Wo sind Konstanten noch sinnvoll? - Fast überall anstelle von Literals ```php const CONFIG_FOO_ACTIVE = 'example/foo/active'; ``` ```php const DEFAULT_CACHE_LIFETIME = 86400; ``` ```php const ENABLED = 1; const DISABLED = 2; ``` -- - Aber nur fast. Folgendes ist Mist: ```php const ONE = 1; const TWO = 2; ``` ```php const SECONDS_PER_DAY = 86400; ``` - Semantik ist entscheidend! --- # Bonus Tipp \#1 ## Vorhandene Konstanten in Magento finden! - ich tippe "catalog_product" in einem Upgrade Skript -
Strg
-
F
"catalog_product" in `app/code/core/Mage/Catalog` - Treffer! ```php $this->addAttribute(Mage_Catalog_Model_Product::ENTITY, 'something', [ ... ]); ``` - Funktioniert am besten mit Magento 2 oder Zend Framework (`Zend_Db`, `Zend_Http`) --- # Bonus Tipp \#2 ## Lange Klassennamen nerven? - Import Alias funktioniert auch ohne Namespaces ```php *use Mage_Catalog_Model_Product as Product; class IntegerNet_Example_Model_Something { /** * * @return Product */ protected function _createProduct() { return Mage::getModel('catalog/product'); } } ``` --- class: center # .huge[Danke!] .popup[ ###Kontakt: .www[www.integer-net.de] .www[www.schmengler-se.de/blog] .email[fs@integer-net.de] .twitter[@integer_net] .twitter[@fschmengler] ] --- # Quellen - Password Into Moria: Copyright © Ted Nasmith, http://www.tednasmith.com - 8 Lines of code: Greg Young, https://www.infoq.com/presentations/8-lines-code-refactoring