Autoloading
Aperçu
L'autoloading est un concept en PHP où vous spécifiez un répertoire ou des répertoires pour charger les classes. Cela est beaucoup plus avantageux que d'utiliser require ou include pour charger les classes. C'est également une exigence pour utiliser les packages Composer.
Compréhension
Par défaut, toute classe Flight est autoloadée automatiquement pour vous grâce à Composer. Cependant, si vous souhaitez autoloader vos propres classes, vous pouvez utiliser la méthode Flight::path() pour spécifier un répertoire à partir duquel charger les classes.
L'utilisation d'un autoloader peut aider à simplifier votre code de manière significative. Au lieu d'avoir des fichiers qui commencent par une multitude d'instructions include ou require en haut pour capturer toutes les classes utilisées dans ce fichier, vous pouvez au contraire appeler dynamiquement vos classes et elles seront incluses automatiquement.
Utilisation de base
Supposons que nous ayons un arbre de répertoires comme suit :
# Exemple de chemin
/home/user/project/my-flight-project/
├── app
│ ├── cache
│ ├── config
│ ├── controllers - contient les contrôleurs pour ce projet
│ ├── translations
│ ├── UTILS - contient les classes pour cette application uniquement (tout en majuscules exprès pour un exemple plus tard)
│ └── views
└── public
└── css
└── js
└── index.phpVous avez peut-être remarqué que c'est la même structure de fichiers que celle de ce site de documentation.
Vous pouvez spécifier chaque répertoire à charger comme ceci :
/**
* public/index.php
*/
// Ajouter un chemin à l'autoloader
Flight::path(__DIR__.'/../app/controllers/');
Flight::path(__DIR__.'/../app/utils/');
/**
* app/controllers/MyController.php
*/
// pas de namespace requis
// Toutes les classes autoloadées sont recommandées d'être en Pascal Case (chaque mot en majuscule, sans espaces)
class MyController {
public function index() {
// faire quelque chose
}
}Espaces de noms
Si vous avez des namespaces, il devient en fait très facile de les implémenter. Vous devriez utiliser la méthode Flight::path() pour spécifier le répertoire racine (pas la racine du document ou le dossier public/) de votre application.
/**
* public/index.php
*/
// Ajouter un chemin à l'autoloader
Flight::path(__DIR__.'/../');Maintenant, voici à quoi pourrait ressembler votre contrôleur. Regardez l'exemple ci-dessous, mais prêtez attention aux commentaires pour des informations importantes.
/**
* app/controllers/MyController.php
*/
// les namespaces sont requis
// les namespaces sont les mêmes que la structure de répertoires
// les namespaces doivent suivre la même casse que la structure de répertoires
// les namespaces et les répertoires ne peuvent pas avoir de tirets bas (sauf si Loader::setV2ClassLoading(false) est défini)
namespace app\controllers;
// Toutes les classes autoloadées sont recommandées d'être en Pascal Case (chaque mot en majuscule, sans espaces)
// À partir de 3.7.2, vous pouvez utiliser Pascal_Snake_Case pour les noms de vos classes en exécutant Loader::setV2ClassLoading(false);
class MyController {
public function index() {
// faire quelque chose
}
}Et si vous vouliez autoloader une classe dans votre répertoire utils, vous feriez essentiellement la même chose :
/**
* app/UTILS/ArrayHelperUtil.php
*/
// le namespace doit correspondre à la structure de répertoires et à la casse (notez que le répertoire UTILS est tout en majuscules
// comme dans l'arbre de fichiers ci-dessus)
namespace app\UTILS;
class ArrayHelperUtil {
public function changeArrayCase(array $array) {
// faire quelque chose
}
}Tirets bas dans les noms de classes
À partir de 3.7.2, vous pouvez utiliser Pascal_Snake_Case pour les noms de vos classes en exécutant Loader::setV2ClassLoading(false);.
Cela vous permettra d'utiliser des tirets bas dans les noms de vos classes.
Cela n'est pas recommandé, mais c'est disponible pour ceux qui en ont besoin.
use flight\core\Loader;
/**
* public/index.php
*/
// Ajouter un chemin à l'autoloader
Flight::path(__DIR__.'/../app/controllers/');
Flight::path(__DIR__.'/../app/utils/');
Loader::setV2ClassLoading(false);
/**
* app/controllers/My_Controller.php
*/
// pas de namespace requis
class My_Controller {
public function index() {
// faire quelque chose
}
}Voir aussi
- Routing - Comment mapper les routes aux contrôleurs et rendre les vues.
- Pourquoi un Framework ? - Comprendre les avantages d'utiliser un framework comme Flight.
Dépannage
- Si vous ne parvenez pas à comprendre pourquoi vos classes avec namespace ne sont pas trouvées, rappelez-vous d'utiliser
Flight::path()vers le répertoire racine de votre projet, pas votre répertoireapp/ousrc/ou équivalent.
Classe non trouvée (autoloading ne fonctionne pas)
Il pourrait y avoir plusieurs raisons pour cela. Ci-dessous, quelques exemples, mais assurez-vous également de consulter la section autoloading.
Nom de fichier incorrect
Le plus courant est que le nom de la classe ne correspond pas au nom du fichier.
Si vous avez une classe nommée MyClass, alors le fichier devrait s'appeler MyClass.php. Si vous avez une classe nommée MyClass et que le fichier s'appelle myclass.php
alors l'autoloader ne pourra pas la trouver.
Namespace incorrect
Si vous utilisez des namespaces, alors le namespace devrait correspondre à la structure de répertoires.
// ...code...
// si votre MyController est dans le répertoire app/controllers et qu'il est namespacé
// cela ne fonctionnera pas.
Flight::route('/hello', 'MyController->hello');
// vous devrez choisir l'une de ces options
Flight::route('/hello', 'app\controllers\MyController->hello');
// ou si vous avez une instruction use en haut
use app\controllers\MyController;
Flight::route('/hello', [ MyController::class, 'hello' ]);
// peut aussi être écrit
Flight::route('/hello', MyController::class.'->hello');
// ou encore...
Flight::route('/hello', [ 'app\controllers\MyController', 'hello' ]);path() non défini
Dans l'application squelette, cela est défini dans le fichier config.php, mais pour que vos classes soient trouvées, vous devez vous assurer que la méthode path()
est définie (probablement vers la racine de votre répertoire) avant de l'utiliser.
// Ajouter un chemin à l'autoloader
Flight::path(__DIR__.'/../');Journal des modifications
- v3.7.2 - Vous pouvez utiliser Pascal_Snake_Case pour les noms de vos classes en exécutant
Loader::setV2ClassLoading(false); - v2.0 - Fonctionnalité d'autoload ajoutée.