2 Die Migration des MVC-Layers
Im ersten Kapitel sind wir auf die Gründe eingegangen, die für und gegen eine Migration vom ZF1 auf das ZF2 sprechen, und haben die Probleme bei einer Migration skizziert. Jetzt geht es unter anderem um die Migration des MVC-Layers.
Als Basis für unsere Migration hatten wir eine ZF1-Anwendung [1] genommen, die alle wesentlichen Bestandteile einer ZF1-Applikation enthielt. Wir haben dieSkeletonApplication installiert und damit begonnen, die Startseite zu migrieren. Dabei haben wir Layout, Navigation, Translator, Autoloading sowie das View-Skript migriert und einenCompatibilityListener für Migration von ZF1-Konfigurationseinstellungen eingerichtet. Der Zwischenstand ist auf GitHub zu finden [3] und wir befinden uns dort auf dem Stand desstep3-Branches.
In diesem Kapitel werden wir uns um die Migration des MVC-Layers für dasBlog-Modul kümmern. Das betrifft das Routing, die Navigation, die Action-Controller, die View-Skripte und View-Helper. Außerdem werden wir uns um die Migration der Authentifizierung und Autorisierung kümmern. Zu guter Letzt wird der Model-Layer für das Modul mit all seinen Komponenten migriert. Und dann ist da ja auch noch dasUser-Modul.
Dafür machen wir nun genau an der Stelle weiter, an der wir beim letzten Mal aufgehört haben. Zur Erinnerung: Wir beziehen uns auf das Repository für die Migration [2] und steigen wieder beimstep3-Branch ein:
cd /home/devhost/dev.zf2migration.de
git checkout step3
Schritt 4: MVC-Layer für Blog-Modul migrieren
Um den MVC-Layer für dasBlog-Modul zum ZF2 portieren zu können, müssen wir folgende Teilschritte umsetzen:
- Routing migrieren
- Action-Controller migrieren
- View-Skripte migrieren
- View-Helper migrieren
- Navigation migrieren
- Services sauber injizieren
- Adminbereich für Blog migrieren
Schritt 4a: Routing migrieren
Zuerst müssen wir erneut die.htaccess-Datei anpassen, damit alle Anfragen für das Blogmodul zukünftig durch die ZF2-Applikation verarbeitet werden können (Listing 2.1). Das betrifft alle Routen, die mit einem Sprachschlüssel gefolgt von/blog,/beitrag,/kategorie oder/nutzer beginnen. Danach müssen die vier Routen in der Datei/module/Blog/config/module.config.php angelegt werden (Listing 2.2). Die vier Routen lassen sich sicherlich noch optimieren. Sollte die URL-Struktur bei der Migration geändert werden, müssen Sie sicherstellen, dass die alten Routen zumindest für eineÜbergangszeit funktionieren und auf die neuen Routen umleiten. Dabei setzen Sie auch den entsprechenden HTTP-Statuscode. Für unsere Migration wollen wir die Struktur jedoch so beibehalten.
[...]
# Umschreiberegeln für das Zend Framework
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^$|^en$ index.zf2.php
RewriteRule ^application(.*)$ index.zf2.php
RewriteRule ^(de|en)/blog|beitrag|kategorie|nutzer(.*)$ index.zf2.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* /index.zf1.php
[...]
Listing 2.1
return array(
'router' => array(
'routes' => array(
'blog' => array(
'type' => 'Segment',
'options' => array(
'route' => '/:lang/blog[/:page]',
'defaults' => array(
'__NAMESPACE__' => 'Blog\Controller',
'lang' => 'de',
'controller' => 'index',
'action' => 'index',
),
'constraints' => array(
'lang' => '(de|en)',
'page' => '[0-9]*',
),
),
),
'blog-article' => array(
'type' => 'Segment',
'options' => array(
'route' => '/:lang/beitrag/:url',
'defaults' => array(
'__NAMESPACE__' => 'Blog\Controller',
'language' => 'de',
'controller' => 'index',
'action' => 'show',
),
'constraints' => array(
'lang' => '(de|en)',
'url' => '[a-z0-9-]*',
),
),
),
'blog-category' => array(
'type' => 'Segment',
'options' => array(
'route' => '/:lang/kategorie/:url[/:page]',
'defaults' => array(
'__NAMESPACE__' => 'Blog\Controller',
'language' => 'de',
'controller' => 'index',
'action' => 'category',
),
'constraints' => array(
'lang' => '(de|en)',
'url' => '[a-z0-9-]*',
'page' => '[0-9]*',
),
),
),
'blog-user' => array(
'type' => 'Segment',
'options' => array(
'route' => '/:lang/nutzer/:url[/:page]',
'defaults' => array(
'__NAMESPACE__' => 'Blog\Controller',
'language' => 'de',
'controller' => 'index',
'action' => 'user',
),
'constraints' => array(
'lang' => '(de|en)',
'url' => '[a-z0-9-]*',
'page' => '[0-9]*',
),
),
),
),
),
);
Listing 2.2
Wenn Sie jetzt den URLhttp://dev.zf2migration.de/de/blog aufrufen, sollten Sie die Fehlermeldung„Page not found. The requested controller could not be mapped to an existing controller class.“ erhalten. Diese Meldung besagt, dass der durch das Routing ermittelte Controller nicht gefunden werden konnte. Das Routing funktioniert damit schon einmal.
Schritt 4b: Action-Controller migrieren
Als Nächstes muss der Action-Controller für das Blog migriert werden. Dafür legen Sie zuerst die Datei/module/Blog/src/Blog/Controller/IndexController.php mit allen benötigten Verzeichnissen an. Darin legen Sie dann die entsprechende KlasseIndexController mit den vier Aktionsmethoden an, die wir benötigen (Listing 2.3). Zusätzlich müssen wir demControllerLoader den neuen Controller in der/module/Blog/config/module.config.php-Datei bekannt machen (Listing 2.4). Wenn Sie jetzt einmal die Seite im Browser aufrufen, sollten Sie eine Exception mit der Meldung„Unable to render template"blog/index/index"; resolver could not resolve to a file“ erhalten. Der Controller wird also geladen, nur das entsprechende View-Skript kann nicht gefunden werden.
<?php
namespace Blog\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
class IndexController extends AbstractActionController
{
public function categoryAction()
{
return new ViewModel(array());
}
public function indexAction()
{
return new ViewModel(array());
}
public function showAction()
{
return new ViewModel(array());
}
public function userAction()
{
return new ViewModel(array());
}
}
Listing 2.3
return array(
'controllers' => array(
'invokables' => array(
...