A free and open-source book on ZF3 for beginners

Translation into this language is not yet finished. You can help this project by translating the chapters and contributing your changes.

5.6. Type de route Segment

Le type de route Segment permet de faire correspondre la chaîne de la route avec un ou plusieurs segments de chemin d'URL.

Si vous regardez le fichier module.config.php, vous pouvez voir que le type de route Segment est utilisé à l'intérieur de la route "application" pour que les actions de votre IndexController soient automatiquement mappées aux URL du site. Vous ajoutez simplement une méthode d'action à votre classe IndexController et elle devient disponible par une URL comme ""http://localhost/application/<action>". Par exemple, vous pouvez accéder à la page About de votre site avec l'URL suivante : "http://localhost/application/about".

Pour expliquer le fonctionnement du type de route Segment, implémentons une action du contrôleur qui générera une image de code-barres simple. Les code-barres sont largement utilisés dans les supermarchés pour la reconnaissance optique des marchandises dans votre panier. Les code-barres peuvent être de différents types et avoir des étiquettes différentes. Nous allons utiliser le type de route Segment pour mapper l'action à une URL comme "http://localhost/barcode/<type>/<label>".

Pour pouvoir utiliser les code-barres, vous devez installer le composant Zend\Barcode avec Composer en tapant la commande suivante :

php composer.phar require zendframework/zend-barcode

Veuillez noter que pour que les images des code-barres fonctionnent, vous devez avoir installé et activé l'extension GD5 du moteur PHP. Sous Linux Ubuntu, vous pouvez installer cette extension avec la commande suivante :

sudo apt-get install php-gd

Après avoir installé l'extension, redémarrez Apache pour appliquer vos modifications.

5) L'extension PHP GD permet de créer des fichiers image dans différents formats (JPEG, PNG, GIF, etc.)

Tout d'abord, nous définissons la route "barcode" dans le fichier module.config.php :

'barcode' => [
    'type' => Segment::class,
    'options' => [
        'route' => '/barcode[/:type/:label]',
        'constraints' => [     
            'type' => '[a-zA-Z][a-zA-Z0-9_-]*',
            'label' => '[a-zA-Z0-9_-]*'
        ],
        'defaults' => [
            'controller' => Controller\IndexController::class,
            'action' => 'barcode',
        ],
    ],
],

Les segments de la route (ligne 4) peuvent être constants ou variables. Vous pouvez définir des segments variable en utilisant des "caractères génériques". Nous avons trois segments : barcode, :type and :label. Le segment barcode est constant, tandis que les deux derniers sont des caractères génériques (les variables génériques doivent commencer par deux-points).

Vous spécifiez à quoi doit ressembler un caractère générique à l'intérieur de la sous-clé constraints (lignes 5-8). Nous définissons l'expression régulière [a-zA-Z][a-zA-Z0-9_-]* qui contraint notre caractère générique :type à commencer par une lettre et (éventuellement) contenir plusieurs lettres, chiffres, underscores ou caractères moins. La contrainte pour le caractère générique :label est presque la identique mais ce segment peut commencer avec n'importe quel caractère autorisé (lettre, chiffre, underscore ou signe moins).

Les segments facultatifs sont placés entre crochets. Dans notre exemple, nous avons les segments :type et :label qui sont optionnels.

Dans les lignes 9-12, nous définissons defaults, qui correspond aux paramètres retournés par le routeur. Les valeurs par défaut du controller et de l'action spécifient le contrôleur et la méthode d'action à exécuter si il y a correspondance.

Ensuite, nous ajoutons la méthode barcodeAction() dans la classe IndexController :

// On ajoute le nom de l'alias au début du fichier
use Zend\Barcode\Barcode;

// ...

// L'action "barcode" 
public function barcodeAction() 
{
  // On récupère les paramètres de la route.
    $type = $this->params()->fromRoute('type', 'code39');
    $label = $this->params()->fromRoute('label', 'HELLO-WORLD');
        
    // On définit les options du barcode.
    $barcodeOptions = ['text' => $label];        
    $rendererOptions = [];
        
    // On crée l'objet barcode
    $barcode = Barcode::factory($type, 'image', 
                 $barcodeOptions, $rendererOptions);
        
    // La ligne ci-dessous affichera l'image du code-barre :
    $barcode->render();

    // Retourne l'objet Response pour désactiver le rendu de vue.
    return $this->getResponse();
}  

Aux lignes 10-11, nous obtenons les valeurs des caractères génériques type et label situé dans la route. Nous faisons cela avec l'aide de la méthode fromRoute() du plugin Params. Analogue à la méthode fromQuery(), elle prend deux arguments : le nom de la variable et la valeur par défaut.

Pour générer l'image du code-barres, nous utilisons le composant Zend\Barcode. À la ligne 14, nous définissons le texte de l'étiquette du code-barres. Aux lignes 18-19, nous créons l'objet Barcode avec la méthode factory. Enfin, à la ligne 23, nous effectuons le rendu du fichier image en l'écrivant dans le flux de sortie PHP.

Zend\Barcode est un composant auxiliaire utilisé pour la génération de diverses images de code-barres. Pour plus d'informations sur ce composant, reportez-vous à la section correspondante du manuel de référence de Zend Framework.

Ligne 26, nous retournons l'objet Response pour supprimer le rendu de vue activé par défaut.

Maintenant, entrez l'URL "http://localhost/barcode" dans votre navigateur pour voir l'image de code-barres (voir la figure 5.6):

Figure 5.6. Un exemple d'image de code-barre Figure 5.6. Un exemple d'image de code-barre

Comme nous avons des caractères génériques dans la route, vous pouvez transmettre le type et le label de l'image du code-barres dans l'URL. Ci-dessous, plusieurs exemples d'URL sont fournis (les codes-barres correspondants sont présentés dans la figure 5.7) :

a. http://localhost/barcode/code39/HELLO-WORLD
b. http://localhost/barcode/leitcode/12345
c. http://localhost/barcode/identcode/98765453212
d. http://localhost/barcode/postnet/123456
e. http://localhost/barcode/planet/1234567890123
f. http://localhost/barcode/upca/12345678901
g. http://localhost/barcode/code128/ABCDEF
h. http://localhost/barcode/ean2/12

Figure 5.7. Types de codes-barres Figure 5.7. Types de codes-barres


Top