Skip to content

Commit

Permalink
New version 6.1.1
Browse files Browse the repository at this point in the history
Minor update to preserve the engine global performance: the infinite loop detection is now an option (disabled by default)
  • Loading branch information
rawsrc committed Sep 26, 2023
1 parent 7b68ecc commit b71bfb9
Show file tree
Hide file tree
Showing 9 changed files with 82 additions and 22 deletions.
17 changes: 14 additions & 3 deletions PhpEcho.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
use const DIRECTORY_SEPARATOR;

/**
* PhpEcho : Native PHP Template engine: One class to rule them all ;-)
* PhpEcho: Native PHP Template engine: One class to rule them all ;-)
*
* @author rawsrc
* @copyright MIT License
Expand Down Expand Up @@ -120,6 +120,7 @@ class PhpEcho
private static bool $std_helpers_injected = false;
private static bool $opt_return_null_if_not_exist = false;
private static string $opt_seek_value_mode = 'parents'; // parents | root
private static bool $opt_detect_infinite_loop = false;

//region MAGIC METHODS
/**
Expand Down Expand Up @@ -392,6 +393,14 @@ public static function setSeekValueMode(string $mode): void
throw new InvalidArgumentException("unknown.seek.mode.value.{$mode}");
}
}

/**
* To be deactivated in production, time-consuming routine
*/
public static function setDetectInfiniteLoop(bool $p): void
{
self::$opt_detect_infinite_loop = $p;
}
//endregion OPTIONS

/**
Expand Down Expand Up @@ -476,7 +485,7 @@ public function offsetSet(mixed $offset, mixed $value): void
/**
* The returned value is escaped
*
* Some types are preserved : true bool, true int, true float, PhpEcho instance, object without __toString()
* Some types are preserved: true bool, true int, true float, PhpEcho instance, object without __toString()
* For array of PhpEcho blocks, the array is imploded and the blocks are rendered int the order they appear
* Otherwise, the value is cast to a string and escaped
*
Expand Down Expand Up @@ -643,7 +652,9 @@ private function addChild(PhpEcho $p): void
{
$this->children[] = $p;
$p->parent = $this;
$this->detectInfiniteLoop();
if (self::$opt_detect_infinite_loop) {
$this->detectInfiniteLoop();
}
}

private function unsetChild(mixed $offset): void
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
# **PhpEcho**

`2023-09-24` `PHP 8.0+` `6.1.0`
`2023-09-26` `PHP 8.0+` `6.1.1`

## **A native PHP template engine : One class to rule them all**
## **IS ONLY FOR PHP 8 AND ABOVE**

-[English version](README_en.md)<br>
-[Version française](README_fr.md)
- [English version](README_en.md)<br>
- [Version française](README_fr.md)
15 changes: 15 additions & 0 deletions README_en.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ let your IDE list all your helpers natively just using PHPDoc syntax.
2. [Configuration](#configuration)
1. [View root dir](#view-root-dir)
2. [Seek option](#seek-option)
3. [Detect infinite loop](#detect-infinite-loops)
3. [Parameters](#parameters)
4. [Principles and overview](#principles-and-overview)
5. [Let's start](#lets-start)
Expand Down Expand Up @@ -90,6 +91,20 @@ first level of the array of vars attached to any `PhpEcho` block.

More: [User values](#user-values)

### **DETECT INFINITE LOOPS**
By default, the engine is in production mode and does not intercept the infinite loops
that may be caused by the mechanism of blocks inclusion. If you want the engine to detect that,
just set the option:
```php
<?php

use rawsrc\PhpEcho\PhpEcho;

PhpEcho::setDetectInfiniteLoop(true);
```
Remember, the detection of infinite loops is time-consuming and grab a part of server resources.
This option should be deactivated in production and only used in development mode.

## **PARAMETERS**

To help you to pilot the rendering, you can store in any `PhpEcho` as many parameters
Expand Down
41 changes: 28 additions & 13 deletions README_fr.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# **PhpEcho**

`2023-09-24` `PHP 8.0+` `6.1.0`
`2023-09-26` `PHP 8.0+` `6.1.1`

## **Un moteur de rendu en PHP natif : Une classe pour les gouverner tous**
## **UNIQUEMENT POUR PHP VERSION 8 ET SUPÉRIEURE**
Expand All @@ -27,29 +27,30 @@ La classe gère :
* la possibilité d'écrire directement du code HTML au lieu de passer par des inclusions de fichier
* la gestion et le rendu de toutes les instances de classe implémentant la fonction magique `__toString()`
* l'accès à la balise globale `<head></head>` de n'importe quel bloc enfant
* détection d'inclusion infinie
* détection d'inclusion infinie sur option

Vous serez également en mesure d'étendre les fonctionnalités du moteur en créant vos propres assistants
tout en laissant votre EDI les lister rien qu'en utilisant la syntaxe PHPDoc.

1. [Installation](#installation)
2. [Configuration](#configuration)
1. [Répertoire racine de toutes les vues](#répertoire-racine-de-toutes-les-vues)
2. [recherche des valeurs](#recherche-des-valeurs)
1. [Répertoire racine de toutes les vues](#répertoire-racine-de-toutes-les-vues)
2. [Recherche des valeurs](#recherche-des-valeurs)
3. [Détection des boucles d'inclusions infinies](#détection-des-boucles-dinclusions-infinies)
3. [Paramètres](#paramètres)
4. [Principes and généralités](#principes-et-généralités)
5. [Démarrage](#démarrage)
1. [Exemple rapide](#exemple-rapide)
2. [Codage standard](#codage-standard)
3. [Contexte HTML](#contexte-html)
1. [Mise en page - Layout](#mise-en-page---layout)
2. [Formulaire](#formulaire)
3. [Page](#page)
1. [Exemple rapide](#exemple-rapide)
2. [Codage standard](#codage-standard)
3. [Contexte HTML](#contexte-html)
1. [Mise en page - Layout](#mise-en-page---layout)
2. [Formulaire](#formulaire)
3. [Page](#page)
6. [Blocs enfants](#blocs-enfants)
7. [Accès à la balise HEAD](#accès-à-la-balise-head)
8. [Valeurs utilisateurs](#valeurs-utilisateur)
1. [Recherche de clés](#recherche-de-clés)
2. [Clé non trouvée](#clé-non-trouvée)
1. [Recherche de clés](#recherche-de-clés)
2. [Clé non trouvée](#clé-non-trouvée)
9. [Échappement automatique des valeurs](#échappement-automatique-des-valeurs)
10. [Tableau d'instances de PhpEcho](#tableau-dinstances-de-phpecho)
11. [Utilisation d'une vue par défaut](#utilisation-dune-vue-par-défaut)
Expand Down Expand Up @@ -90,7 +91,21 @@ n'est pas trouvée, il grimpe tous les blocs parents jusqu'à la racine.
Veuillez noter que la recherche n'est limitée qu'au premier niveau de chaque
tableau de valeurs.

Suite: [Valeurs utilisateur](#valeurs-utilisateur)
Suite : [Valeurs utilisateur](#valeurs-utilisateur)

### **DÉTECTION DES BOUCLES D'INCLUSIONS INFINIES**
Par défaut le moteur est en mode production et n'interceptera pas les boucles infinies
d'inclusion de blocs vues. Si vous souhaitez détecter la présence de ces boucles, il suffit
de définir l'option ainsi :
```php
<?php

use rawsrc\PhpEcho\PhpEcho;

PhpEcho::setDetectInfiniteLoop(true);
```
La détection de ces boucles consomme du temps et des ressources serveur, cette option
n'est à utiliser qu'en mode développement et doit être désactivée en production.

## **PARAMÈTRES**

Expand Down
3 changes: 3 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# **PhpEcho**

**Changelog 6.1.1**<br>
1. New option to enable the infinite loop detection `setDetectInfiniteLoop(bool $p)`, disabled by default

**Changelog 6.1.0**<br>
1. New options to parameter the engine values extractor using `setSeekValueMode(string $mode)`, `$mode` among `current|parents|root`
2. If the current block is not able to provide a value to be rendered then the engine will automatically seek for it using the `seekValueMode` parameter
Expand Down
2 changes: 1 addition & 1 deletion tests/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# PhpEcho : a native PHP templating engine in one class

`2023-09-24` `PHP 8.0+` `6.1.0`
`2023-09-26` `PHP 8.0+` `6.1.1`

## TESTS

Expand Down
Binary file modified tests/global_tests_result.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
18 changes: 17 additions & 1 deletion tests/infinite_loop.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
echo $layout;
$html = ob_get_clean();

PhpEcho::setDetectInfiniteLoop(true);

$pilot->run(
id: 'infinite_loop_01',
test: fn() => $html,
Expand All @@ -48,6 +50,20 @@
$pilot->run(
id: 'infinite_loop_02',
test: fn() => (string)$layout,
description: 'infinite loop, block calling each others'
description: 'infinite loop, block calling each others, infinite loop detection is on',
);
$pilot->assertException(InvalidArgumentException::class);


/* SERVER CRASH: INFINITE LOOP IS NOT DETECTED
PhpEcho::setDetectInfiniteLoop(false);
$layout = new PhpEcho(file: 'layout_07.php', id: 'root');
$layout['block'] = new PhpEcho(file: 'block/block_07.php');
$pilot->run(
id: 'infinite_loop_03',
test: fn() => (string)$layout,
description: 'infinite loop, block calling each others, infinite loop detection is off',
);
$pilot->assertException(InvalidArgumentException::class);
*/
2 changes: 1 addition & 1 deletion tests/tests.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

use Exacodis\Pilot;

$pilot = new Pilot('PhpEcho - A native PHP template engine - v.6.1.0');
$pilot = new Pilot('PhpEcho - A native PHP template engine - v.6.1.1');
$pilot->injectStandardHelpers();

include 'filepath.php';
Expand Down

0 comments on commit b71bfb9

Please sign in to comment.