• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

MVC Problem (Zend Framework 2)

bodo92

Aktives Mitglied
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();
    }
}

und eine View /module/Application/view/application/verwaltung/index.phtml
HTML:
<div class="container">
    <div class="row">
        <div class="col-lg-6 center">
            <div class="panel panel-default">
                <div class="panel-heading">
                    <h3 class="panel-title">Verwaltung</h3>
                </div>
                <div class="panel-body">
                    <p>TEST</p>
                </div>
            </div>
        </div>
    </div>
</div><!-- /container -->

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 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();
    }
}

und eine View /module/Application/view/application/verwaltung/index.phtml
HTML:
<div class="container">
    <div class="row">
        <div class="col-lg-6 center">
            <div class="panel panel-default">
                <div class="panel-heading">
                    <h3 class="panel-title">Verwaltung</h3>
                </div>
                <div class="panel-body">
                    <p>TEST</p>
                </div>
            </div>
        </div>
    </div>
</div><!-- /container -->

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
config
module.config.php
src
Verwaltung
Controller
VerwaltungController.php
view
verwaltung
verwaltung
index.phtml
Module.php
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',
        ),
    ),
);


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();
    }
}


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__,
                ),
            ),
        );
    }
}
 
Zuletzt bearbeitet:
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??
 
Zuletzt bearbeitet:
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 ? ;)

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.
Code:
'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
 
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?

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:
Code:
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'
        }).
}]);
 
Zurück
Oben