


Modules Drupal 8 - Gestion de la configuration et conteneur de service
Feb 21, 2025 am 10:17 AM
Points de base
-
La classe
- Drupal 8 de Drupal 8 fournit des fonctionnalités supplémentaires pour interagir avec le système de configuration, permettant aux outils de convertir les formulaires en valeurs stockées. Cela peut être fait en rempla?ant la classe d'extension par
ConfigFormBase
et en apportant les modifications nécessaires dans le formulaire. La configuration de Drupal 8 est stockée dans un fichier YAML et peut être modifiée via l'interface utilisateur pour le déploiement sur différents sites.ConfigFormBase
Le conteneur de service dans Drupal 8 permet la création d'un service, c'est-à-dire une classe PHP qui effectue des opérations globales et le enregistre dans le conteneur de service pour accéder. L'injection de dépendance est utilisée pour transmettre des objets à d'autres objets, assurant le découplage. Vous pouvez enregistrer un service en créant un fichier - dans le répertoire racine du module.
demo.services.yml
L'injection de dépendance dans Drupal 8 est un modèle de conception qui permet à un objet de fournir des dépendances pour une autre, ce qui rend le code plus modulaire et plus facile à tester. Cela peut être réalisé en étendant la classe - ou en implémentant le
ControllerBase
. Vous pouvez également utiliser la classeContainerInjectionInterface
pour accéder au service à l'échelle mondiale.Drupal
Notez que certaines pièces de code peuvent être obsolètes car Drupal 8 est en développement au moment de la rédaction. Veuillez consulter ce référentiel, j'ai essayé de mettre à jour l'exemple de code et de le rendre compatible avec la dernière version Drupal 8.
Dans les articles précédents sur le développement du module Drupal 8, nous avons examiné la création de types de blocs et de formulaires. Nous avons vu que les blocs sont désormais réutilisables et que tout ce qui est nécessaire pour définir les types de blocs est effectué dans une classe. De même, les fonctions de génération de formulaires sont également regroupées dans une classe où les taches effectuées par une méthode particulière sont similaires à celles pour lesquelles nous sommes habitués dans Drupal 7.Dans ce tutoriel, je continuerai d'où nous avons terminé la dernière fois. Je vais expliquer comment convertir notre
en un formulaire utilisé pour stocker les valeurs via le système de configuration Drupal 8. Après cela, nous illustrons les conteneurs de service et l'injection de dépendance avec des exemples. DemoForm
Formulaire de configuration
Lorsque nous avons défini pour la première fois, nous avons étendu la classe DemoForm
, qui est l'implémentation la plus simple de FormBase
. Cependant, Drupal 8 est également livré avec un FormInterface
, qui fournit des fonctionnalités supplémentaires qui facilitent l'interaction avec le système de configuration. ConfigFormBase
en un formulaire qui stocke l'adresse e-mail saisie par l'utilisateur. La première chose que nous devrions faire est de remplacer la classe d'extension par DemoForm
(et bien s?r ConfigFormBase
it): use
use Drupal\Core\Form\ConfigFormBase; class DemoForm extends ConfigFormBase {
Avant de continuer à changer le reste du formulaire, jetons un coup d'?il à la fa?on dont les configurations simples dans Drupal 8 fonctionnent. J'ai dit "simple" car il y a des entités de configuration plus complexes, que nous ne présenterons pas aujourd'hui. Pour l'instant, la configuration fournie par le module (core ou contrib) est stockée dans le fichier YAML. Lorsque le module est activé, ces données sont importées dans la base de données (pour améliorer les performances lorsqu'elles sont utilisées). Avec l'interface utilisateur, nous pouvons modifier cette configuration, puis l'exporter facilement vers un fichier YAML pour le déploiement sur différents sites.
Le module peut fournir une configuration par défaut dans le fichier YAML dans le dossier config/install
dans le répertoire racine du module. La convention de dénomination de ce fichier est de préfixer le nom du module. Créons donc un fichier appelé demo.settings.yml
. Dans ce fichier, collez ce qui suit:
demo: email_address: demo@demo.com
Il s'agit d'une structure imbriquée (comme un tableau associatif en PHP). Sous la touche demo
, nous avons une autre paire de valeurs clés. En règle générale, pour accéder à ces valeurs imbriquées, nous utilisons des points (.). Dans notre cas, c'est demo.email_address
.
Une fois que nous avons ce fichier, une chose importante dont vous devez vous souvenir est que ce fichier ne sera importé que lorsque le module est installé. Alors, continuez à le réinstaller. Maintenant, nous pouvons revenir à notre formulaire et voir un par un les méthodes qui doivent être ajustées.
C'est à quoi ressemble maintenant buildForm()
public function buildForm(array $form, array &$form_state) { $form = parent::buildForm($form, $form_state); $config = $this->config('demo.settings'); $form['email'] = array( '#type' => 'email', '#title' => $this->t('Your .com email address.'), '#default_value' => $config->get('demo.email_address') ); return $form; }Tout d'abord, contrairement à
, la classe FormBase
implémente également cette méthode afin d'ajouter des éléments au tableau de formulaire (bouton Soumettre). Donc, avant d'ajouter nos propres éléments, nous pouvons utiliser ce que nous avons fait avant la classe parent. ConfigFormBase
que nous pouvons utiliser pour interagir avec la configuration. Certaines classes l'ont obtenue par injection de dépendance. Config
C'est une telle classe. ConfigFormBase
de la classe parent pour récupérer un objet config()
qui a été rempli avec notre configuration simple. Ensuite, pour le Config
de l'élément de formulaire de messagerie, nous utilisons la méthode demo.settings
de l'objet #default_value
pour récupérer la valeur de l'adresse e-mail. Config
get()
Ensuite, nous devons simplement changer le gestionnaire de validation, car la méthode
validateForm()
public function submitForm(array &$form, array &$form_state) { $config = $this->config('demo.settings'); $config->set('demo.email_address', $form_state['values']['email']); $config->save(); return parent::submitForm($form, $form_state); }que nous avons configuré (comme nous l'avons fait auparavant). Nous utilisons ensuite sa méthode
pour modifier la valeur de Config
en valeur soumise par l'utilisateur. Ensuite, nous utilisons la méthode set()
pour enregistrer la configuration. Enfin, nous étendons le gestionnaire de validation des parents car il inclut certaines fonctionnalités (dans ce cas, il définit le message Drupal à l'écran). email_address
c'est tout. Vous pouvez effacer le cache et essayer. En soumettant une nouvelle adresse e-mail, vous la stockez dans la configuration. Le fichier demo.settings.yml
ne changera certainement pas, mais vous pouvez exporter la configuration demo.settings
et l'importer sur un autre site.
Contatrice de service et injection de dépendance
La prochaine chose que nous voulons examiner est le conteneur de service. La philosophie derrière le service est de décomposer la fonctionnalité en composants réutilisables. Par conséquent, un service est une classe PHP qui effectue certaines opérations mondiales et enregistre dans le conteneur de service pour l'accès.
L'injection de dépendance est la fa?on dont nous passons des objets pour assurer le découplage. Chaque service doit gérer une chose, et s'il a besoin d'un autre service, ce dernier peut être injecté dans le premier. Mais nous verrons comment le faire tout de suite.
Ensuite, nous créerons un service très simple et l'enregistrerons dans le conteneur. Il n'a qu'un seul moyen de retourner des valeurs simples. Nous injectons ensuite le service en tant que dépendance dans notre DemoController
et utilisons la valeur fournie par le service.
Afin d'enregistrer un service, nous devons créer un fichier demo.services.yml
situé dans le répertoire racine du module, avec le contenu suivant:
use Drupal\Core\Form\ConfigFormBase; class DemoForm extends ConfigFormBase {
La convention de dénomination des fichiers est module_name.services.yml
.
La première ligne crée un éventail de services. La deuxième ligne définit le premier service (appelé demo_service
, préfixé par le nom du module). La troisième ligne spécifie la classe qui sera instanciée pour ce service. Vient ensuite pour créer le fichier de classe src/
dans le dossier DemoService.php
de notre module. C'est ce que fait mon service (en fait rien, juste pour illustrer comment l'utiliser):
demo: email_address: demo@demo.com
Rien ne doit être expliqué ici, car il est très basique. Ensuite, tournons-nous vers notre DemoController
et utilisons ce service. Nous pouvons le faire de deux manières: accéder au conteneur à l'échelle mondiale via la classe Drupal
ou transmettre un objet de cette classe à notre contr?leur en utilisant l'injection de dépendance. La meilleure pratique suggère que nous devrions adopter la deuxième approche, c'est donc ce que nous allons faire. Mais parfois, vous avez besoin d'un accès global au service. Pour ce faire, vous pouvez effectuer ce qui suit:
public function buildForm(array $form, array &$form_state) { $form = parent::buildForm($form, $form_state); $config = $this->config('demo.settings'); $form['email'] = array( '#type' => 'email', '#title' => $this->t('Your .com email address.'), '#default_value' => $config->get('demo.email_address') ); return $form; }
maintenant $service
est l'objet de la classe DemoService
que nous venons de créer. Mais voyons comment injecter notre service comme une dépendance dans la classe DemoController
. Je vais expliquer ce qui doit être fait en premier, puis vous verrez un contr?leur complet avec toutes les modifications apportées.
Tout d'abord, nous devons accéder au conteneur de service. Ceci est très facile pour le contr?leur. Nous pouvons étendre la classe ControllerBase
, qui nous fournit cela en plus de certains autres programmes d'assistance. Alternativement, notre contr?leur peut implémenter ContainerInjectionInterface
, ce qui nous permet également d'accéder au conteneur. Mais nous nous en tiendrons à ControllerBase
, nous avons donc besoin de use
la classe.
Ensuite, nous avons besoin de use
Symfony 2 ContainerInterface
comme exigence de la méthode create()
, qui instancie un autre objet du contr?leur et transmet le service que nous voulons.
Enfin, nous aurons besoin d'un constructeur pour obtenir les objets de service passés (l'objet retourné de create()
) et les attribuer à des propriétés pour une utilisation ultérieure. create()
L'ordre dans lequel la méthode renvoie les objets doit refléter l'ordre dans lequel ils sont transmis au constructeur.
Alors, regardons notre DemoController
:
use Drupal\Core\Form\ConfigFormBase; class DemoForm extends ConfigFormBase {
Comme vous pouvez le voir, toutes les étapes sont ici. La méthode create()
crée une nouvelle instance de notre classe de contr?leur et transmet le service récupéré du conteneur. Enfin, une instance de la classe DemoService
est stockée dans la propriété $demoService
, que nous pouvons utiliser pour appeler sa méthode getDemoValue()
. Cette valeur sera ensuite utilisée dans le message "Hello". Effacez le cache et essayez-le. Allez sur le chemin demo/
et vous devriez voir le "Hello Upchuk!"
Je crois que vous pouvez voir la puissance du conteneur de service, car nous pouvons maintenant écrire des fonctions découplées et les passer si nécessaire. Je ne vous montre pas comment le faire, mais vous pouvez déclarer des dépendances lors de votre inscription à un service. Cela signifie que lorsque Drupal instancie un objet de service, il le fera pour toutes ses dépendances et les transmettra à son constructeur. Vous pouvez en savoir plus sur la fa?on de procéder sur cette page de document.
Conclusion
Dans cet article, nous avons regardé beaucoup de choses sympas. Nous avons vu comment le système de configuration gère des configurations simples et quelles fonctionnalités "formulaire" sont fournies pour cela. Je vous encourage à explorer comment ConfigFormBase
est mis en ?uvre et quelles fonctionnalités sont disponibles lors de l'étendue. De plus, vous devez vous entra?ner à utiliser des configurations d'importation / exportation entre les sites de l'interface utilisateur. à partir de maintenant, ce sera une grande amélioration du processus de déploiement.
Nous avons ensuite regardé les services, ce qu'ils sont et comment ils fonctionnent. Un excellent moyen de maintenir des blocs fonctionnels réutilisables et découplés accessibles de n'importe où. J'espère que le concept d'injection de dépendance n'est plus aussi effrayant (si c'est pour vous). Il est essentiellement la même que de passer des paramètres aux fonctions procédurales, mais se fait dans les coulisses par Symfony et ses puissants conteneurs de service en utilisant des méthodes de constructeur (ou des setters).
Questions fréquemment posées sur la construction de modules Drupal 8: gestion de la configuration et conteneurs de service
Quel est le r?le des conteneurs de service dans Drupal 8?
Le conteneur de service dans Drupal 8 est un composant clé qui gère la création de services, objets utilisés à l'échelle mondiale dans les applications Drupal. Il garantit que chaque service n'est instancié qu'une seule fois, en enregistrant la mémoire et en améliorant les performances. Le conteneur de service gère également l'injection de dépendance, un modèle de conception qui permet à un objet de fournir des dépendances pour un autre objet. Cela rend le code plus modulaire, plus facile à tester et favorise une meilleure organisation.
Comment définir un nouveau service dans Drupal 8?
Pour définir un nouveau service dans Drupal 8, vous devez créer un fichier services.yml
dans le répertoire racine du module. Ce fichier doit contenir le nom, la classe et les paramètres du service. Cette classe doit être le nom entièrement qualifié de la classe qui implémente le service, et les paramètres doivent être tout service ou paramètre sur lequel le service dépend.
Quel est le but de la gestion de la configuration dans Drupal 8?
La gestion de la configuration dans Drupal 8 est un système qui vous permet de gérer les données de configuration du site de manière cohérente. Il vous permet d'importer, d'exporter et de synchroniser les données de configuration, ce qui est utile lorsque le déplacement de la configuration passe de l'environnement de développement vers le site de production. Il fournit également un moyen de suivre et de gérer les modifications de configuration du site au fil du temps.
Comment exporter et importer des données de configuration à l'aide du système de gestion de la configuration?
Pour exporter des données de configuration dans Drupal 8, vous pouvez utiliser l'interface de gestion de la configuration dans le panneau d'administration ou utiliser la commande DRUSH. Les données exportées seront au format YAML et peuvent être lues et modifiées facilement. Pour importer des données de configuration, vous pouvez télécharger le fichier YAML exporté via l'interface de gestion de configuration ou utiliser la commande DRUSH. N'oubliez pas de sauvegarder votre site avant d'importer des données de configuration pour éviter toute perte de données potentielle.
Qu'est-ce que l'injection de dépendance et pourquoi est-elle importante dans Drupal 8?
L'injection de dépendance est un modèle de conception qui permet à un objet de fournir des dépendances pour un autre objet. Dans Drupal 8, il est utilisé pour rendre les services et les contr?leurs plus modulaires et plus faciles à tester. Au lieu de créer des dépendances à l'intérieur d'un objet, ils sont passés (injectés) via un constructeur ou une méthode de setter. Cela rend le code plus facile à tester, plus flexible et moins couplé.
Comment injecter des dépendances dans mon service Drupal 8?
Pour injecter des dépendances dans les services dans Drupal 8, vous devez les définir dans la définition des services dans le fichier services.yml
. Les dépendances doivent être répertoriées sous la clé arguments
. Lorsqu'un service est créé, le conteneur de service transmettra automatiquement ces dépendances au constructeur du service.
Quelle est la différence entre les services et les plug-ins dans Drupal 8?
Dans Drupal 8, un service est un objet qui effectue des taches globales dans une application, tandis qu'un plug-in est un objet qui effectue des taches spécifiques de manière enfichable. Les services sont définis dans le fichier services.yml
et gérés par le conteneur de service, tandis que les plug-ins sont découverts et instanciés par le gestionnaire de plug-in.
Comment remplacer les services dans Drupal 8?
Pour écraser un service dans Drupal 8, vous devez définir un service avec le même nom que le service que vous souhaitez écraser dans le fichier services.yml
du module. Votre nouveau service doit étendre la classe du service d'origine et remplacer la méthode que vous souhaitez modifier.
Comment utiliser le système de gestion de la configuration pour suivre les modifications de la configuration du site?
Le système de gestion de la configuration dans Drupal 8 fournit un moyen de suivre les modifications de configuration du site via un système d'instantané de configuration. Ce système prend un instantané de la configuration active du site chaque fois que vous importez ou synchronisez des données de configuration. Vous pouvez ensuite comparer ces instantanés pour voir quels changements ont été apportés.
services.yml
Que fait un fichier dans Drupal 8?
Le fichier services.yml
dans Drupal 8 est l'endroit où les services de module sont définis. Chaque service est défini à l'aide d'un nom unique, d'un nom entièrement qualifié de la classe qui implémente le service et de tout service ou paramètres sur lequel dépend du service. services.yml
Les fichiers sont lus par le conteneur de service et le conteneur de service gère la création et l'injection du service.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

ToseCurelyHandleAuthentication andAuthorizationInPhp, suivitheSesteps: 1.AlwayShashPasswordSwithPassword_Hash () etverifyusingPassword_verify (), usePreparedStatementStopReventsQLendiject, andstoreSerDatain $ _SessionAfterLogin.2

Pour gérer en toute sécurité les téléchargements de fichiers dans PHP, le noyau consiste à vérifier les types de fichiers, à renommer les fichiers et à restreindre les autorisations. 1. Utilisez finfo_file () pour vérifier le type de mime réel, et seuls des types spécifiques tels que l'image / jpeg sont autorisés; 2. Utilisez Uniqid () pour générer des noms de fichiers aléatoires et les stocker dans le répertoire racine non Web; 3. Limiter la taille du fichier via les formulaires PHP.ini et HTML et définir les autorisations de répertoire sur 0755; 4. Utilisez Clamav pour scanner les logiciels malveillants pour améliorer la sécurité. Ces étapes empêchent efficacement les vulnérabilités de sécurité et garantissent que le processus de téléchargement de fichiers est s?r et fiable.

En PHP, la principale différence entre == et == est la rigueur de la vérification des types. == La conversion de type sera effectuée avant la comparaison, par exemple, 5 == "5" Renvoie True, et === Demande que la valeur et le type soient les mêmes avant que True sera renvoyé, par exemple, 5 === "5" Renvoie False. Dans les scénarios d'utilisation, === est plus sécurisé et doit être utilisé en premier, et == n'est utilisé que lorsque la conversion de type est requise.

Oui, PHP peut interagir avec les bases de données NoSQL comme MongoDB et Redis à travers des extensions ou des bibliothèques spécifiques. Tout d'abord, utilisez le pilote MongoDBPHP (installé via PECL ou Composer) pour créer des instances clients et faire fonctionner des bases de données et des collections, en prenant en charge l'insertion, la requête, l'agrégation et d'autres opérations; Deuxièmement, utilisez la bibliothèque Predis ou l'extension PHPREDIS pour vous connecter à Redis, effectuer des paramètres et des acquisitions de valeur clé, et recommander PHPredis pour des scénarios à haute performance, tandis que Predis est pratique pour un déploiement rapide; Les deux conviennent aux environnements de production et sont bien documentés.

Les méthodes d'utilisation des opérations mathématiques de base en PHP sont les suivantes: 1. Les signes d'addition prennent en charge les entiers et les nombres à virgule flottante, et peuvent également être utilisés pour les variables. Les numéros de cha?ne seront automatiquement convertis mais non recommandés en dépendances; 2. Les signes de soustraction utilisent - les signes, les variables sont les mêmes et la conversion de type est également applicable; 3. Les panneaux de multiplication utilisent * les panneaux, qui conviennent aux nombres et aux cha?nes similaires; 4. La division utilise / signes, qui doit éviter de diviser par zéro, et noter que le résultat peut être des nombres à virgule flottante; 5. Prendre les signes du module peut être utilisé pour juger des nombres impairs et uniformes, et lors du traitement des nombres négatifs, les signes restants sont cohérents avec le dividende. La clé pour utiliser correctement ces opérateurs est de s'assurer que les types de données sont clairs et que la situation limite est bien gérée.

TostayCurrentwithPhpDevelopments andBestPractices, suiventyewnewsources likephp.netandphpweekly, engagewithcommunitiesonforumums et conférences, keeptoolingupdated etgradualadoptnewfeatures, etreadorontruttetoopensourceprojects.

PhpBecamepopularforwebDevelopmentDuetoitSeaseOflearning, Samoussentegration withhtml, widespreadhostingsupport, andalargecosystemysteclustingframeworkslikeLaravelandcmsplateformeslikewordpress.itexcelSinlingFormSubMissions, ManagetingSeSeSessions, interactif, interactif

Tosetherighttimezoneinphp, usedate_default_timezone_set () Fonctionnellestartofyourscriptwithavalididentifiersuchas'america / new_york'.1.usedate_default_timezone_set () beforeanydate / timefunctions.20
