Frage zum MVC Desigen Patern

Davicito

Erfahrenes Mitglied
Hi liebe Community,

ich habe mir nun mittlerweile ein geeignetes MVC-Pattern, für mein Login, zusammen gebaut.
Jetzt habe ich mal eine generelle Frage an Euch. Wenn mein Unterkontroller "AuthController" sich erfolgreich über Das Model ein logen konnte, soll er auf die Hauptseite meiner Wep-App weiterleiten. Das Tut er auch, allerdings erst, wenn ich meine Wep-App mit F5 aktualisiere.
Mir ist auch klar wieso er das macht. ich müsste über ein Request den Befehl für den Fronkontroller absetzten, damit dieser dann den passen neuen Unterkrontroller "MainController" läd, und dieser dann auf meine Hauptseite weiterleitet.

Habt Ihr schon Erfahrungen, wie man nach dem MVC-Pattern, auf eine weitere Seite delegieren lässt, in dem auch das passende Template geladen wird? Über Ideen und Anregungen bin ich wie immer sehr dankbar.

Hier mein bisheriger Code:

Bootstrap-Datei
PHP:
<?php
	namespace Test;
	
	use Test\...\FrontController.php'),	
	      Test\...\FileSystemControllerResolver.php'),
	      Test\...\HttpResponse.php'),
 	      Test\...\HttpRequest.php');
	
	require_once('...\FrontController.php');	
	require_once('...\FileSystemControllerResolver.php');
	require_once('...\HttpResponse.php');
	require_once('...\HttpRequest.php');
	
	// Instancen für den Request und Response werden erzeugt. Sie dienen der Server-/Client-Kommunikation.  
	$req = new HttpRequest();
	$res = new HttpResponse();
	
	// Eine Instance des FileSystemControllers wird erzeugt und ein StandardUnterkontroller wird übergeben.	
	$resolver = new FileSystemControllerResolver('Controller', 'AuthController');
			
	// Nun wird der Froncontroller des MVC-Modells geladen, welches - mitteld Resolver-Objektes - eine Unterkontrollerklasse 
	// übergeben bekommt und führt dessen "run"-Methode aus.
	$controller = new FrontController($resolver);
	$controller->run($req, $res);	
?>

FrontController
PHP:
<?php
namespace Test\...\Controller;

use Test\...\HttpRequest,
      Test\...\HttpResponse,
      Test\...\FileSystemControllerResolver;

class FrontController{	

	// Resolver enthält eine Instance einer Unterkontroller-Klasse
	private $resolver;
	
	/**
	/* Ein passender Unterkontroller wird initialisiert
	 */
	public function __construct(FileSystemControllerResolver $resolver){
		$this->resolver = $resolver;
	}
	
	/**
	/* Diese Methode startet die jeweilige run-Methode, des passenden Unterkontrollers, 
	/* je nachdem, welches Ereignis/Request vom Client angefordert wurde. 
	 */
	public function run(HttpRequest $req, HttpResponse $res){
		$command = $this->resolver->getController($req);
		//var_dump($command);
		$command->run($req, $res);
		$res->flush();
	}
}

AuthController
PHP:
<?php
namespace Test\...\Controller;

use Test\...\AuthModel,
      Test\...\PSMView,
      Test\...\HttpRequest,
      Test\...\HttpResponse;
	
//require('LoginController.php');
/**
* Die LoginController Managet das Loginverhalten 
*
*
* @author Davicito
*/
require_once('...l\AuthModel.php');
require_once('...\PSMView.php');
session_start(); 

class AuthController
{		
	/**
	* Konstruktor 		
	*/
	public function __construct(){}
	
	public function run(HttpRequest $req, HttpResponse $res)
	{			
		$model = new AuthModel();
		$view = new PSMView();
		
		if(isset($_SESSION['bn_is_logged'])){
			$view->setTemplate('MenuTempl');
			print $view->loadTemplate();
			//$res->write('Sie sind Eingelogt!');
		}else{			
			$view->setTemplate('LoginTempl');
			print $view->loadTemplate();	
			
			if($req->getParameter('login') && !empty($req->getParameter('bn')) && !empty($req->getParameter('db'))){
				try
				{					
					$model->login('localhost',$req->getParameter('bn'),$req->getParameter('pw'),$req->getParameter('db'));	
					var_dump($model->checkUser());
					//if(isset($_SESSION['bn_is_logged'])) var_dump($_SESSION['bn_is_logged']);
				}
				catch(Exception $e)
				{
					$res->write( $e->getMessage());					
				}
			}
		}		
		if($req->getParameter('logout')) $model->logout();
	}	
}
?>

LG, Davicito
 
Danke Dir sheel,

nur header(); funktioniert bei mir nicht ganz, weil ich mit namespaces arbeite, findet er bei mir die Seite nicht. Vielleicht hast Du einen Rat dazu?

Zum Weiterleiten, habe ich in meiner View-Klasse eine Methode, um ein Template zu setzen und eines um es zu laden.

Daher ist es bei mir das Beste mit diesen Methoden zu arbeiten, um auf eine andere Seite zu leiten bzw. im Browser anzuzeigen.
Hab das auch erst nicht gesehen und diese nun an den passenden Stellen, meines AuthControllers gesetzt.
Allerdings auch wieder sehr unschön!
Denn ich musste das 2 Mal erledigen. Einmal in Zeile 08-10 und in Zeile 25-28.

Denn was passiert wenn ich den Login-Button klicke?
...Nach dem Login muss zum Schluss die neue Seite gleich im Browser erscheinen und wenn Jemand auf die Idee kommen würde, das Browserfenster zu akualisieren, ist der Else-Zweig beendet und würde im If-Zweig landen. Also musste ich das in beiden Zweigen verankern.

AuthController
PHP:
01 <?php
02 class AuthController{	
03	public function run(HttpRequest $req, HttpResponse $res)
04   {			
05      $model = new AuthModel();
06      $view = new PSMView();
07
08	   f(isset($_SESSION['bn_is_logged'])){
09		$view->setTemplate('MenuTempl');
10            print $view->loadTemplate();
11	   }else{ 
12		$view->setTemplate('LoginTempl');
13		print $view->loadTemplate();	
14			
15		if($req->getParameter('login') && !empty($req->getParameter('bn')) && 
16                  !empty($req->getParameter('db'))){
17			try{					
18                          $model->login('localhost',$req->getParameter('bn'),
19 $req->getParameter('pw'),$req->getParameter('db'));									20			}
21			catch(Exception $e){
22				$res->write( $e->getMessage());					
23			}			
24		}
25		if($model->checkUser() === true){ 
26			//header("Location: Templates\MenuTempl.php"); 
27			$view->setTemplate('MenuTempl');
28			print $view->loadTemplate();
29		}
30	}		
31}	
32}

Meine Idee, um Abhilfe zu schaffen, wäre den passenden MainController zu laden und der MainController läd das passende Template - also die Seite auf die weiter delegiert werden soll.

Blos dumm ist nur, das mein Frontcontroller nur dann den passenden Unterkontroller läd - also den MainController, wenn er vom Request den Befehl dazu bekommt.

Also zum Beispiel so:
PHP:
if($req->getParameter('userIsLogged'))

LG, Davicito.
 
Zuletzt bearbeitet:
Ja die gibt es....
Das würde bestimmt auch irgendwie funktionieren.

Nur mein Anliegen ist ja ein anderes!
Ich kann ja auf eine andere Seite weiterleiten durch meine View-Methoden. (Ich möchte gerne mit meiner Template-Engin arbeiten).
Ich würde gerne über meinem FrontController den Unterkontroller "MainController" laden, der dann die das passende Template läd.

Kann mir einer einen Tipp geben was ich machen muss, damit das realisierbar wäre?

Gruß.
 
Ok...

nehmen wir an ich würde gern den FrontController, aus dem AuthController heraus, mit einem neuen UnterController "MenuController" neu initiieren, müsste ich ja dem Server, mittels Post (Ich möchte bei POST bleiben da GET, durch URL-Anhängen, unsicherer ist) eine Variable zu senden (ohne Formular wohlgemerkt).

mit dem Header
PHP:
 header("Location: localhsot/.../test.php?authFin=true");
kann ich den neuen Controller "MenuController" bestens laden und dieser wiederum läd dann auch - über den ViewController - das Menu-Template.

Nur hätte ich das gerne mittels POST-Rutine, da sie sicherer ist als durch den Anhang mittels URL (GET-Rutine).

dazu hab ich mir mal folgendes angesehen, welchen bei mir leider nicht so funktionieren mag.

AuthController
PHP:
<?php
namespace Test/.../Controller;
require_once "HTTP/Request.php";
...
$r = new HttpRequest('http://localhost/.../test.php', HttpRequest::METH_POST);
$r->addPostData('authFin', true);
$r->sendRequest();
?>
...

Der Brower gieb mir das hier zurück:
Code:
Fatal error: Call to undefined function Httprequest()...

Unterstützt Xampp die PHP-Erweiterung nicht? oder ist das ein falsch gepostetes Beispiel?
Mit $r = new Http_pear(); bekomme ich zwar keine Fehlermeldung, jedoch werde ich nicht weiter geleitet.

Hab Ihr eine Idee woran das liegen mag?

LG.
 
Zuletzt bearbeitet:
Ok... was meinst du jetzt? Das "r" im .. new HttpRequest(); ?

Wenn Ja, dann bekomme ich auch die gleiche Fehlermeldung, wenn das "r" klein ist, oder groß!

Ich hab das Gefühl, das Xampp vielleicht die Erweiterung HttpRequest() nicht kennt bzw. unterstützt.

Müsste es nicht
PHP:
$r = new Http_request('...');

heißen?
 
Zuletzt bearbeitet:
Verstehe... hast Du vielleicht auch noch ne Ahnung wie ich Post-Variablen an den Server übermitteln kann, ohne Formular und ohne PECL, also nur rein mit PhP?

Das muss doch irgendwie gehen?

Gruß.
 
Zurück