webForumDet fria alternativet

Blogga med Zend Framework - Del 3: Zend_Controller

Webbutveckling

2 svar · 4 366 visningar · startad av jme

Medlem sedan maj 20012 237 inlägg
Frågan#1

En controller är C:t i MVC. ZF använder två sorts controller-klasser:

• Front Controller (se bootstrap.php)
• Action Controller (page controller, se blog/controller/IndexController.php samt login/controllers/IndexController.php)

Av dessa så är den senare mer intressant ur vår bloggs synvinkel. Det är den vi kommer att fokusera på.

Front controllerns uppgift är bl. a att förmedla HTTP-förfrågan till rätt Action Controller. Härefter när vi nämner ordet controller så menar vi en Action Controller.

Vår blogg kommer att tillämpa "Thin Controller/Fat model" regeln (http://blog.astrumfutura.com/archives/353-An-Example-Zend-Framework-Blog-Application-Part-2-The-MVC-Application-Architecture.html ). Med "Thin Controller/Fat model" menas i princip att controllern innehåller så lite som möjligt, medan modellen innehåller affärslogiken och validering av data från t.ex. användaren.

Tanken är att controllern agerar som en förmedlare mellan modellen och presentationsskiktet. Modellen genererar ett resultat som genom controllern vidarebefordras till presentationsskiktet.
En controller innehåller metoder som åstadkommer (eller delegerar till en viss modell) det som användaren vill. Dessa metoder (controller actions) är oftast mappade till en viss variabel i den anropande adressen. Adressen http://localhost:9001/blog/list anger att vi skall använda oss av controller in modulen ”blog” samt att vi skall anropa dess metod ”listAction()”.

Just ja, mappningen sker till så att namnen på dessa action-metoder skall sluta med ”Action”:

http://localhost:9001/blog/list -> public void listAction() { ... }
http://localhost:9001/blog/search -> public void searchAction() { ... }
osv...

Låt oss ta ett exempel ur vår blogg:

class Blog_IndexController extends Zend_Controller_Action 
{
...
	
	// http://localhost:9001/blog/list
	public function listAction()
	{
		$model = new BlogModel();
	
		$entries = $model->fetch(array() );
	
		if(count($entries) > 0)
			$this->view->entries = $entries;
		
		return $this->render('list');
	}
...	
}

I ovanstående kodexempel se ni hur en sökning görs med metoden fetch() och som resulterar i något som lagras i variabeln $entries. Vår controller skall inte hantera visningen av resultatet utan det är vyns uppgift. Följande rad lagrar resultatet i vyn:

$this->view->entries = $entries;

Senare i vyn kan vi komma åt $entries genom:

$this->entries

Nu undrar ni kanske hur vi kommer åt GET- och POST-värden. I ZF bör $_GET och $_POST aldrig användas direkt. Dessa två skall accesseras genom wrapper-metoder:

// komma åt hela GET-tabellen
$get = $this->_request->getParams(); // eller $this->->getRequest()->getParams();

// komma åt en viss GET-variabel
$name = $this->_request->getParam('name'); // eller $this->->getRequest()->getParam('name');

// komma åt POST-tabellen
$post = $this->_request->getPost(); // eller $this->->getRequest()->getPost();

// komma åt en viss POST-variabel
$name = $this->_request->getPost('name'); // eller $this->->getRequest()->getPost('name');

Med metoden $this->_request->isPost() kan du kontrollera om det formuläret postades som GET eller POST.

Medlem sedan maj 20012 237 inlägg
#2

Del 4 - Zend_View

Zend_view hanterar visningen och genereringen av vyerna. I kodexemplet ovan kan ni se följande rad, som returnerar den genererade vyn:

return $this->render('list');

ZF har som en standard att vy-filen mappar mot action-metodens namn:

public function listAction() -> 'list.phtml' -> $this->render('list');
public function searchAction() -> 'search.phtml' -> $this->render('search');

Vyfilerna har som standard filändelsen '.phtml'.

Vyfilerna innehåller mestadels HTML samt viss PHP-kod för att kunna visa data från t.ex. en modell. Vi vill dock ha så “rena” vyfiler som möjligt som innehåller så lite PHP-kod som möjligt. Detta gör det lättare för bl. a designers att göra ändringar vyerna utan större kunskap om PHP. Till detta kan vi använda Zend_View_Helper.

Zend_View_Helper

Vyfilerna har ofta viss funktionalitet som återkommer i flera vyer, t.ex. visning av datum. Dessutom vill vi visa om användaren är inloggad eller inte.

Normalt:

if($loggedIn)
{
	echo "Welcome xxxx, " . '<a href="#logout.php">Log out</a>;
}
else
{
	echo '<a href="login.php">Log in</a>
}

Med en view helper:

echo $this->loggedIn();

Vår blogg har faktiskt en sådan view helper:

class Zend_View_Helper_LoggedIn
{
...
	public function loggedIn()
	{
	    $auth = Zend_Auth::getInstance(); 
    
	    $str = '';
    
	    if($auth->hasIdentity()) 
	    { 
	    	$username = $auth->getStorage()->read()->username;
    	
	        $str = 'Hello '. $username . ' (<a href="' . $this->_view->baseUrl() . '/login/logout">Log out</a>)';
	    } 
	    else
	    {
	    	$str = '<a href="' . $this->_view->baseUrl() . '/login">Log in</a>';
	    }
    
	    return $str;
}
...
}

ZF har flera inbyggda view helpers. Några av dessa har vi faktiskt använt, om än implicit. Titta bara i form-klasserna. Där skapar vi ju formulärinnehållet t.ex. på följande vis:

$username = $this->createElement('text', 'username');

Grundtanken är att en view helper inte skriver ut sitt innehåll själv med echo eller print(), utan returnerar innehållet istället.

Metoden createElement(...) använder faktiskt internt en view helper för att skapa textfältet åt oss. Då vår blogg använder Zend_Form för att generera formulärfälten så har vi inte behövt använda dessa view helpers direkt.

Medlem sedan maj 20012 237 inlägg
#3

..

258 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)