Magento - das Framework komplett nutzen

Immer wieder sehe ich, wie man mit normalen PHP-Funktionen versucht, Dinge zu erledigen, welche aber von Magento entweder anders vorgesehen sind, oder für die es im Zend-Framework schon Lösungen gibt. Diese müssen aber eben nur genutzt werden. Umso besser man das Framework kennt, desto einfacher und schneller kommt man zu dem gewünschten Ergebnis.

Nun behaupte ich natürlich nicht, dass ich alles kenne - dafür muss man sicher sehr viel länger mit dem Framework arbeiten als ich es getan habe. Und vor allem muss man auf bestimmte Probleme gestoßen sein um dessen Lösung zu kennen.

In diesem Artikel möchte ich einfach ein paar Beispiele nennen und eher darauf aufmerksam machen, dass man beim Entwickeln immer versuchen sollte, eine Lösung per Framework zu finden, als direkt PHP-Funktionen zu nutzen. Aber warum?

  • Weil man so zum Beispiel den anderen Entwicklern die Chance gibt, Probleme mit dem eigenen System an einer zentralen Stelle zu lösen, anstatt den ganzen Code zu durchsuchen.
  • Oder auch, weil andere die Logik verändern wollen. Gerade Magento hat etliche Helper, welche für die einfachsten Aufgaben herangezogen werden. Nutzt man diese fleißig, kann man an einer Stelle das Verhalten des gesamten Shops verändern - und das, ohne einzelne Extensions Patchen zu müssen.
  • Die Entwickler des Frameworks berücksichtigen in den einzelnen Funktionen schon die Serverkonfiguration und verhalten sich an einigen Stellen anders, wenn z.B. eine PHP-Erweiterung fehlt. Oder haben Probleme mit php-Funktionen in bestimmten Versionen gefixt. Mit dem Einsatz dieser Funktionen umgeht man also eventuell Probleme, die man auf dem eigenen Server erst gar nicht bemerkt, sondern irgendwann auf dem Kundensystem auffallen. Und dann wird lange gesucht.

Hier mal eine Liste, welche ich in den letzten Wochen während der täglichen Arbeit mit Magento zusammengestellt habe. Manches schien mir eventuell einfach zu trivial um es aufzuführen, anderes ist es für Euch wahrscheinlich trotzdem. Weiterhin habe ich mir vorgenommen, die Liste zu aktualisieren wenn mir mehr einfällt.

$param = $controller->getRequest()->getParam('paramname', false);
# statt
$param = $_GET['paramname'] ?: false;

throw Mage::exception('Mage_Core', Mage::helper('customer')->__('Invalid login or password.'), self::EXCEPTION_INVALID_EMAIL_OR_PASSWORD);
# statt
throw new Exception('Invalid login or password.');

Mage::helper('core')->jsonEncode($jsonData);
# statt
json_encode($jsonData);

// Header senden
$this->getResponse()->setHeader('Content-Type', 'application/json');
# statt
header('Content-Type', 'application/json');

// Dateidownloads
$this->_prepareDownloadResponse($fileName, $pdfdata, 'application/x-pdf');
# statt
$this->getResponse()->setHeader('Content-Type', 'application/x-pdf');
echo $pdfdata;
exit;

// CSV-Dateien
$file = new Varien_File_Csv();
$file->getData('/path/to/file');
# statt
fopen('/path/to/file', 'r'); fgetcsv(...); fclose();

$dateTimestamp = Mage::getModel('core/date')->timestamp();
# statt
$dateTimestamp = time();

$timeStamp = Varien_Date::toTimestamp($date);
# statt
strtotime($date);

Zend_Validate::is($email, 'EmailAddress');
# statt
preg_match('...');

Wie sind Eure Erfahrungen? Ich freue mich über Ergänzungen in den Kommentaren.



Ein Beitrag von Matthias Kleine
Matthias's avatar

Matthias Kleine hatte Mitte 2012 die ersten Kontakte mit Magento - dies geschah durch die Anstellung bei der code-x GmbH als Softwareentwickler. Seit dem bildet er sich ständig im Bereich eCommerce fort, schreibt eigene Extensions und stellt diese gerne auch als OpenSource-Projekte auf GitHub zur Verfügung. Seit Ende 2013 wird Matthias auch im Verzeichnis der zertifizierten Magento-Entwickler gelistet. @klein0r

Alle Beiträge von Matthias

Kommentare
Türchen 06: Zentrales Reporting über die Magento-API - Magento Blog für Entwickler und eCommerce-Shops - webguys.de Magento Blog für Entwickler und eCommerce-Shops – webguys.de am

[…] und dem Client mitgeteilt, dass die authentifizierung fehlgeschlagen ist. Hier noch ein Hinweis auf meinen letzten Beitrag – suchen im Framework lohnt sich eben immer. Falls Daten vorhanden sind, bekommt man diese […]

Matthias Kleine am

jsonEncode kann zumindest noch Übersetzungen und jsonDecode nutzt sogar die core-Funktion, unterstützt dabei aber sogar noch anständiges Error-Handling (abhängig von der php-Version). In den meisten Fällen macht es wahrscheinlich keinen Unterschied, aber ich würde den Framework-Weg immer bevorzugen.

Hast Du zu dem Vergleich mal ein paar Zahlen? Würde mich wirklich mal interessieren wie stark sich das am Ende auswirkt.

Matthias am

Also die JSON Funktionen Mage::helper('core')->jsonEncode($jsonData); und Mage::helper('core')->jsonDecode($jsonData); sind unfassbar langsam gegenüber den nativen Methoden. Es gibt auch eigentlich keinen Grund diese zu benutzen.

Thomas am

Dem Beitrag kann ich nur zustimmen, habe noch und nöcher im Code Stellen gefunden wo die Entwickler z.B. versuchen Währungen selber zu formatieren (und das sind die harmloseren Fälle).


$value = '1.0000';
$currency = Mage::helper('core')->formatCurrency($value);
# statt
$currency= str_replace('.',',',$value);[...]
Matthias Kleine am

Das stimmt - wirklich schönes Exceptionhandling wurde nicht implementiert. Oder man muss sich eben ein Exception-Verzeichnis anlegen und dann wieder direkt mit throw new... arbeiten. Der Autoloader sollte ja klar kommen.

Fabian Schmengler am

Was mir an der Mage::exception() factory method nicht gefällt, ist dass sie anders als z.B. bei Mage::helper() nur einen Exception-Typ pro Modul zulässt. Aber allemal besser, das zu nutzen, als immer nur Exception oder Mage_Core_Exception zu werfen.

Dein Kommentar