PHP-Entwicklung mit Visual Studio 2013 und TFS

Die meisten VS-Benutzer wissen gar nicht, dass man mit der VS-Plattform inzwischen auch sehr gut komplett andere Plattformen adressieren kann, als Microsoft das eigentlich vorsieht. Ein gutes Beispiel hier ist PHP. Ich zeige am Beispiel von der Devsense PHP Tools for Visual Studio, was hier alles möglich ist.

Vorbemerkungen

Zunächst stellt sich wahrscheinlich erstmal die Frage, wozu das Entwickeln von PHP-Anwendungen im VS eigentlich gut sein soll. Ansätze in diese Richtung gab es schon zuhauf und meist waren sie nicht sehr produktiv einsetzbar. Die meisten Plugins adressieren hierbei einfach nur die IntelliSense-Unterstützung für PHP, was beileibe aber nicht ausreicht, um wirklich effektiv arbeiten zu können.

Damit man effektiv PHP entwickeln kann, sind folgende Anforderungen zu erfüllen:

  • Die PHP-Projektstruktur muss sauber in die Projektmappen-Struktur des Studios integriert werden.
  • IntelliSense ist durchgängig zu unterstützen.
  • Das Debugging aus dem Studio heraus muss unterstützt werden.
  • Änderungen am Visual Studio müssen sich ggf. im Tool widerspiegeln.

So richtig „nice“ ist eine Integration, wenn:

  • Der Team Explorer unterstützt wird.
  • Updates per Extension-Manager eingespielt werden.

Devsense PHP Tools for Visual Studio

Wir haben seit über einem Jahr die PHP-Tools für Visual Studio von Devsense im Einsatz. Für den kommerziellen Einsatz bezahlt man pro Entwickler 149 $ im ersten Jahr und dann jeweils 98 $ für eine Verlängerung. Für die private Nutzung fallen 79 $ (49 $) an.

Folgende Features, die ich in diesem Beitrag noch ein wenig näher beleuchten möchte, bekommt man dafür:

  • Eine vollständige Code-Editor-Unterstützung für PHP-Dateien inkl. IntelliSense, Region-Support und z.B. Support für das PHPDoc-Format.
  • XDebug-Unterstützung inkl. einer sehr kleveren Integration mit dem IIS Express.
  • Integration in den Team Explorer.
  • Erweiterung des HTML-Editors, sodass PHP-Dateien mit Inline-PHP-Code ebenfalls unterstützt werden.
  • Eigene Code-Snippets.
  • Integration in Klassenansicht, Objekt-Explorer und Navigation Bar.
  • Vollständige Integration in Fehler-Ausgabe und Output-Bereich (Build ist möglich).
  • Vollständige Kompatibilität zu Solution-Format inkl. Ordnern.
  • Integration in Publish (nicht vollständig, aber meist ausreichend).

Darüber hinaus kann Devsense vor allem mit einem echt guten und persönlichen Support auftrumpfen. Ich hatte bereits diverse Problemchen, die wirklich sehr speziell waren. Eine E-Mail an das Support reichte und einer der Entwickler antwortete i.d.R. innerhalb von Stunden. Meist bekam ich sogar eine Alpha-Version, um ein von mir angefragtes Feature zu erhalten.

Seit vorgestern ist nun Visual Studio 2013 vollständig und offiziell unterstützt, was ich zum Anlass genommen habe, diesen Artikel zu verfassen.

Screencast

Für die eiligen unter den Lesern hier der Cast (englisch). Achtung: Das ist eigentlich Teil 2. Teil 1 findet Ihr weiter unten!

Installation

Grundkomponenten

Die einfachste Art der Installation bietet sich über die VS-Extensions direkt aus dem Visual Studio heraus an:

Abb. 1: Installation per Extension
Abb. 1: Installation per Extension

Nach dem dann obligatorischen VS-Neustart erscheint der Lizenz-Dialog von PHP Tools:

Abb. 2: Lizenz-Dialog
Abb. 2: Lizenz-Dialog

Emtweder man startet nun die Trial-Phase oder hat bereits einen Key. Einschränkungen funktionaler Art gibts während der Trial keine.

Manuell

Bis vor ca. einem halben Jahr war die Installation noch ein wenig trickreich. Das lag weniger an den Tools selbst als an der Integration ins Debug-System. Devsense nutzt hier XDebug. Das ist letztlich eine Open-Source-Debug-Integration für die PHP.exe. Das ganze gibt es sowohl für Apache als auch IIS. War man nun mit dem Setup durch, musste man meist noch den IIS (Express) php-fähig machen und dann XDebug darauf richtig konfigurieren.

Dafür gibt es seit eh und jeh unter Tools -> Options -> PHP entsprechende Einstellungen. Dort findet sich zunächst der Advanced-Bereich:

Abb. 3: Advanced-Optionen
Abb. 3: Advanced-Optionen

Hier kann man inzwischen einstellen, ob man die Unterstützung für HTML-tags in PHP-Dateien haben möchte und auf welchem Port die Verbindung zwischen XDebug und Visual Studio erstellt werden soll. Das kann man sich als VS-Mensch am besten wie beim dem alten ASP.NET-Debugger vorstellen, der ja auch einen Prozess erstellte, damit man ASP.NET direkt im VS debuggen konnte.

Auf der Seite Interpreter selbst teilt man den Tools dann noch mit, wo er die PHP-Executables auf dem aktuellen System findet:

Abb. 4: Interpreter-Optionen
Abb. 4: Interpreter-Optionen

Das war nun schon sehr bequem gemacht. Hat man „seltsame“ Einstellungen in der php.ini, bietet dieser Dialog sogar eine automatische Korrektur an.

Das Problem war jetzt eigentlich nur, dass man auf einem frischen System immer noch wissen musste, wie man PHP, IIS und XDebug vernünftig zusammen bringt. Kein Hexenwerk, aber immerhin lästig.

Automatisches Setup

Zunächst legt man erstmal ein neues Projekt an. Dazu erweitern die PHP Tools den VS-Dialog um eine Projektmappen-Vorlage:

Abb. 5: Projekt-Vorlage
Abb. 5: Projekt-Vorlage

Nach wenigen Augenblicken wird ein neues Projekt im Solution-Explorer gezeigt:

Abb. 5: Projekt-Vorlage
Abb. 5: Projekt-Vorlage

Seit einigen Versionen (weiß nicht mehr genau, seit welcher) hat sich nun auch das erledigt. Beim ersten „F5“-Drücken erscheint hier auf einem frischen Setup eine Nachfrage:

Abb. 7: Assistent für PHP-Konfiguration
Abb. 7: Assistent für PHP-Konfiguration

Klickt man nun auf OK, rödelt ein Powershell-Script durch, das letztlich den Web Platform Installer (WPI) nutzt, um die notwendigen Komponenten (IIS, PHP for IIS, XDebug) auf das System zu bringen:

Abb. 8: WPI-Script in Aktion
Abb. 8: WPI-Script in Aktion

Beim nächsten Mal F5 wird dann wirklich gestartet. Das Ergebnis ist, dass zunächst einmal ein Browser aufpoppt und die Seite anzeigt. Außerdem ist da noch ein Tray-Icon:

Abb. 9: PHP Debug-Prozess im Tray
Abb. 9: PHP Debug-Prozess im Tray

Es ist übrigens später immer eine gute Idee, diesen Prozess im Tray bei Problemen im Zweifel zu beenden und dann neu F5 zu drücken. Das allerdings ist wiederum auch nichts Besonderes, weil man das von anderen Prozessen dieser Art auch nicht anders kennt :-).

Das Ergebnis des WPI-Installierers landet übrigend größtenteils im Ordner C:\Program Files (x86)\IIS Express\PHP\:

Abb. 10: Dateisystem
Abb. 10: Dateisystem

Den kompletten Prozeß habe ich in einem eigenen Screencast einmal einzeln dargestellt:

Coding

Jetzt, wo sozusagen alles eingerichtet ist, gehts also ans Programmieren. Hier ist natürlich zunächst IntelliSense von höchster Wichtigkeit. Im Bereich PHP muss man dazu 2 unterschiedliche Dateitypen unterscheiden.

  • Reine PHP-Dateien, die meist für Klassen oder API-Funktionen zum Einsatz kommen.
  • View-Dateien, die einen Mix aus HTML, JavaScript und PHP darstellen.

Erwartungsgemäß stellen die reinen PHP-Dateien die geringste Hürde dar. IntelliSense ist voll unterstützt. Tippt man also z.B. „str“, so zeigt und IntelliSense nun sauber die gesamten String-Funktionen an, die uns zur Verfügung stehen:

Natürlich sind auch Parameter-Funktionen und statische Methoden unterstützt.

Ein wenig trickreich wird es, wenn man die Tools mit anderen Extensions, wie beispielsweise ReSharper nutzt. Schuld hier ist eigentlich ReSharper, weil es die PHP-Dateien als HTML-Dateien erkennen will und ständig Unsinn bei der Einrückung anstellt. Für alle ReSharper-Nutzer hier ein kleiner Tipp. Man kann in den ReSharper-Optionen einstellen, dass er PHP-Dateien komplett in Ruhe lässt:

1. Über ReSharper -> Options in den Bereich „Code Inspection“ und dann auf „Edit Items to Skip“ anklicken:

Abb. 11: ReSharper Schritt 1
Abb. 11: ReSharper Schritt 1

2. Im neuen Fenster der Liste rechts den Eintrag „*.php“ hinzufügen.

Abb. 12: ReSharper Schritt 2
Abb. 12: ReSharper Schritt 2

Das behebt übrigens auch falsche Anmerkungen des ReSharper zu PHP.

Solche und ähnliche Phänomene werden in Zukunft meiner Meinung nach häufiger auftreten, weil das meiner Meinung nach nun mal die Schattenseite der ganzen Extensibility des VS sind. Je tiefer eine Extension VS erweitert und je besser sie somit integriert ist, desto schneller beißt sie sich anscheinend mit anderen Extensions. Irgendwas ist immer!

Einige alte bekannte, wie Surrond With funktionieren wiederum gar nicht mit dem Editor. Hier liegt einfach ein anderes Code-Format vor, sodass das Snippet (z.B. Try-Catch) einfach nur eingefügt wird, aber kein Surrounding statt findet.

Das soll aber nicht heißen, dass Code Snippets nicht funktionieren würden. Im Gegenteil. PHP Tools bringt die üblichen Snippets, wie z.B. foreach, while, forr oder auch try bereits mit. Sie sind im Snippets-Manager unter der Language „PHP“ zu finden.

Was auch ganz nice ist, ist die Möglichkeit, PHP-internen Code zumindest laut Definition aus den sog. Metadaten anzuspringen. Geht man z.B. auf einer PHP-Funktion, wie str_replace auf „Go To Definition“, erscheint folgendes wird Folgendes gezeigt:

Abb. 15: Go To Defintion in Metadata
Abb. 15: Go To Defintion in Metadata

Man sieht zwar nicht den Quellcode (das wäre ein wenig zu viel verlangt), aber man sieht die Kommentare aus der PHP Core sowie die komplette Methoden-Signatur! Extrem hilfreich und es braucht wohl nicht erwähnt werden, dass Go To Definition innerhalb des eigenen Codes sowieso funktioniert.

Noch nicht enthalten sind Features, wie Peek Definition und Code Lense, obwohl ich mir vorstellen könnte, dass die demnächst noch nachgeliefert werden.

Debugging

Wie bereits erwähnt, startet beim Debugging ein spezieller Host-Prozess, der letztlich den XDebug auf einem IIS Express mit konfiguriertem PHP angeht. Das Debugging funktioniert inwzwischen fast genau so gut, wie unter C#.

„Fast“ heißt hier, dass bestimmte Optionen während des Debuggings nicht zur Verfügung stehen. Das sind u.a.:

  • IntelliSense
  • Autos-Window (nicht alle Features)
  • Edit and Continue

und ähnliche Features. Bei genauerem Nachdenken können diese Features auch gar nicht funktionieren, ich wollte es aber trotzdem nicht unerwähnt lassen. Was aber z.B. voll unterstützt wird, ist Quick Watch. Ein Beispiel dazu:

Abb. 14: Quick Watch auf Ausdruck
Abb. 14: Quick Watch auf Ausdruck

Hier habe ich während der Debugging-Session einfach den komplette str_replace-Term markiert und dann mit der rechten Maustaste aus dem Kontextmenu schließlich Quick Watch ausgewählt. Das Ergebnis ist der vollständig ausgewertete Term. Cool!

Team-Arbeit

Mit 2 Worten: Es funktioniert. Ganz einfach deshalb, weil PHP Tools sowohl das SLN- als auch das PROJ-Format (MSBUILD) voll unterstützen und daher der Team Explorer kein Problem mit dem Hinzufügen zu Team-Projekten hat. Daraus folgt beinahe automatisch, dass nun auch Git kein Problem darstellt. Was will man mehr?

Fazit

Da müssen sich andere Tools, wie freie Editoren oder auch Eclipse aber mal strecken, um dieses Feature-Set für PHP-Entwickler bereit zu stellen. Wer schon mal eine Windows-basierte, debugging-fähige Entwicklungsumgebung unter Nutzung von XAMPP oder so aufbauen wollte, wird ein Lied von dem dort gelieferten Komfort singen können. Die Integration ist absolut genial und die Jungs von Devsense sind immer heftig am nachliefern. Ich jedenfalls entwickle nur noch im VS, auch bei PHP-Projekten.

2 Antworten auf „PHP-Entwicklung mit Visual Studio 2013 und TFS“

  1. Danke für die Webcasts. Habe PHP tools for Visual Studio installiert (VS2013 u. 2015). Habe ein simples Projekt mit einer index.php calling phpinfo()); erstellt. Debugging und Breakpoints funktionieren super, solange ich die in iis-express breitgestellte URL per browser aufrufe. Breakpoints wirken aber nicht, wenn ich die identische URL per RESTClient, wie z.B. Postman, aufrufe. Der Request wird zwar richtig ausgeführt, aber der Breakpoint greift nicht. Was mache ich falsch?

    1. Hallo Hartmut, das wird daran liegen, dass der Debugger-Hook nur durch die per VS gestartete Browser-Instanz besteht. Man merkt das i.d.R. auch daran, dass bei Beenden des gestarteten Browsers auch die Debugging-Session beendet wird.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.