MVC Problem (Zend Framework 2)

Ich komm einfach nicht dahinter was ich Falsch mache…

Ich habe die ZendSkeletonApplication nach Anleitung installiert und den Apache bzw. VHost konfiguriert. Es Funktioniert soweit auch alles wunderbar. Also es wird der IndexController aufgerufen und auch die rewrite regeln greifen richtig.

Jetzt möchte ich eine neue „Seite“ (sub.domain.de/verwaltung) erstellen also habe ich einen neuen Controller erstellt (also den IndexController kopiert und angepasst)

/module/Application/src/Application/Controller/VerwaltungController.php
[php]<?php
namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

class VerwaltungController extends AbstractActionController
{
public function verwaltungAction()
{
return new ViewModel();
}
}[/php]

und eine View /module/Application/view/application/verwaltung/index.phtml
[html]






Verwaltung




TEST





[/html]

beim Aufruf von sub.domain.de/verwaltung kommt meine 404 hab schon zum 10.mal die korrekte Schreibweise der Dateien und Pfade geprüft.

Ich kenn mich zwar nicht aus mit dem ZF aber fehlt da nicht das Routing oÄ?

Du befindest dich hier in der Application, jedoch solltest du dir ein eigenes Modul anlegen. Ich weiß es ist am Anfang sehr verwirrend, daher empfehle ich dir am besten das ZF2 Tutorial am Anfang dazu anzuschauen. Dort wird dies anhand eines Beispiels gut erklärt. Bei Fragen kannst du gerne auf mich zurück kommen.

Hier ein kleines Beispiel.

Verwaltung
[INDENT]config
[INDENT]module.config.php[/INDENT]
src
[INDENT]Verwaltung
[INDENT]Controller
[INDENT]VerwaltungController.php[/INDENT][/INDENT][/INDENT]
view
[INDENT]verwaltung
[INDENT]verwaltung
[INDENT]index.phtml[/INDENT][/INDENT][/INDENT]
Module.php
[/INDENT]
module.config.php
[PHP]return array(
‚controllers‘ => array(
‚invokables‘ => array(
‚Verwaltung\Controller\Verwaltung‘ => ‚Verwaltung\Controller\VerwaltungController‘,
),
),

// The following section is new and should be added to your file
'router' => array(
    'routes' => array(
        'album' => array(
            'type'    => 'segment',
            'options' => array(
                'route'    => '/verwaltung[/:action][/:id]',
                'constraints' => array(
                    'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                    'id'     => '[0-9]+',
                ),
                'defaults' => array(
                    'controller' => 'Verwaltung\Controller\Verwaltung',
                    'action'     => 'index',
                ),
            ),
        ),
    ),
),

'view_manager' => array(
    'template_path_stack' => array(
        'album' => __DIR__ . '/../view',
    ),
),

);[/PHP]

VerwaltungController.php
[PHP]<?php

namespace Verwaltung\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

class VerwaltungController extends AbstractActionController
{

public function indexAction()
{
    return new ViewModel();
}

}
[/PHP]

Module.php
[PHP]<?php

namespace Verwaltung;

use Zend\Mvc\ModuleRouteListener;
use Zend\Mvc\MvcEvent;

class Module
{
public function onBootstrap(MvcEvent $e)
{
$eventManager = $e->getApplication()->getEventManager();
$moduleRouteListener = new ModuleRouteListener();
$moduleRouteListener->attach($eventManager);
}

public function getConfig()
{
    return include __DIR__ . '/config/module.config.php';
}

public function getAutoloaderConfig()
{
    return array(
        'Zend\Loader\StandardAutoloader' => array(
            'namespaces' => array(
                __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
            ),
        ),
    );
}

}[/PHP]

Danke nookie,

ich habe jetzt ein Modul erstellt und kann es auch aufrufen aber ehrlich gesagt finde ich das alles unglaublich umständlich und an manchen stellen auch undurchschaubar.
Beispielsweise bei den View Ordnern, in dem schon vorhandenen Modul ist die IndexView unter /module/Application/view/application/index/index.phtml aber ich soll meine laut Tutorial in /module/Verwaltung/view/verwaltung/verwaltung/index.phtml anlegen ich dachte mit einer indexAction Funktion rufe ich */index/index.phtml und mit einer blablaAction Funktion rufe ich */blabla/index.phtml auf… Muss ich dafür im Router oder der Controller-Config was ändern?

Und noch ein Problem was mir zu schaffen macht…
Ich müsste jetzt mehrere Module in einem Verschachteln damit meine URL so aussieht:
sub.domain.de/verwaltung/einsatz/eintragen/
sub.domain.de/modul------/modul-/aktion----/
oder macht man das über die Router Einstellung das verwaltung nur sowas wie ein platzhalter ist??

ich habe jetzt ein Modul erstellt und kann es auch aufrufen aber ehrlich gesagt finde ich das alles unglaublich umständlich und an manchen stellen auch undurchschaubar.
Beispielsweise bei den View Ordnern, in dem schon vorhandenen Modul ist die IndexView unter /module/Application/view/application/index/index.phtml aber ich soll meine laut Tutorial in /module/Verwaltung/view/verwaltung/verwaltung/index.phtml anlegen ich dachte mit einer indexAction Funktion rufe ich */index/index.phtml und mit einer blablaAction Funktion rufe ich */blabla/index.phtml auf… Muss ich dafür im Router oder der Controller-Config was ändern?

Stell dir mal einfach die Frage, was wäre wenn du 5 Module hast die alle Ihre View in /module/Application/view/application/index/index.phtml haben ? :wink:

Mit der indexAction() würdest du index.phtml aufrufen, mit blablaAction() würdest du dementsprechend blabla.phtml aufrufen. Achtung! Wenn du hierbei CamelCase verwendest, wird Name der View Datei mit Bindestrichen getrennt.

Beispiel:
addEinsatzAction()
add-einsatz.phtml

Achja, mir ist oben ein kleiner Fehler unterlaufen. Statt „album“ muss dort natürlich „verwaltung“ in deinem Fall stehen. Gibt den Pfad zum View Verzeichnis an.

'view_manager' => array( 'template_path_stack' => array( 'verwaltung' => __DIR__ . '/../view', ), ),

Ich hab mal ne Frage aus Neugierde, es ist doch nicht default Einstellung das die blablaAction auch die blabla.phtml aufruft? ich dachte man kann in der Action festlegen welches View man aufrufen will? Oder ist das nicht so?

Und ich denke was bodo92 meinte war warum hier zweimal verwaltung vorkommt
/module/Verwaltung/view/verwaltung/verwaltung/index.phtml

Also das kommt mir jedenfalls spanisch vor, ich hätte gedacht das der pfad zur view zu wäre
/module/Verwaltung/view/verwaltung/index.phtml

Okay ich denke ich verstehe, aber dann würde ich ja im Modul Verwaltung mehr als hundert Funktionen haben und natürlich auch unter view hundert *. phtml Dateien wäre es nicht schöner (übersichlicher) für Einsätze, Termine, News… Jeweils ein eigenes Modul zu erstellen und diese alle unter dem Register verwaltung zusammenzufassen

Kann ich verstehen, und deswegen habe ich irgendwann das Department gewechselt. Wenn du dich ernsthaft mit Webentwicklung beschäftigen willst, musst du dich mit Frameworks auseinandersetzen, und bei der Vielzahl vorhandener Frameworks sollte man sich an den quasi Standards orientieren. Das was Bootstrap für CSS ist, sind ZF 2 / Symfonie für PHP.

Allerdings muss es heute nicht mehr zwingend PHP sein. Es haben sich mittlerweile ‚modernere‘ Alternativen etabliert. Eine davon ist Ruby on Rails. Wenn du hier auch nur die ersten zwei Kapitel durcharbeitest, wirst du sehen, wie leicht sich eine datenbankbasierte App im Vergleich zu ZF 2 aufsetzen lässt.
https://www.railstutorial.org/book

Die andere Schiene sind SingleApps, und dort entwickelt sich AngularJS zu dem, was im Bereich DHTML jQuery ist. Anstatt eines fünffach verschachtelten Arrays sind die Router dort wesentlich schlanker:

app.config(['$routeProvider', function ($routeProvider) { $routeProvider. when('/users', { templateUrl: 'modules/users/users-list.html', controller: 'ListCtrl' }). when('/users/create', { templateUrl: 'modules/users/users-create.html', controller: 'UserCtrl' }). when('/users/:id', { templateUrl: 'modules/users/users-update.html', controller: 'DetailCtrl' }). }]);