国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Maison développement back-end tutoriel php Une introduction au motif du contr?leur avant, partie 2

Une introduction au motif du contr?leur avant, partie 2

Feb 26, 2025 am 09:55 AM

An Introduction to the Front Controller Pattern, Part 2

Points de base

  • Le contr?leur frontal agit comme un proxy centralisé pour l'application, attribuant des commandes aux gestionnaires prédéfinis, tels que les contr?leurs de page ou les ressources de repos.
  • Le contr?leur frontal peut maintenir une structure compacte, une route et des demandes entrants, et peut également être étendu à un contr?leur reposant entièrement fonctionnel, analyser les verbes HTTP, s'adapter aux crochets pré / après la répartition, etc.
  • Cet article montre comment déployer un cadre HTTP petit mais évolutif qui fonctionne avec les contr?leurs frontaux, les routeurs autonomes et les planificateurs tout en gérant les cycles de demande / réponse indépendamment.
  • L'auteur a également introduit le processus de construction d'un contr?leur frontal à partir de zéro, y compris la définition de classes pour simuler les données et les comportements des cycles de demande / réponse HTTP typiques, de création de modules de routage et de configuration des planificateurs.
  • Le mode contr?leur frontal a les avantages du contr?le centralisé, de la réduction de la duplication du code et de l'amélioration de la modularité et de la séparation des préoccupations, mais il peut ne pas convenir à toutes les applications Web et peut entra?ner un seul point de défaillance s'il est implémenté.

Le contr?leur frontal est comme un indicateur centralisé dans une application, et son principal domaine d'intérêt est d'attribuer des commandes statiquement ou dynamiquement . Construire au moins un contr?leur frontal simple est une expérience très utile pour comprendre ses détails, et pour promouvoir cette idée d'un point de vue pragmatique, j'ai introduit dans un article d'introduction à la mise en ?uvre d'un contr?leur frontal artificiel qui s'ouvrira et Toute la logique requise pour expédier les demandes est emballée dans les limites d'une classe. L'un des meilleurs aspects des contr?leurs frontaux est que vous pouvez les conserver en tant que structures compactes, des demandes entrantes d'itinéraire et d'envoi unique Envoyez des crochets, etc., tous derrière une API unifiée. Cependant, bien que cette approche soit attrayante, elle viole le principe de responsabilité unique (SRP) et la nature de la POO elle-même en déléguant de manière proactive différentes taches à plusieurs objets à grain fin. Alors, cela signifie-t-il que je suis juste une autre ame pécheresse qui ose briser les préceptes du SRP? Dans un sens, oui. Je veux donc éliminer mon péché en vous montrant comment déployer facilement un cadre HTTP petit mais évolutif qui est capable de fonctionner avec des contr?leurs frontaux avec des routeurs et planificateurs autonomes. De plus, l'ensemble du cycle de demande / réponse sera géré indépendamment par plusieurs classes réutilisables qui peuvent naturellement être ajustées à volonté. étant donné qu'il existe un grand nombre de frameworks HTTP emballés entièrement composés disponibles, il semble ridicule de mettre en ?uvre un contr?leur frontal qui achemine et envoie des demandes à partir de zéro, même si ces classes conservent la nature du SRP. Pour éviter d'être jugé pour réinventer la roue, certaines parties de mon implémentation personnalisée seront inspirées par la bibliothèque EphPMVC intelligente écrite par Lars Strojny.

Analyser le cycle de demande / de routage / planification / réponse

La tache que nous devons résoudre d'abord est de définir plusieurs classes responsables de la simulation des données et du comportement des cycles de demande / réponse HTTP typiques. Ceci est la première classe, et l'interface qu'il implémente:

<code>class Request {

  public function __construct($uri, $params) { 
    $this->uri = $uri;
    $this->params = $params;
  }

  public function getUri() {
    return $this->uri;
  }

  public function setParam($key, $value) {
    $this->params[$key] = $value;
    return $this;
  }

  public function getParam($key) {
    if (!isset($this->params[$key])) {
      throw new \InvalidArgumentException("The request parameter with key '$key' is invalid."); 
    }
    return $this->params[$key];
  }

  public function getParams() {
    return $this->params;
  }
}</code>
La classe

La classe de demande résume le réseau URI et de paramètres entrant et simule une demande HTTP extrêmement simple. Pour Brevity, des membres de données supplémentaires tels que la méthode définie associée à la demande pertinente ont été intentionnellement exclues. Si vous voulez les ajouter à la classe, continuez. Avoir une fine enveloppe de demande HTTP qui existe indépendamment est bon, mais il finira par être inutile sans s'accoupler avec les parties correspondantes des données et le comportement qui simule une réponse HTTP typique. Corrigeons et construisons ce composant supplémentaire:

<code>class Response {
  public function __construct($version) {
    $this->version = $version;
  }

  public function getVersion() {
    return $this->version;
  }

  public function addHeader($header) {
    $this->headers[] = $header;
    return $this;
  }

  public function addHeaders(array $headers) {
    foreach ($headers as $header) {
      $this->addHeader($header);
    }
    return $this;
  }

  public function getHeaders() {
    return $this->headers;
  }

  public function send() {
    if (!headers_sent()) {
      foreach($this->headers as $header) {
        header("$this->version $header", true);
      }
    } 
  }
}</code>

La classe de réponse est sans aucun doute plus active que sa demande de partenaire. Il agit comme un conteneur de base qui vous permet d'empiler les en-têtes HTTP à volonté et est en mesure de les envoyer au client. étant donné que ces classes effectuent leurs opérations indépendamment, il est temps de commencer à construire la partie suivante du contr?leur frontal. Dans une implémentation typique, le processus de routage / répartition est principalement encapsulé dans la même approche, ce qui n'est franchement pas trop mal du tout. Cependant, dans ce cas, il est préférable de décomposer ces processus et de les déléguer à différentes classes. De cette fa?on, les choses seront plus équilibrées en termes de responsabilité égale. Voici les lots de classes qui font fonctionner le module de routage:

<code>class Route {

  public function __construct($path, $controllerClass) {
    $this->path = $path;
    $this->controllerClass = $controllerClass;
  }

  public function match(RequestInterface $request) {
    return $this->path === $request->getUri();
  }

  public function createController() {
   return new $this->controllerClass;
  }
}


class Router {
  public function __construct($routes) {
    $this->addRoutes($routes);
  }

  public function addRoute(RouteInterface $route) {
    $this->routes[] = $route;
    return $this;
  }

  public function addRoutes(array $routes) {
    foreach ($routes as $route) {
      $this->addRoute($route);
    }
    return $this;
  }

  public function getRoutes() {
    return $this->routes;
  }

  public function route(RequestInterface $request, ResponseInterface $response) {
    foreach ($this->routes as $route) {
      if ($route->match($request)) {
        return $route;
      }
    }
    $response->addHeader("404 Page Not Found")->send();
    throw new \OutOfRangeException("No route matched the given URI.");
  }
}</code>

Comme on pourrait s'y attendre, il existe de nombreuses options lors de la mise en ?uvre de mécanismes de routage fonctionnel. Au moins à mon avis, la méthode ci-dessus est à la fois pratique et directe. Il définit une classe d'itinéraire distincte qui lie le chemin d'accès à un contr?leur d'opération donné et un simple routeur dont les responsabilités se limitent à vérifier si l'itinéraire stocké correspond à l'URI associé à un objet de demande spécifique. Pour enfin résoudre le problème, nous devons configurer un planificateur rapide qui peut être utilisé c?te à c?te avec la classe précédente. C'est ainsi que fait la classe suivante:

<code>class Dispatcher {

  public function dispatch($route, $request, $response)
    $controller = $route->createController();
    $controller->execute($request, $response);
  }
}</code>

Scannez le répartiteur et vous remarquerez deux choses. Premièrement, il ne porte aucun état. Deuxièmement, il suppose implicitement que chaque contr?leur d'opération fonctionnera sous la surface de la méthode EXECUTE (). Cela peut être refactorisé à un modèle légèrement plus flexible si vous le souhaitez (la première chose qui me vient à l'esprit est de modifier la mise en ?uvre de la classe d'itinéraire), mais pour la simplicité, je garderai le planificateur inchangé. Jusqu'à présent, vous vous demandez peut-être comment placer un contr?leur frontal capable de combiner toutes les classes précédentes ensemble. Ne vous inquiétez pas, le prochain est!

(En raison des limitations de l'espace, le contenu ultérieur sera tronqué. Veuillez fournir le reste du contenu et je continuerai à terminer le pseudo-original.)

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefa?on, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

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?!

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

Sujets chauds

Tutoriel PHP
1502
276
Porce de variable PHP expliquée Porce de variable PHP expliquée Jul 17, 2025 am 04:16 AM

Les problèmes et les solutions courants pour la portée de la variable PHP incluent: 1. La variable globale ne peut pas être accessible dans la fonction, et elle doit être transmise en utilisant le mot-clé ou le paramètre global; 2. La variable statique est déclarée avec statique, et elle n'est initialisée qu'une seule fois et la valeur est maintenue entre plusieurs appels; 3. Des variables hyperglobales telles que $ _get et $ _post peuvent être utilisées directement dans n'importe quelle portée, mais vous devez faire attention au filtrage s?r; 4. Les fonctions anonymes doivent introduire des variables de portée parents via le mot clé Utiliser, et lorsque vous modifiez les variables externes, vous devez passer une référence. La ma?trise de ces règles peut aider à éviter les erreurs et à améliorer la stabilité du code.

Comment gérer les téléchargements de fichiers en toute sécurité dans PHP? Comment gérer les téléchargements de fichiers en toute sécurité dans PHP? Jul 08, 2025 am 02:37 AM

Pour gérer en toute sécurité les téléchargements de fichiers PHP, vous devez vérifier la source et taper, contr?ler le nom et le chemin du fichier, définir les restrictions du serveur et traiter les fichiers multimédias deux fois. 1. Vérifiez la source de téléchargement pour empêcher le CSRF via le jeton et détecter le type de mime réel via FINFO_FILE en utilisant le contr?le de liste blanche; 2. Renommez le fichier à une cha?ne aléatoire et déterminez l'extension pour la stocker dans un répertoire non Web en fonction du type de détection; 3. La configuration PHP limite la taille de téléchargement et le répertoire temporaire Nginx / Apache interdit l'accès au répertoire de téléchargement; 4. La bibliothèque GD résait les images pour effacer des données malveillantes potentielles.

Commentant le code en php Commentant le code en php Jul 18, 2025 am 04:57 AM

Il existe trois méthodes courantes pour le code de commentaire PHP: 1. Utiliser // ou # pour bloquer une ligne de code, et il est recommandé d'utiliser //; 2. Utiliser /.../ pour envelopper des blocs de code avec plusieurs lignes, qui ne peuvent pas être imbriquées mais peuvent être croisées; 3. Compétences combinées Commentaires tels que l'utilisation / if () {} / pour contr?ler les blocs logiques, ou pour améliorer l'efficacité avec les touches de raccourci de l'éditeur, vous devez prêter attention aux symboles de fermeture et éviter les nidification lorsque vous les utilisez.

Conseils pour écrire des commentaires PHP Conseils pour écrire des commentaires PHP Jul 18, 2025 am 04:51 AM

La clé pour rédiger des commentaires PHP est de clarifier l'objectif et les spécifications. Les commentaires devraient expliquer "pourquoi" plut?t que "ce qui a été fait", en évitant la redondance ou trop de simplicité. 1. Utilisez un format unifié, tel que DocBlock (/ * /) pour les descriptions de classe et de méthode afin d'améliorer la lisibilité et la compatibilité des outils; 2. Soulignez les raisons de la logique, telles que pourquoi les sauts JS doivent être sortis manuellement; 3. Ajoutez une description d'une vue d'ensemble avant le code complexe, décrivez le processus dans les étapes et aidez à comprendre l'idée globale; 4. Utilisez TODO et FIXME Rationalement pour marquer des éléments et des problèmes de taches pour faciliter le suivi et la collaboration ultérieurs. De bonnes annotations peuvent réduire les co?ts de communication et améliorer l'efficacité de la maintenance du code.

Comment les générateurs fonctionnent-ils en PHP? Comment les générateurs fonctionnent-ils en PHP? Jul 11, 2025 am 03:12 AM

AgeneratorInphpisamemory-EfficientwaytoterateOrgedatasetsByyieldingValuesonEatatimeIntedofreturningThemallAtonce.1.GeneratorsUsEtheieldKeywordToproduceValuesondemand, ReducingMemoryUsage.2.TheyAreusefulForHandlingBigloops, ReadingLargeFiles, OR OR.

Apprendre PHP: un guide du débutant Apprendre PHP: un guide du débutant Jul 18, 2025 am 04:54 AM

Toléarnphpeffective, startBySettingUpAlocalServerERironmentUsingToolsLILYXAMPPANDACODEDITERLIGHILLEVSCODE.1) INSTRUSITIONXAMPFORAPACHE, MYSQL, ANDPHP.2) USACODEDEDITORFORSYNTAXSUPPORT.3)

Comment accéder à un caractère dans une cha?ne par index en php Comment accéder à un caractère dans une cha?ne par index en php Jul 12, 2025 am 03:15 AM

En PHP, vous pouvez utiliser des crochets ou des accolades bouclées pour obtenir des caractères d'index spécifiques à la cha?ne, mais les crochets sont recommandés; L'index commence à partir de 0 et l'accès à l'extérieur de la plage renvoie une valeur nulle et ne peut pas se voir attribuer une valeur; MB_substr est nécessaire pour gérer les caractères multi-octets. Par exemple: $ str = "Hello"; echo $ str [0]; sortie h; et les caractères chinois tels que MB_substr ($ str, 1,1) doivent obtenir le résultat correct; Dans les applications réelles, la longueur de la cha?ne doit être vérifiée avant le boucle, les cha?nes dynamiques doivent être vérifiées pour la validité et les projets multilingues recommandent d'utiliser des fonctions de sécurité multi-octets uniformément.

Tutoriel d'installation rapide PHP Tutoriel d'installation rapide PHP Jul 18, 2025 am 04:52 AM

Toinstallphpquickly, usexAmpPonWindowsorHomebrewonMacos.1.onwindows, downloadAndInstallxAmppp, selectComponents, startapache et placefilesInhtdocs.2.

See all articles