User Tools

Site Tools


php:tutorials:threetierarchitecture

[PHP] three tier architecture

Datenlayer

Als ersts brauchen wir ein bisschen Code, der uns Daten zur Verfügung stellt. Hier mal was ganz einfaches

AgentInfo.inc
<?php
class AgentInfo{
	public $ip;
	private $host;
	public $refer;
	public function __construct(){
		$this->ip = getenv(REMOTE_ADDR);
		$this->host = gethostbyaddr($this->ip);
		$this->refer=getenv(HTTP_REFERER);
	}
	public function getHost(){
		return $this->host;
	}
}
?>

Simpel und als Klass natürlich so nur beschränkt sinnvoll. Doch darum gehts jetzt nicht. Die Datenlogik haben wir jetzt also zusammen.

Applikationslayer

Um diesen Layer sauber zu gestallten, verwendet man meist ein Templatesystem. In diesem Fall mach ich selber einen kleinen Parser. den stell ich dann in den Businesslayer. Als Platzhalter denk ich mir etwas aus, dass so nicht so schnell wieder auftaucht. {%varible%} soll als Platzhalter dienen

tmpl.client.html
<html>
	<head>
		<title>Three Tier Architekture</title>
	</head>
	<body>
		Willkommen zu diesem kleinen Test.
		<br />Du kommst von {%refer%}.
		<br />und {%host%} ist dein Host über den du im www surfst.
		<br />Deine IP ist {%ip%}
	</body>
</html>

Natürlich kann an das noch mit CSS und allem drumm und drann ausschmücken. Doch wie kommen jetzt die Inhalte unserer Klasse clsclient in dieses Template? Dazu schreib ich mal kurz einen kleinen Parser. Dieser gehört zum Templatesyste. Normalerweise nimmt man etwas komplexeres, dass ein wenig mehr kann als nur Variablen ersetzen. Doch für dieses Beispiel reicht es aus.

parse.inc
<?php
function parse($vars, $templateName)
{
	// Falls $vars nur eine Variable ist und nicht ein Array
	if (!is_array($vars)) $vars=array($vars);     
	reset($vars);
 
	// Template öffnen
	$file=fopen($templateName,"r");            
	// Template einlesen      
	$tmpl=fread($file,filesize($templateName));
	fclose($file);
 
	// Template parsen
	while (list ($key, $value) = each ($vars)){
		$tmpl=str_replace('{%'.$key.'%}',$value,$tmpl);   
	}
	// geparstes Template als String zurückgeben.
	return $tmpl;                                  
}
?>

Businesslayer

Genau. Dieser Layer verbindet alles miteinander. Er nimmt die Infos aus dem Datalayer, nimmt den Parser und das Template und schreibt am schluss mit einem einzigen Echo-Befehl die Ganze Seite.

site.php
<?php
	// Parser einbinden
	include_once('parse.inc');
	// Datalayer einbinden
	include_once('AgentInfo.inc');
	// eine Instanz des Dataobject initzialisieren
	$agentInfo = new AgentInfo();
 
	// Variablen zum Parsen vorbereiten (wir übergeben alle Variablen als Array)
	$vars=array(
		'ip'        =>  $agentInfo->ip,
		'refer'     =>  $agentInfo->refer,
		'host'      =>  $agentInfo->getHost(),
	);
 
	// Template parsen und ausgeben
	echo parse($vars, 'tmpl.client.html');
?>

So einfach ist das. Der Businesslayer in einem Komplexeren Projekt, ist eigentlich nichts anderes als eine Datei, die nur noch Zuordnungen macht.

Weitere Aussichent

Tja, wozu ist es eigentlich nützue, dass an die Daten so universell macht? Nehmen wir mal ein Gästebuch. Die Datalogik ist immer dieselelbe. Nur das Layout will man anpassen. Dann ist es in diesem Fall genau eine Datei, die man mit HTML anpassen kann. Einfach und übersichtlich. Oder man will eine Seite mit verschiedenen Skins erstellen. Nix einfacher als das. Dubliziere die Templates und mache im Businesslayer eine Templateselektion hinein, dass er das richtige Template abholt… finish ist der Zauber.

http://www.smarty.net/ Dieses Templatesystem verwende ich. ist einfach zu handhaben und beitet sehr viel Möglichekeiten und besitzt eine hervorragende deutsche Dokumentation.

php/tutorials/threetierarchitecture.txt · Last modified: 09.12.2013 09:39:54 (external edit)