Archive for Dezember 2010


FLOW3 Alpha 14 mit mysql backend auf ubuntu installieren

Dezember 29th, 2010 — 12:34pm

Erst kürzlich habe ich mich mal wieder mit FLOW3 auseinandergesetzt. Da ich keine gute Anleitung im Web gefunden habe wie ich die (momentan) aktuellste Alpha 14 mit mySQL als Backend Storage ans Laufen bekomme, habe ich das hier mal kurz zusammengeschrieben.

Ich weiß, es gibt extra ein Getting Started Package, das ist allerdings für Alpha 6 oder 7 ausgelegt und nimmt außerdem sqlLite als Backend Storage. Ich wollte aber sowohl die aktuellste Version als auch mein favorite RDBMS ausprobieren.

Grundkenntnisse im Umgang mit der Shell und PHP/mySQL sind von Vorteil, aber es sind alle wesentlichen Schritte beschrieben. Los gehts:

Server einrichten

Zuerst habe ich mir eine neue vmware mit ubuntu 10.10 server edition aufgesetzt.

Danach zunächst mal den ganzen LAMP Stack (PHP 5.3, MYSQL 5.1 und Apache 2.2) mit folgendem Command installiert:

$ sudo tasksel install lamp-server

Anschließend noch git installieren:

$ sudo apt-get install git

Und danach können wir auch schon das FLOW3 Repository klonen:

$ cd /var/www/
$ sudo chmod -f -R 777 * ./
$ git clone --recursive git://git.typo3.org/FLOW3/Distributions/Base.git FLOW3
$ sudo chmod -f -R 777 * ./

Apache konfigurieren

Danach müssen wir uns noch einen virtual host anlegen für FLOW3, ähnlich wie beim Zend Framework:

$ sudo nano /etc/apache2/sites-enabled/000-default

Danach den Inhalt der Datei so anpassen (Document Root wird auf FLOW3/Web/ gesetzt und AllowOverride auf All gestellt)

<VirtualHost *:80>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www/FLOW3/Web
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/FLOW3/Web>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

</VirtualHost>

Und Speichern.

Als nächstes noch mod_rewrite enablen:

$ sudo nano /etc/apache2/mods-enabled/rewrite.load

Folgendes reinkopieren:

LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so

Und zum Schluß den apache neu starten:

$ sudo apachectl restart

FLOW3 konfigurieren

Zuerst die .htaccess anpassen, um den Application Context auf development zu setzen (ähnlich wie beim Zend Framework):

$ nano /var/www/FLOW3/Web/.htaccess

Das # vor folgender Zeile wegmachen:

#SetEnv FLOW3_CONTEXT development 

Danach die Routes.yaml editieren:

$ nano /var/www/FLOW3/Configuration/Routes.yaml

Und folgenden Inhalt einfügen:

##
# TYPO3CR subroutes

-
  name: 'TYPO3CR'
  uriPattern: 'typo3cr'
  defaults:
    '@format': 'html'
  subRoutes:
    TYPO3CRSubroutes:
      package: TYPO3CR

##
# Subroutes from the Welcome package.
#
# If the package "Welcome" is installed, its fallback route will point to an
# informative welcome screen.

-
  name: 'Welcome'
  uriPattern: ''
  subRoutes:
    WelcomeSubroutes:
      package: Welcome

##
# Subroutes from the DocumentationBrowser package.
#

-
  name: 'Documentation Browser'
  uriPattern: ''
  subRoutes:
    DocumentationBrowserSubroutes:
      package: DocumentationBrowser

##
# FLOW3 subroutes

-
  name: 'FLOW3'
  uriPattern: ''
  defaults:
    '@format': 'html'
  subRoutes:
    FLOW3Subroutes:
      package: FLOW3

Und danach die Settings.yaml bearbeiten:

$ nano /var/www/FLOW3/Configuration/Settings.yaml

Und diesen Inhalt einfügen:

FLOW3:
  persistence:
    backend: 'F3\FLOW3\Persistence\Backend\GenericPDO\Backend'
    backendOptions:
      dataSourceName: 'mysql:host=localhost;dbname=flow3_test'
      username: root
      password: password

mySQL DB aufsetzen

Damit FLOW3 mysql auch als Storage Backend nehmen kann, müssen wir die in der Settings.yaml eingetragene DB natürlich auch noch anlegen:

$ mysql -u root -p
CREATE DATABASE flow3_test CHARACTER SET utf8 COLLATE utf8_general_ci;
exit;

Anschließend muss noch ein dump file eingespielt werden, in dem FLOW3 seine default Datenbank Tabellen anlegt. Der Dump liegt unter /var/www/FLOW3/Packages/Framework/FLOW3/Resources/Private/Persistence/SQL/DDL.sql, hat bei mir aber nicht auf Anhieb funktioniert den einzuspielen.

Ich habe die Datei wie folgt geändert:

BEGIN;

CREATE TABLE entities (
  identifier CHAR(36) PRIMARY KEY NOT NULL,
  type VARCHAR(250) NOT NULL,
  parent CHAR(36)
) TYPE=innodb;
CREATE INDEX elookup ON entities (identifier, type);

CREATE TABLE valueobjects (
  identifier CHAR(40) PRIMARY KEY NOT NULL,
  type VARCHAR(250) NOT NULL
) TYPE=innodb;
CREATE INDEX vlookup ON valueobjects (identifier, type);

CREATE TABLE properties (
  parent CHAR(40) NOT NULL,
  name VARCHAR(250) NOT NULL,
  multivalue INTEGER NOT NULL DEFAULT '0',
  type VARCHAR(250) NOT NULL,
  PRIMARY KEY (parent, name)
) TYPE=innodb;

CREATE TABLE properties_data (
  parent CHAR(40) NOT NULL,
  name VARCHAR(250) NOT NULL,
  `index` VARCHAR(250),
  type VARCHAR(250) NOT NULL,
  array CHAR(24),
  string TEXT,
  `integer` INTEGER,
  `float` DECIMAL,
  `datetime` INTEGER,
  `boolean` CHAR(1),
  object VARCHAR(40)
) TYPE=innodb;
CREATE UNIQUE INDEX id ON properties_data (parent, name, `index`);
CREATE INDEX id1 ON properties_data (parent, name);

COMMIT;

Und danach per

$ mysql -u root -p flow3_test < /var/www/FLOW3/Packages/Framework/FLOW3/Resources/Private/Persistence/SQL/DDL.sql

eingespielt. Möglicherweise geht das dann auch irgendwie besser, hat aber zumindest funktioniert.

Finishing Notes

Das wars dann auch schon, wenn man nun die vmware mit ihrer IP Adresse aufruft im Browser sollte der Welcome Screen von FLOW3 zu sehen sein. Danach kann man im Getting Started Tutorial weiter machen. Was mir noch aufgefallen ist, in Kapitel 8 ist von

$this->objectFactory->create('...')

die Rede, welches im Controller aufgerufen wird. Das funktioniert aber nicht mehr, in dieser Alpha Version funktionierte das Erstellen eines neuen Objekts über:

$this->objectManager->create('...');


Mein erster Eindruck

... ist natürlich nur sehr vorläufig, und nur basierend auf dem bißchen was ich von dieser Alpha (!) 14 gesehen habe. Trotzdem, here it comes:

Losgelöst von jeglichen Komponenten nutzt FLOW3 natürlich auch sehr gut die neuen PHP 5.3 Features, vornehmlich eben Namespaces. Der Code, den ich bisher gesehen habe gefällt mir gut, durchdachte und nachvollziehbare Struktur - ich denke, trotz vieler nicht-trivialer Konzepte in FLOW3 sollte man dort einen guten Einstieg finden können.

Was mir bisher gut gefallen hat: die Dependency Injection Komponente. DI per Annotations funktioniert sehr gut und sehr "seamingless", ohne großen XML Konfigurationsaufwand. Allerdings gebe ich auch zu, dass was ich momentan bei den meisten meiner Projekte verwende (Symfony Dependency Injection) scheint mir zumindest vom Featureset her nicht unterlegen zu sein.

Worauf ich mich sehr gefreut habe, was ich allerdings noch nicht ausprobieren konnte, ist die AOP Komponente. Möglicherweise sind die Beispiele, die ich mir kopiert habe veraltet. AOP im Allgemeinen interessiert mich sehr und könnte einige Probleme lösen, ich bin allerdings auch gespannt, wie sich AOP im Praxis-Einsatz bewährt und ob das nicht alles zu undurchsichtig wird durch zu viel "Magic" im Hintergrund. Nützlich, aber auch herausfordernd - das war zumindest mein Eindruck wie ich das letzte Mal mit AOP in Spring.NET zu tun hatte. Mal sehen, wie es in FLOW3 implementiert ist...

Zur MVC Komponente: Es ist halt eine ActionController Implementierung. Ok, kann nie schaden. Zumindest ist der Aufbau der Verzeichnisstruktur wesentlich sinnvoller als z. B. im Zend Framework. Man hat auch out-of-the-box Dependency Injection in den Controllern, das ist ja beim Zend Framework auch nicht gerade selbstverständlich... Mit der Fluid Template Engine konnte ich mich schon recht früh nicht anfreunden, die Syntax und die Denke dieser Komponente geht mir zu sehr in Richtung JSP Templates. Hier würde ich definitiv eine Zend_View artige Lösung mit plain-old .phtml Templates vorziehen. Das ist natürlich auch eine persönliche Präferenz.

Die für mich wichtigste Frage in allen Frameworks ist für mich grundsätzlich: wie ist das Problem des DB Zugriffs gelöst? Also: Persistence. Das Zend Framework hat sich da insofern aus der Affäre gezogen in dem sie einen vor die Wahl gestellt haben; nimm das crappy Zend_DB_Table Zeug oder lass dir selbst was einfallen. Glücklicherweise ist Doctrine 2 einfach zu integrieren in das Zend Framework und stellt einen sehr mächtigen ORM zur Verfügung (zwar Stand heute nicht gerade frei von Bugs, aber gut...). Die Persistence Komponente in FLOW3 hat mich deswegen sehr interessiert. Wie ich dann festgestellt habe, besteht das Storage Backend im wesentlichen aus 4 Tabellen. Von der Struktur her kommts mir so ein bißchen vor wie eine "poor mans object database". Überzeugt mich nicht 100%ig im Moment, keine Ahnung, was da noch kommt bis zur 1.0.0 final, deswegen will ich da auch nicht zu tief einsteigen in dieses Thema. Bezogen auf die aktuelle Tabellenstruktur fasse ich mal eine meiner Bedenken auf ein Wort zusammen: Reporting? Anyone?

Was mich abseits von Komponenten und Techie-Zeug verwundert momentan (Stand 29.12.10): wie wenig ich zu FLOW3 finden konnte im Internet. Ich finde ein paar Blogs und Websites von Agenturen, auf denen mir erzählt wird "FLOW3 wird toll" mit dem Nachsatz "Aber ich habs noch nicht ausprobiert". Hiermit sei gesagt: ich habs etwas ausprobiert und FLOW3 könnte toll werden. Was aber schade wäre: wenn der Release von FLOW3 aufgrund der einfach deutlich größeren Präsenz von Konkurrenten wie Zend Framework oder Symfony (die ja auch beide neue Versionen auflegen) nicht genügend beachtet werden würde. Ich hoffe einfach mal, diese Beachtung stellt sich aber der Beta Phase dann ein.

Ich bin sehr gespannt welche Richtung die weitere Entwicklung dieses ambitionierten Frameworks nimmt. Wenn die technisch hoch gesteckten Ziele so erreicht werden können wie gedacht und FLOW3 auch nochmal einen Performance Schub bekommt, dann wird es eine Bereicherung für die PHP Welt sein. Aber bis dahin ist es auch noch ein weiter Weg.

Comment » | FLOW3, PHP

Back to top