2012-04-03 7 views
0

Ich habe eine funktionierende zend mvc-Anwendung, die ein Layout verwendet, und dieses Layout verwendet externe Stylesheets und Skripte. Jede Seite der Site hat ihren eigenen Controller, und der seitenspezifische Inhalt jeder Seite befindet sich in der Datei index.phtml. Das Layout funktioniert, und alle Skripte/Stylesheets werden ordnungsgemäß für die index.phtml-Datei jedes Controllers angewendet.Zend MVC Seitenstruktur und Layout Linkpfade

Zum Beispiel ist die Startseite "mvcProject /", die die Indexaktion des Indexcontrollers aufruft, die die index.phtml-Datei verwendet, die dem Indexcontroller entspricht. Darüber hinaus ist die About Us-Seite "mvcProject/about", die den About-Controller aufruft und views/about/index.phtml anzeigt. Subjektiv empfand ich diese Struktur als ineffizient. Der Inhalt dieser Website ist nur HTML, und ich kann nicht sehen, warum jede Seite einen eigenen Controller benötigt.

Deshalb habe ich versucht, nur einen Controller zu verwenden, um das gleiche Ziel zu erreichen, nämlich dieselbe Architektur zu haben, indem ich jeder Seite eine eigene Aktion innerhalb des einzelnen Index-Controllers gebe. Die "Über uns" -Seite war also "mvcProject/index/about", so dass der Index-Controller die about-Aktion aufrufen würde, die die Datei views/index/about.phtml verwenden würde.

Dieser Ansatz löste alle Links zu externen Skripten/Stylesheets im Layout. Das Layout funktionierte immer noch, aber keiner der Pfade der Links funktionierte. Offensichtlich ist dies ein pfadbezogenes Problem, aber ich bin immer noch relativ neu in Zend, also war ich mir nicht sicher, wie ich das beheben könnte. Deshalb ging ich zurück und gab jeder Seite wieder ihren eigenen Controller.

Also meine Frage ist zweifach: Muss ich mich sorgen mit der Vermeidung der Blähung jeder Seite einen eigenen Controller zu geben, und wenn ich diese Struktur abbauen muss, was muss ich anpassen, um die Links zu korrigieren ' Wege? Vielen Dank dass Sie darüber nachdenken.

+0

Sie verwenden das Zend-Framework, um nur HTML-Inhalte zu liefern, keine Datenbank, nichts Dynamisches? Es scheint, als ob Overkill dieses Framework für diese Aufgabe verwenden würde, geschweige denn, dass ein Controller für jede Seite übertrieben ist. Es ist nicht übertrieben, jeder Seite ihren eigenen Controller zu geben. Das ist, wofür MVC ist, Sie leiten eine Anfrage an einen Controller weiter, der Controller wird dann eine Antwort zurückgeben. Das ist die ganze Idee. Schau dir diese Frage über das Servieren von statischem Inhalt in Zend_Framework an (http://stackoverflow.com/questions/8946486/updated-best-practices-for-managing-static-content-inzend-framework) – Flukey

+0

Einverstanden, das wäre Overkill für statischen Inhalt allein. Dies ist jedoch nur die erste Phase eines viel größeren Projekts. In ein oder zwei Wochen werde ich die Datenbanken hinzufügen. Danke für den Link. – dsulli

Antwort

1

Das Ignorieren der Diskussion über das Framework/die Anzahl der Controller ist vorläufig übertrieben. Der Grund dafür, dass Ihre Skripte/CSS fehlschlagen, ist ein Pfadproblem. Wenn Sie den Layouthelfer verwenden, sollten Sie die Objekte headLink und headScript in der Ansicht verwenden.

Dies ist meine bevorzugte Methode zum Einrichten der Skripts und CSS-Dateien, die ich während der Entwicklung brauche.

Bootstrap.php

protected function _initView() 
{ 
    // Initalise the view 
    $view = new Zend_View(); 
    $view->doctype('HTML5'); 

    // Get config options for the UI 
    $ui = $this->getApplication()->getOption('ui'); 

    $view->headTitle($ui['title']); 

    foreach ($ui['stylesheet'] as $stylesheet) { 
     $view->headLink()->appendStylesheet($stylesheet); 
    } 

    foreach ($ui['script'] as $script) { 
     $view->headScript()->appendFile($script); 
    } 

    $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
      'ViewRenderer' 
    ); 
    $viewRenderer->setView($view); 

    return $view; 
} 

configs/application.ini

ui.title = "My Awesome Web App" 
ui.stylesheet[] = "/extjs/resources/css/ext-all.css" 
ui.stylesheet[] = "/resources/css/hod.css" 
ui.stylesheet[] = "/resources/css/icons.css" 
ui.stylesheet[] = "/resources/bootstrap/css/bootstrap.css" 
ui.script[] = "extjs/ext-debug.js" 
ui.script[] = "app.js" 

Layouts/default.phtml

<?php echo $this->doctype(); ?> 
<html> 
<head> 
    <?php 
    echo $this->headTitle(); 
    echo $this->headMeta(); 
    echo $this->headStyle(); 
    echo $this->headScript(); 
    echo $this->headLink(); 
    ?> 
</head> 

<body> 
    <?php echo $this->layout()->content; ?> 
</body> 
</html> 

Damit können Sie alle Skripte einrichten, die Sie im Entwicklungsmodus benötigen, und die minimierten Skripts in der Produktion in der Konfiguration festlegen, ohne zusätzlichen Code schreiben zu müssen.

Zurück zur Overkill-Frage. Ich denke, selbst wenn Sie keine Verbindungen zur Datenbank und allem Drum und Dran in Ihrer App haben, ist die Verwendung eines Frameworks aus Sicht der Wartung immer noch der beste Ansatz (sobald Sie mit dem Framework vertraut sind)) wenn Sie mehr als 5 oder 6 Seiten haben. Es sei denn, Ihre Website wird große Mengen an Datenverkehr anzeigen und jedes Byte oder jede Zahl zählt. Daher sehe ich keinen Sinn darin, die Wartbarkeit für den geringen Overhead zu reduzieren, den ein Framework hinzufügt.

Die gleiche Logik gilt für mich mit Controllern. Ich sehe nicht, warum Sie die Anzahl von ihnen verringern möchten, wenn sie helfen, die Funktionen der Arbeit deutlich zu trennen.Plus, außer Sie ändern den Router site.com/index/about sieht hässlicher als site.com/about :)

+0

Getrennte Verwaltung der Ressourcen von Entwicklungs- und Produktionsumgebungen. Das ist glatt. Vielen Dank. Du hast eine Frage beantwortet, von der ich nicht einmal wusste, dass ich sie hatte. Danke für Ihre Hilfe. – dsulli

+0

Kein Problem, eine Bearbeitung hinzugefügt, um die Zeilen einzufügen, die im Layout-Skript benötigt werden, da ich diesen Teil verpasst habe, falls jemand anders vorbeikommt und ihn liest. –

0

Ich bin mir nicht sicher, wie Ihr Pfad und URL in Ihren Ansichten erstellt werden, aber verwenden Sie den BaseUrl-Helfer ? $ this-> baseUrl ([Datei])

Verwandte Themen