ZEND Grundlagen?

NetBull

Erfahrenes Mitglied
Hi,

muss mich in ZEND1 einarbeiten.

Also schnapp ich mir STORM, mach ein Composer Projekt... Und weis nicht weiter.

composer.json:
Code:
{
    "name": "zendframework/zendframework1",
    "description": "Zend Framework 1",
    "type": "library",
    "keywords": [
        "framework",
        "zf1"
    ],
    "homepage": "http://framework.zend.com/",
    "license": "BSD-3-Clause",
    "require": {
        "php": ">=5.2.11"
    },
    "autoload": {
        "psr-0": {
            "Zend_": "library/"
        }
    },
    "include-path": [
        "library/"
    ],
    "config": {
        "bin-dir": "bin"
    },
    "extra": {
        "branch-alias": {
            "dev-master": "1.12.x-dev"
        }
    },
    "require-dev": {
        "phpunit/phpunit": "3.7.*",
        "phpunit/dbunit": "1.3.*"
    },
    "archive": {
        "exclude": ["/demos", "/documentation", "/tests"]
    }
}

I/O Struktur: Siehe PNG File.
mosys-dev-lubuntu-php-storm.png
Wo pack ich nun meine Klassen rein und wie rufe ich meine erste Seite auf?
Hab gedacht da gibt es index controller, etc.. Finde aber den Zugang nicht.

LG NetBu||
 
Hi,

zunächst, deine composer.json kollidiert mit der von Zend-Framework. Du solltest eher eine haben, die so aussieht:

Code:
{
  "name": "netbull/zf1-test",
  "description": "Zend Framework 1 Test Projekt",
  "type": "project",
  "keywords": [
  "framework",
  "zf1"
  ],
   "require": {
     "zendframework/zendframework1": "1.12.11"
   },
   "require-dev": {
     "phpunit/phpunit": "4.5.0",
     "phpunit/dbunit": "1.3.1"
   }
}

Dann machst du ein

Code:
composer update

Jetzt werden alle Abhängigkeiten in dein Vendor-Verzeichnis geladen und eine autoload.php generiert.


Deine Ordner-Struktur sollte jetzt "bin", "vendor", "composer.json" und "composer.lock" beinhalten.

Nun hast du unter "vendor/zendframework/zendframework1" alles liegen, was du für die Entwicklung einer App brauchst, die ZF1 verwendet.


Zunächst solltest du dir ein Skelett erstellen. Dafür gibt es in ./vendor/zendframework/zendframework1/bin die zf.sh, mit der man einfach ein Projekt erstellen kann:

Code:
./vendor/zendframework/zendframework1/bin/zf.sh create project .

Damit bekommst du neue Ordner, nämlich "application", "docs", "library", "public" und "tests", sowie die .zfproject.xml, die Steuerdatei für dein Projekt.

In "application" wird der Business-Code nach dem MVC-Prinzip abgelegt und in "public" die css-, js- und Bilddateien, die du für deine Web-Applikation brauchst.

Als Beispiel existieren der Index- und ErrorController, in "application/controllers" und die zugehörigen Views in "application/views/scripts".

Wenn du neue Controller, Actions und Views erstellen willst, kannst du wiederum das zf.sh-Tool verwenden:

Code:
./vendor/zendframework/zendframework1/bin/zf.sh create controller netbull

Erstellt dann einen Controller "application/contollers/NetbullController.php" sowie die zugehörigen views unter "application/views/scripts/netbull".

Schau dir auch die anderen Commands von zf.sh an:

Code:
./vendor/zendframework/zendframework1/bin/zf.sh help
 
Anpassungen des erstellten Projektes sind jedoch notwendig, da ZF1 nicht für den Einsatz mit composer gedacht war. Daher öffnest du die
public/index.php und änderst sie wie folgt ab:

PHP:
<?php

// Define path to application directory
defined('APPLICATION_PATH')
  || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

// Define application environment
defined('APPLICATION_ENV')
  || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

/*
// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
  realpath(APPLICATION_PATH . '/../library'),
  get_include_path(),
)));

* Zend_Application *
require_once 'Zend/Application.php';
*/

require '../vendor/autoload.php';

// Create application, bootstrap, and run
$application = new Zend_Application(
  APPLICATION_ENV,
  APPLICATION_PATH . '/configs/application.ini'
);
$application->bootstrap()
  ->run();

Erklärung: Die Zend/Application.php ist nicht im include-path, daher binden wir lediglich die autoload.php ein, die alles beinhaltet, was für den Betrieb notwendig ist. Dort drinnen wir der include-path festgelegt und ein Autoloader registriert.

Jetzt kannst du deine Arbeit auf die Implementierung des Business-Codes beginnen.

Um das ganze zu testen, benötigst du allerdings noch einen VirtualHost im Webserver, der auf das public-Verzeichnis zeigt. Eine Anleitung dafür findest du im Abschnitt "Einen virtuellen Host erstellen" auf dieser Seite: http://framework.zend.com/manual/1.12/de/learning.quickstart.create-project.html
 
Sorry, komme erst jetzt dazu. War im Krankenhaus...

Irgendwie ist mir das Konzept noch fremd:
usr@usr-dev:~/PhpstormProjects/ZendComposerProject4$ ./vendor/zendframework/zendframework1/bin/zf.sh create project .
Creating project at /home/dml/PhpstormProjects/ZendComposerProject4
Note: This command created a web project, for more information setting up your VHOST, please see docs/README
Testing Note: PHPUnit was not found in your include_path, therefore no testing actions will be created.

Ich konnte kein composer update machen, hab es mit php composer.phar update versucht. Aber es hatte nichts zum Updaten.
 
Zuletzt bearbeitet:
cool.. skelett hab ich zwar noch nicht, setze mir aber gerade noch mal ne saubere VM auf... denke das ich jetzt rein komme...
 
usr@usr-dev:~/PhpstormProjects/ZendComposerProject4$ ./vendor/zendframework/zendframework1/bin/zf.sh create project .
Creating project at /home/dml/PhpstormProjects/ZendComposerProject4
Note: This command created a web project, for more information setting up your VHOST, please see docs/README
Testing Note: PHPUnit was not found in your include_path, therefore no testing actions will be created.

Das bedeutet, dass das Projekt im Pfad /home/dml/PhpstormProjects/ZendComposerProject4 angelegt wurde. Du solltest danach eine Ordnerstruktur haben, wie ich in Post beschrieben habe. Die Sache mit dem VirtuellenHost (VHOST) habe ich weiter oben auch schon erwähnt.

Ich konnte kein composer update machen, hab es mit php composer.phar update versucht. Aber es hatte nichts zum Updaten.

Du kannst einen symbolischen Link auf das composer.phar anlegen, und den bspw. in /usr/local/bin ablegen und die composer.phar als executable chmodden:

Bash:
ln -s /pfad/zur/composer.phar /usr/local/bin/composer
chmod +x /pfad/zur/composer.phar

Dann sollte das direkte Aufrufen von composer auch klappen. Wenn du noch kein "composer install" im leeren Projekt-Ordner gemacht hast, bringt auch ein "composer update" nichts. Jedoch hattest du ja offenbar schon alles in "vendor" liegen, sonst wäre der Aufruf der zf.sh fehlgeschlagen.

Du sollest versuchen zu verstehen, was composer macht und wie es arbeitet.

composer ist ein Orchestrierungstool, mit dem man Abhängigkeiten der eigenen Anwendung steuern kann. Wenn du schon mal was mit Maven gemacht hast, sollte das Prinzip geläufig sein. Durch "composer install/update" werden die Abhängigkeiten ins "vendor"-Verzeichnis deiner Anwendung geladen. Für jede Abhängigkeit findest zu einen Ordner für den Hersteller und darin einen Unterordner für die Abhängigkeit selbst in "vendor". Die Abhängigkeit liegt dort entpackt vor, in manchen Fällen wird die Abhängigkeit einen Ordner "bin" anlegen, in dem weitere Tools zu finden sind, mit der man die Abhängigkeit von der Commandline bedienen kann. Die zf.sh ist solch ein Tool, das mit ZendFramework 1 kommt.

Also noch mal Kurz:

composer.json: Steuerdatei für composer, um Abhängigkeiten zu definieren (Abschnitt "require" und "require-dev")
composer(.phar): Tool mit dem die Steuerdatei geladen wird und die Abhängigkeiten geladen oder entladen werden, gleichzeitig prüft composer mit Hilfe der Steuerdatei auch, ob alle Randbedingungen erfüllt sind (bspw. die Mindest-PHP-Version).
$PROJEKT_PFAD/vendor/Hersteller/Abhängigkeit-Paket/bin: Beinhaltet Werkzeuge, mit denen Aktionen an der Commandline ausgeführt werden können (im Regelfall irgendwelche Automatisierungsscripte)
Konkret $PROJEKT_PFAD/vendor/zendframework/zendframework1/bin/zf.sh: Werkzeug zum Erstellen oder Anpassen der Zendframework-Anwendung im $PROJEKT_PFAD.
 
Ich arbeite neuerdings mit phpstorm und da kann man neue Composer Projekte anlegen. Die Struktur ist da aber anders. Werde nachher mal versuchen den Composer in einem leeren Projekt mit Deinen Einstellungen zu starten.

Ich brauche dafür nur die composer.phar als executable und die composer.json?
 
Ich arbeite neuerdings mit phpstorm und da kann man neue Composer Projekte anlegen. Die Struktur ist da aber anders.

Das Grundprinzip dürfte auch mit PHPStorm gleich sein. Denn Composer ist eine externe Anwendung, die lediglich in die IDE integriert wurde.

Werde nachher mal versuchen den Composer in einem leeren Projekt mit Deinen Einstellungen zu starten.

Das ist eine sehr gute Idee, denn mit der IDE als Hilfe versteht man die Einzelteile nicht so gut. Besser man erstellt das erstmal von Hand, ohne IDE (ein einfacher Editor genügt dafür alle mal). Dann verstehst du das Prinzip einfacher.

Ich brauche dafür nur die composer.phar als executable und die composer.json?

So ist es. Die composer.json sollte so aufgebaut sein, wie ich in Post 2 beschrieben habe. Ich dokumentiere hier noch mal die Abschnitte (die Kommentare dürfen nicht in die Datei):

Javascript:
/* composer.json */
{
  /* Name des Projektes */
  "name": "netbull/zf1-test",
  /* Beschreibung des Projekts */
  "description": "Zend Framework 1 Test Projekt",
  /* Art des Projektes (bspw. project oder library) */
  "type": "project",
  /* Schlüsselwörter, die in den Index einer Suchmaschine für Composer-Packages aufgenommen werden (z.B. packagist.org) */
  "keywords": [
  "framework",
  "zf1"
  ],
  /* Abhängigkeiten, die zur Laufzeit der Anwendung benötigt werden */
   "require": {
     "zendframework/zendframework1": "1.12.11"
   },
  /* Abhängigkeiten, die ru Entwicklungszeit der Anwendung benötigt werden */
   "require-dev": {
     "phpunit/phpunit": "4.5.0",
     "phpunit/dbunit": "1.3.1"
   }
}
 
@saftmeister
Moin,

das sieht schon wesentlich besser aus als mein Versuch. Aber... :

a) Irgendwie scheint der Composer PHP unit nicht zu installieren
Code:
dev@zend-test:/var/www/zend-test/project1$ ./vendor/zendframework/zendframework1/bin/zf.sh create controller mine
Note: PHPUnit is required in order to generate controller test stubs.
Note: The canonical controller name that is used with other providers is "Mine"; not "mine" as supplied

b) Mein netbull controller ist da aber scheint nicht zu funktionieren.
Also http://zend-test/project1/public/ funktioniert und ich sehe die indexAction des IndexControllers
Aber den Netbull controller kann ich im frontend nicht abrufen.
weder mit http://zend-test/project1/Netbull noch mit zend-test/project1/public/netbull
Muss ich da noch was anderes konfigurieren?

LG NetBu||
 

Neue Beiträge

Zurück