login  Naam:   Wachtwoord: 
Registreer je!
 Tutorials

Tutorials > PHP


Gegevens:
Geschreven door:
nemesiskoen
Moeilijkheidsgraad:
Normaal
Hits:
9719
Punten:
Aantal punten:
 (3.6)
Aantal stemmen:
5
Stem:
Niet ingelogd
Nota's:
 Lees de nota's (3)
 


Tutorial:

Zend Framework deel 2

1. Inleiding
2. Zend_Config
3. Zend_Cache
 top
1. Inleiding
Na een 4e release van het ZEND framework is het weer tijd voor een nieuw artikeltje. In dit artikel zal ik enkele nieuwigheden opsommen van het Collaboration Project, en verder zal ik dieper ingaan op sommige (nieuwe) ZEND klassen.

Om te beginnen ben ik heel tevreden met de nieuwe documentatie. Deze is er mijlen op vooruit gegaan sinds 0.1.3. Ze is nu beschikbaar in maar liefst tien talen: Duits, Engels, Spaans, Frans, Japans, Nederlands, Pools, Russisch, Chinees en het Portugees. Sommige van deze documentatiegidsen zijn nog niet volledig, en moeten dus nog aangevuld worden. De Nederlandse is zo goed als volledig.

In de loop van 0.1.3 is het ZEND_FRAMEWORK_WIKI opgestart. Een wiki die enkel en alleen dient voor alle ZEND onderdelen. Zo worden voorstellen uitbundig besproken (zoals ZEND_CONFIG eerst al werd gereviewed voor er echt sprake van was om het op te nemen) en huidige onderdelen uitgebreid uitgewerkt met voorbeelden.

Verder konden we op de devzone lezen dat de eigenaar van PHPDEVELOPER.ORG ervoor heeft gekozen het ZEND FRAMEWORK te gebruiken. Meer informatie: http://devzone.zend.com/node/view/id/550

Daarnaast heeft ZEND gebruik gemaakt van het JIRA project voor het melden van bugs. Alle bug issues kunnen hier besproken worden: http://framework.zend.com/issues/browse/ZF

Ook kunnen we een developer version downloader wanneer we maar willen. Dit houdt in dat vanaf er enkele regels wordt gecode deze worden geupload en dat we hier vrolijk mee kunnen spelen. Dit vinden we hier: http://framework.zend.com/svn/framework/trunk/

De FAQ is aangevuld met handige vragen en antwoorden over het framework en aanverwanten.

Het framework is te downloaden van http://framework.zend.com

Nu alle (belangrijkste) newsitems besproken zijn kunnen we beginnen lijkt mij.


 top
2. Zend_Config
ZEND_CONFIG is een klasse volgens het iterator pattern die kan geïnstancieerd worden, en er is ook de mogelijkheid om de klasse af te leiden tot een andere klasse zodat deze uitgebreid kan worden.
De klasse steunt eigenlijk op 1 lidvariabele, namelijk $_data.

Je kan instellen dat je config read only is. Doormiddel van de magische __get en __set methoden kan er gecontroleerd worden, en er wordt een Exception gegooid als er geprobeerd wordt een waarde te setten/overschrijven.

We bekijken een stukje code:

<?php
    public function __set($name$value)

    {
        if ($this->_allowModifications) {
            if (is_array($value)) {
                $this->_data[$name] = new Zend_Config($valuetrue);

            } else {
                $this->_data[$name] = $value;
            }
        } else {
            throw new Zend_Config_Exception('Zend_Config is read only');

        }
    }
?>
Codeblock 1.1

Aan dit stukje code hebben we niet veel als we niet weten "hoe" de klasse precies werkt. Daarom ga ik met een stukje voorbeeld code bovenstaande code toelichten.

<?php

require 'Zend/Config.php'// Zend config ophalen

$config = new Zend_Config(

      array(
        "database" => "ZEND_TEST"// data setten
        "host" => "localhost",
        "user" => "test",

        "pass" => "secret"
      ),
      true // modifications allowed
    );
    
$config->database "ZEND_CONFIG"// gegevens veranderen


?>
Codeblock 1.2

Bij het instanciëren wordt er een array verwacht. Dit mag een meerdimensionele zijn zodat je duidelijk onderscheidt kan maken tussen verschillende gegevens. De array bevat alle gegevens die in Zend_Config::_data worden geladen. De tweede parameter is optioneel. Deze staat standaard op false. Als deze op false staat dan is Zend_Config read only en wordt er een exception gegooid als er data wordt veranderd. Dit kunnen we in Codeblock 1.1 zien:

if($this->_allowModifications) {
 // change data
} else {
 // throw exception
}
Codeblock 1.3
Het leuke eraan is dat je een array kan meegeven. Deze array zal dan weer opgedeeld worden in 1 of meerde Zend_Config's.
Zo kan 1 Zend_Config-object bestaan uit tientallen. Een voorbeeld van een dump kan er dus zo uitzien:

object(Zend_Config)#1 (3) {
  ["_allowModifications:protected"]=>
  bool(false)
  ["_iterationPointerValid:protected"]=>
  NULL
  ["_data:protected"]=>

  array(2) {
    ["database"]=>
    object(Zend_Config)#2 (3) {
      ["_allowModifications:protected"]=>
      bool(false)
      ["_iterationPointerValid:protected"]=>
      NULL
      ["_data:protected"]=>
      array(4) {

        ["db"]=>
        string(9) "ZEND_TEST"
        ["host"]=>
        string(9) "localhost"
        ["user"]=>
        string(16) "test"
        ["pass"]=>
        string(6) "secret"

      }
    }
    ["admin"]=>
    object(Zend_Config)#3 (3) {
      ["_allowModifications:protected"]=>
      bool(false)
      ["_iterationPointerValid:protected"]=>
      NULL
      ["_data:protected"]=>
      array(2) {

        ["user"]=>
        string(13) "ADMINISTRATOR"
        ["pass"]=>
        string(4) "love"
      }
    }
  }
}
Codeblock 1.4

Voor de rest kan je door het Zend_Config object lopen zoals met alle iterators.
Verder is er nog een leuke functionaliteit die IMO veel risico inhoudt. Als je deze verkeerd gebruikt kan dit het einde van je website betekenen.
Deze handigheid heeft de naam Zend_Config_Ini. Opzich een leuke klasse om te bestuderen maar wel een gevaarlijke. Deze klasse kan namelijk een .ini file uitlezen en deze omzetten naar php code. Zo kan dus leesbare code (ook voor de niet programmeurs) omgezet worden naar php code (in array vorm). Een voorbeeldje:

config.ini
; Dit is commentaar
[sales]
webhost           = www.yoursite.com
database.host     = sales.yoursite.com
database.username = test
database.password = secret
database.name     = ZEND_TEST

; de gegevens van hierboven worden overgelezen en veranderd als dat hieronder staat aangegeven
[development]
extends = sales
database.host     = dev.yoursite.com
database.username = devevelopment
database.password = dev
Codeblock 1.5


Bovenstaande code is voor iedereen duidelijk. Met onderstaande code wordt dit omgezet naar php code:
var_dump(Zend_Config_Ini::load('config.ini', 'development'));
Codeblock 1.6

Nu wordt enkel de onderste gegevens gelezen en omgezet in array vorm.
Dit geeft als output:
array(2) {
  ["webhost"]=>
  string(16) "www.yoursite.com"
  ["database"]=>
  array(4) {
    ["host"]=>

    string(16) "dev.yoursite.com"
    ["username"]=>
    string(13) "devevelopment"
    ["password"]=>
    string(3) "dev"
    ["name"]=>
    string(9) "ZEND_TEST"
  }
}
Codeblock 1.7


Als we dan kijken hoe dit allemaal gebeurt blijkt dat het echte werk door php wordt gedaan en dat Zend_Config_Ini dit gewoon omhulst.

<?php
    public static function load($filename$section)

    {
        if (empty($filename)) { // is de filename niet leeg
            throw new Zend_Config_Exception('Filename is not set');

        }
        if (empty($section)) { // is er een gedeelte
            throw new Zend_Config_Exception('Section is not set');

        }

        $iniArray parse_ini_file($filenametrue); // verwerk de gegevens en zet ze in de iniArray

        // bovenstaande functie is eigenlijk de grote held van Zend_Config_Ini
        if (!isset($iniArray[$section])) { // bestaat de sectie

            throw new Zend_Config_Exception("Section '$section' cannot be found in $filename");
        }

        $self = new self(); // instantie aanmaken

        return $self->_processExtends($iniArray$section); // en gegevens opkuisen
    }
?>
Codeblock 1.8


Waarom is dit alles nu niet direct veilig: omdat je een ini file gewoon vanaf de browser kan lezen. Het is een beetje gokken en je zit in de file met alle juiste gegevens. De kans dat het bestand in www.yoursite.com/config.ini of www.yoursite.com/inc/config.ini staat is heel groot.
Daarom moet er via htacces juist worden aangegeven dat dit bestand niet gelezen mag worden van buitenaf.

Een ander leuke extra van Zend_Config is Zend_Config_XML.
Dit verwerkt een xml bestand (ongeveer op dezelfde manier als Zend_Config_Ini) en stuurt een array terug met de juiste gegevens.
Als laatste is er nog Zend_Config_Array. Dit is hetzelfde als Zend_Config_Ini maar dan gaat het over een php bestand dat een array bevat met de juiste gegevens. Je kan dit vergelijken met de manier die ik op het begin aantoonde.
Het gebruik van Zend_Config_Xml en Zend_Config_Ini laat ik in 2 onderstaande voorbeelden zien:
<?php
require 'Zend/Config.php';
require 'Zend/Config/Xml.php';
require 'Zend/Config/Ini.php';

$config = new Zend_Config(Zend_Config_Xml::load('config.xml''development')); // the xml way

$config = new Zend_Config(Zend_Config_Ini::load('config.ini''development')); // the ini way

?>
Codeblock 1.9


Tot zover Zend_Config. Nu even iets heel anders.



 top
3. Zend_cache
Zend_Cache is een onderdeel van Zend waarbij je data kan cachen en deze opslaan in een opslagplaats naar keuze.
De Zend_Cache klasse bestaat uit twee methodes. Een "factory method" en een "throw-exception method".
De factory method zal ervoor zorgen dat de juiste cache methode wordt gekozen uit de map Zend/Cache/. Dit wordt bepaald door Zend_Cache_Core, een net iets grotere klasse.

Je kan gegevens cachen op verschillende manieren (opslaan in een bestand, opslaan in een sqlite database, ...). Alle gegevens worden gemarked met een id en een tag zodat je eenvoudigweg gegevens kan verwijderen en aanroepen.

Het gaat eenvoudig in zijn werk:
<?php
require 'Zend/Cache.php';
$fOptions = array( 

  'lifeTime' => 3600 // één uur
);
$bOptions = array(
  'cacheDir' => '/cache/' // de directory
);


$cache Zend_Cache::factory('Core''File'$fOptions$bOptions);
$id 'tempDataKoen'// id aanmaken


if($cache->test($id)) {
  // de cache bestaat nog niet
  $data 'abc';

  $cache->save($data);
} else {
  // cache bestaat
  $data $cache->get($id);
}


// nu kunnen we iets met $data doen
?>
Codeblock 2.1

Bovenstaand voorbeeld is grotendeels overgenomen van de Zend_Documentation omdat het principe altijd hetzelfde is.
Nu gaan we alles van wat dichterbij bekijken.

We bekijken de argumenten van Zend_Cache::factory.
1) $frontendName, de naam van de klasse die het geheel moet cachen. De verschillende opties zitten in de map Zend/Cache/Frontend.
2) $backendName, welke klasse moet de gegevens ophalen. De verschillende opties zitten in de map Zend/Cache/Backend.
3) $frontendOptions, de opties die gelden voor de eerste klasse. Bv. hoelang moeten de gegevens opgeslagen worden.
4) $backendOptions, de opties die gelden voor beide klassen. Bv. Waar moeten de gegevens opgeslagen worden.

Hieronder staat een voorbeeld met alle $frontendOptions:
<?php
$fOptions = array(
  'lifetime' => 3600// hoelang
  'automaticSerialization' => true// moet er geserialiseerd  worden 
of moeten de gegevens in hun ware vorm worden opgeslagen   
'caching' => true// bij debugging kan je dit tijdelijk uit zetten   'logging' => true// dit activeert Zend_Log. Kan handig zijn voor het bekijken 
wat er gebeurd maar het vertraagd wel de boel   
'writeControl' => false// dit controleert of er geschreven kan worden   'automaticCleaningFactor' => /* een integer         0 => geen automatische cleaning         1 => systematische opkuising         > 1 => er wordt random gecleaned (1 op X, als X de meegegeven waarde is).
 Af en toe wel, af en toe niet. Dit is handig als je bv. niet wilt dat telkens je cachefiles afgescand worden 
maar bv. om de 10 keer. Dan geef je 10 mee als argument         */
); ?>
Codeblock 2.2

Het verwijderen van items gebeurt op volgende manier:
$id = "tempDataKoen";
$cache->remove($id);
Codeblock 2.3

Als je alle (oude) cache gegevens wilt verwijderen kan je dat op volgende manier doen.

$cache->clean(Zend_Cache::CLEANING_MODE_ALL); // alles
$cache->clean(Zend_Cache::CLEANING_MODE_OLD); // de oude
Codeblock 2.4

Nu kan ik enkel zeggen: ga, en amuseer u met ZEND Framework!



« Vorige tutorial : IRC-bot in PHP (Sockets) Volgende tutorial : 'Captcha' Beveiliging Maken »

© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.013s