php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2010

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 07.09.2010, 18:22  
Benutzer
 
Registriert seit: 20.04.2009
Beiträge: 54
PHP-Kenntnisse:
Anfänger
Yanko befindet sich auf einem aufstrebenden Ast
Standard MVC - Skript anpassen

Hi,

habe eine Verständnisfrage zu MVC. Ich habe einen Skript, bei dem ich gerne die MVC-Struktur anwenden würde. Ich habe die meisten Klassen, die Daten aus der Datenbank benötigen etwa so aufgebaut:

PHP-Code:

class Page_News_Entry
{

    protected 
$title;
    protected 
$content;
    ...

    public function 
__construct()
    {
         
$this->db_connection Page_Registry::get_('db_connection_news');
    }

    public function 
init($entry_id)
    {
         
//Holt Infos aus der Datenbank
    
}

    
//Methoden zum erstellen von neuen Einträgen, bearbeiten, ...

    //Getter und Settermethoden 
Die Dateien, die aufgerufen werden sehen etwa so aus:

PHP-Code:

//Autoloader initialisieren, configs einbinden, session starten,...
//Smarty initialisieren

switch($_GET['mode'])
{

    case 
'overview':
    {
         
$overview = new Page_News_Overview();
         
$overview->init();
         
$smarty->assign('news'$overview->get_news());
         
$smarty->display('overview.tpl');
         break;
    }
    ...


Wenn ich jetzt Einen Controller einfüge muss ich das ganze dann folgendermaßen machen??

PHP-Code:
class Page_News_Controller
{
     protected 
$view//Smarty  in meinem fall
     
protected $data// Das Page_News_Overview oder News_... Objekt??
     
protected $request;

     public function 
__construct($request)
     {
          
$this->request $request;
     }

     public function 
display($view)
     {
          
$this->view $view;
          
$this->view->assign('header'$this->view->fetch('header.tpl'));
          
$this->view->assign('footer'$this->view->fetch('footer.tpl'));
          switch(
$this->request['mode'])
          {
               case 
'overview':
               {
                   
$this->data = new Page_News_Overview();
                   
$this->data->init();
                   
$this->view->assign('news'$this->data->get_news());
                   
$this->view->assign('content'$this->view->fetch('overview.tpl'));
                   break;
               }
          }
          
$this->view->display('default_template.tpl');
      } 
Und aufrufen dann folgendermaßen??

PHP-Code:

//Autoloader initialisieren, configs einbinden, session starten,...
//Smarty initialisieren

$controller = new Page_News_Controller($_GET);

$controller->display($smarty); 
Also nochmal kurz und knapp:

1. Kann ich meine Klassen in der Struktur wie oben weiterverwenden oder sollte ich nochmal komplett von vorne beginnen?? Also muss ich umbedingt neuanfangen oder reicht es bei den nächsten Projekten etwas anders an die Sache rangehen??

2. Habe ich es einigermaßen korrekt verstanden oder lebe ich in meiner eigenen Welt

Hoffe das die Fragen gut verständlich formuliert sind!

Thx und mfg

Yanko
Yanko ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 07.09.2010, 21:53  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.269
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Hallo,

üblicherweise hast du eine Bootstrap-Datei, also eine zentrale index.php, die mit Hilfe eines FrontControllers den Request zerlegt und an den aufzurufenden Controller übergibt.

Deinen Page_News_Controller kannst du also im Prinzip so lassen. Nur was ist display(), hast du nicht mehrere Actions pro Controller? Wenn ja, häng noch ein Postfix oder Prefix an den Methodennamen dran, sonst bekommst du Probleme mit reservierten Wörtern in PHP (Function, Class, ..). Sprich statt display() einfach displayAction() z.B.

Deinen Page_News_Entry solltest du so umbauen, dass du die Datenbankverbindung nicht einfach über die Registry aus dem Nichts holst, sondern übergibst (so wie du es mit $_GET schon für den Controller machst). Sprich deine Controller-Action holt sich die Datenbankverbindung (z.B. über eine Registry) und übergibt sie der Page_News_Entry. So bist du etwas flexibler, koppelst Page_News_Entry nicht an die Registry.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline  
Alt 07.09.2010, 22:08  
Benutzer
 
Registriert seit: 20.04.2009
Beiträge: 54
PHP-Kenntnisse:
Anfänger
Yanko befindet sich auf einem aufstrebenden Ast
Standard

Die Actions regele ich über switch anhand der requests, wie sollte den der Controller mit mehreren Actions aussehen? Um die richtigen auszuwählen bräuchte man doch switch in der index.php wenn es nicht in der Actionmethode steht.

E: Sonst is an der Page_News_Entry alles in Ordnung, weil ich habe die Klasse bereits entworfen bevor ich mich mit MVC beschäftigt habe.
Yanko ist offline  
Alt 08.09.2010, 00:10  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.269
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

PHP-Code:
<?php
class MyController
{
  public function 
displayAction() {}
  public function 
editAction() {}
  public function 
deleteAction() {}
}
?>
Das sind mehrere Controller-Actions.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline  
Alt 08.09.2010, 00:32  
Benutzer
 
Registriert seit: 20.04.2009
Beiträge: 54
PHP-Kenntnisse:
Anfänger
Yanko befindet sich auf einem aufstrebenden Ast
Standard

Also auf dein Beispiel bezogen mit FrontController:

So bearbeite ich einen Newseintrag

PHP-Code:
$controller = new FrontController($_GET); 
Dieser entscheidet dann mit switch:

PHP-Code:
case 'edit':
{
    
$mycontroller = new MyController($this->data);  //Übergibt $_GET das mitlerweile im Frontcontroller ist
    
$mycontroller->editAction();
    
$mycontroller->displayAction();
    break;

Also nur in der displayAction wird ein View verwendet und editAction speichert z.B nur die Daten und gibt ne Meldung über Erfolg ans Objekt zurück?
Yanko ist offline  
Alt 08.09.2010, 00:39  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.269
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Nein, deine editAction() sollte entscheiden, ob displayAction() ausgeführt wird oder nicht. Denn nur die weiß, was nach der erfolgreichen/erfolglosen Speicherung zu tun ist: "Danke"-Seite, "Fehler im Formular" anzeigen und Edit-Formular nochmal aufrufen, ... etc.

Sprich besser:
PHP-Code:
<?php
$myController 
= new MyController($this->data);
$myController->editAction();

// ..
class MyController {
  public function 
editAction() {
    if (
$this->saveFormData()) {
      return 
$this->displayAction();
    } else {
      
$this->view->form = new MyNewsForm();
      
$this->view->error "Das Speichern hat nicht geklappt";
      
$this->renderScript("edit-form.tpl");
    }
  }
}
?>
Im übrigen solltest du einen generischeren Ansatz verwenden, so dass du nicht für jede Aktion ein neues (switch-)case-Konstrukt bauen musst. Wenn deine URL sich parsen lässt, also http://example.com/news/edit dann kannst du die URL ($_SERVER["REQUEST_URI"]) zerlegen und dann mit $controller = "news", $action = "edit" einfach ein $instance = new $controller();
$instance->{$action}(); die entsprechende Methode aufrufen. Der Code hier von mir ist nur ein Beispiel, du solltest vorher natürlich prüfen, ob in $controller auch ein erlaubter Aufruf erfolgt, ob die Klasse existiert, ob die Methode existiert etc. Schau dir dazu mal: method_exists, call_user_func und die Reflection API an.

Natürlich gibts auch schon fertige Lösungen. Unter anderem Zend.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Daten von Skript in eine DB übertragen und updaten lassen BradPat Datenbanken 5 13.01.2011 15:34
Server führt Skript bei Verwendung von Exceptions nicht aus Tidus PHP Tipps 2010 10 22.04.2010 11:28
Kann man mit einem eingebundenem PHP Skript auf den Text einer HTML-Seite zugreifen? HottiWF PHP Tipps 2010 10 18.03.2010 18:20
Skript einbau - Sicherheit Rubio PHP Tipps 2010 4 13.02.2010 19:37
perl skript aus php skript aufrufen axmuellser PHP Tipps 2009 1 16.04.2009 17:59
Skript auf einem anderen Server! aha_01 PHP Tipps 2008 3 05.12.2007 09:02
Startup Skript m_haussner Datenbanken 3 10.10.2007 20:56
.htpasswd (im geschützten Ordner!) per skript ändern! Funky_ PHP Tipps 2006 8 22.07.2006 18:03
ein Skript startet ein zweites... ajo_silent PHP-Fortgeschrittene 8 03.05.2006 13:42
Skript &amp;amp;amp;quot;tarnen&amp;amp;amp;quot;? Off-Topic Diskussionen 17 07.08.2005 19:42
Ein php skript aus einem anderen skript heraus aufrufen PHP Tipps 2005-2 8 06.08.2005 20:23
Javascript - CountUP Skript zählt falsch.. Chr!s HTML, Usability und Barrierefreiheit 0 28.03.2005 14:32
[Erledigt] php skript ruft anderes php skript auf PHP-Fortgeschrittene 7 09.01.2005 23:06
SKRIPT GESUCHT - Werbung auf einer site anzeigen Beitragsarchiv 4 29.08.2004 14:07
[Erledigt] Php skript upload problem! PHP Tipps 2004 2 30.06.2004 00:06

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
mvc skript, php header footer zentral speichern, zend daten editactin, fetch request objekte initialisieren, displayaktion was ist das, php mvc \pro controller\ eine view?, http://www.php.de/php-einsteiger/71570-mvc-skript-anpassen.html

Alle Zeitangaben in WEZ +2. Es ist jetzt 21:15 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum