Maison développement back-end tutoriel php Analyse du cycle de vie et principes du framework Laravel

Analyse du cycle de vie et principes du framework Laravel

Jun 12, 2018 pm 04:42 PM
laravel框架 生命周期

Cet article présente principalement le cycle de vie et les principes du framework Laravel. Il résume et analyse le cycle de fonctionnement complet, le processus et les principes du framework Laravel en réponse aux demandes des utilisateurs sous forme d'exemples. à cet article

Les exemples décrivent le cycle de vie et les principes du framework Laravel. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :

Introduction :

Si vous connaissez bien le principe d'utilisation d'un outil , alors vous êtes confiant lorsque vous utilisez cet outil !

Texte :

Une fois que l'utilisateur (navigateur) envoie une requête HTTP, notre apache ou nginx accède généralement à index.php, donc, la série d'étapes suivante commence toutes à partir de index.php. Jetons d'abord un coup d'œil au code de ce fichier.

<?php
require __DIR__.&#39;/../bootstrap/autoload.php&#39;;
$app = require_once __DIR__.&#39;/../bootstrap/app.php&#39;;
/*
|--------------------------------------------------------------------------
| Run The Application
|--------------------------------------------------------------------------
|
| Once we have the application, we can handle the incoming request
| through the kernel, and send the associated response back to
| the client&#39;s browser allowing them to enjoy the creative
| and wonderful application we have prepared for them.
|
*/
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
$response = $kernel->handle(
  $request = Illuminate\Http\Request::capture()
);
$response->send();
$kernel->terminate($request, $response);
Copier après la connexion

L'auteur parle du rôle du noyau dans les commentaires. Le noyau gère les requêtes entrantes et renvoie les réponses correspondantes au navigateur de l'utilisateur.

Un objet application est à nouveau impliqué ici, donc l'objet application est attaché, donc le code source de l'objet application est attaché. Ce code source est bootstrapapp.php

<🎜. >

<?php
/*
|--------------------------------------------------------------------------
| Create The Application
|--------------------------------------------------------------------------
|
| The first thing we will do is create a new Laravel application instance
| which serves as the "glue" for all the components of Laravel, and is
| the IoC container for the system binding all of the various parts.
|
*/
$app = new Illuminate\Foundation\Application(
  realpath(__DIR__.&#39;/../&#39;)
);
/*
|--------------------------------------------------------------------------
| Bind Important Interfaces
|--------------------------------------------------------------------------
|
| Next, we need to bind some important interfaces into the container so
| we will be able to resolve them when needed. The kernels serve the
| incoming requests to this application from both the web and CLI.
|
*/
$app->singleton(
  Illuminate\Contracts\Http\Kernel::class,
  App\Http\Kernel::class
);
$app->singleton(
  Illuminate\Contracts\Console\Kernel::class,
  App\Console\Kernel::class
);
$app->singleton(
  Illuminate\Contracts\Debug\ExceptionHandler::class,
  App\Exceptions\Handler::class
);
/*
|--------------------------------------------------------------------------
| Return The Application
|--------------------------------------------------------------------------
|
| This script returns the application instance. The instance is given to
| the calling script so we can separate the building of the instances
| from the actual running of the application and sending responses.
|
*/
return $app;
Copier après la connexion

Veuillez voir que la variable app est un objet de la classe

IlluminateFoundationApplication, donc le constructeur de cette classe est appelé. code pour ce qu'il fait exactement.

public function __construct($basePath = null)
{
  if ($basePath) {
    $this->setBasePath($basePath);
  }
  $this->registerBaseBindings();
  $this->registerBaseServiceProviders();
  $this->registerCoreContainerAliases();
}
Copier après la connexion

Le constructeur fait 3 choses. Les deux premières choses sont faciles à comprendre. Créez un conteneur et enregistrez un fournisseur de services.<🎜. >

/**
 * Register the basic bindings into the container.
 *
 * @return void
 */
protected function registerBaseBindings()
{
  static::setInstance($this);
  $this->instance(&#39;app&#39;, $this);
  $this->instance(Container::class, $this);
}
/**
 * Register all of the base service providers.
 *
 * @return void
 */
protected function registerBaseServiceProviders()
{
  $this->register(new EventServiceProvider($this));
  $this->register(new LogServiceProvider($this));
  $this->register(new RoutingServiceProvider($this));
}
Copier après la connexion

La dernière chose est de créer un grand tableau et de définir un grand nombre d'alias, ce qui montre que les programmeurs sont des gens intelligents et paresseux.

/**
 * Register the core class aliases in the container.
 *
 * @return void
 */
public function registerCoreContainerAliases()
{
  $aliases = [
    &#39;app&#39;         => [\Illuminate\Foundation\Application::class, \Illuminate\Contracts\Container\Container::class, \Illuminate\Contracts\Foundation\Application::class],
    &#39;auth&#39;         => [\Illuminate\Auth\AuthManager::class, \Illuminate\Contracts\Auth\Factory::class],
    &#39;auth.driver&#39;     => [\Illuminate\Contracts\Auth\Guard::class],
    &#39;blade.compiler&#39;    => [\Illuminate\View\Compilers\BladeCompiler::class],
    &#39;cache&#39;        => [\Illuminate\Cache\CacheManager::class, \Illuminate\Contracts\Cache\Factory::class],
    &#39;cache.store&#39;     => [\Illuminate\Cache\Repository::class, \Illuminate\Contracts\Cache\Repository::class],
    &#39;config&#39;        => [\Illuminate\Config\Repository::class, \Illuminate\Contracts\Config\Repository::class],
    &#39;cookie&#39;        => [\Illuminate\Cookie\CookieJar::class, \Illuminate\Contracts\Cookie\Factory::class, \Illuminate\Contracts\Cookie\QueueingFactory::class],
    &#39;encrypter&#39;      => [\Illuminate\Encryption\Encrypter::class, \Illuminate\Contracts\Encryption\Encrypter::class],
    &#39;db&#39;          => [\Illuminate\Database\DatabaseManager::class],
    &#39;db.connection&#39;    => [\Illuminate\Database\Connection::class, \Illuminate\Database\ConnectionInterface::class],
    &#39;events&#39;        => [\Illuminate\Events\Dispatcher::class, \Illuminate\Contracts\Events\Dispatcher::class],
    &#39;files&#39;        => [\Illuminate\Filesystem\Filesystem::class],
    &#39;filesystem&#39;      => [\Illuminate\Filesystem\FilesystemManager::class, \Illuminate\Contracts\Filesystem\Factory::class],
    &#39;filesystem.disk&#39;   => [\Illuminate\Contracts\Filesystem\Filesystem::class],
    &#39;filesystem.cloud&#39;   => [\Illuminate\Contracts\Filesystem\Cloud::class],
    &#39;hash&#39;         => [\Illuminate\Contracts\Hashing\Hasher::class],
    &#39;translator&#39;      => [\Illuminate\Translation\Translator::class, \Illuminate\Contracts\Translation\Translator::class],
    &#39;log&#39;         => [\Illuminate\Log\Writer::class, \Illuminate\Contracts\Logging\Log::class, \Psr\Log\LoggerInterface::class],
    &#39;mailer&#39;        => [\Illuminate\Mail\Mailer::class, \Illuminate\Contracts\Mail\Mailer::class, \Illuminate\Contracts\Mail\MailQueue::class],
    &#39;auth.password&#39;    => [\Illuminate\Auth\Passwords\PasswordBrokerManager::class, \Illuminate\Contracts\Auth\PasswordBrokerFactory::class],
    &#39;auth.password.broker&#39; => [\Illuminate\Auth\Passwords\PasswordBroker::class, \Illuminate\Contracts\Auth\PasswordBroker::class],
    &#39;queue&#39;        => [\Illuminate\Queue\QueueManager::class, \Illuminate\Contracts\Queue\Factory::class, \Illuminate\Contracts\Queue\Monitor::class],
    &#39;queue.connection&#39;   => [\Illuminate\Contracts\Queue\Queue::class],
    &#39;queue.failer&#39;     => [\Illuminate\Queue\Failed\FailedJobProviderInterface::class],
    &#39;redirect&#39;       => [\Illuminate\Routing\Redirector::class],
    &#39;redis&#39;        => [\Illuminate\Redis\RedisManager::class, \Illuminate\Contracts\Redis\Factory::class],
    &#39;request&#39;       => [\Illuminate\Http\Request::class, \Symfony\Component\HttpFoundation\Request::class],
    &#39;router&#39;        => [\Illuminate\Routing\Router::class, \Illuminate\Contracts\Routing\Registrar::class, \Illuminate\Contracts\Routing\BindingRegistrar::class],
    &#39;session&#39;       => [\Illuminate\Session\SessionManager::class],
    &#39;session.store&#39;    => [\Illuminate\Session\Store::class, \Illuminate\Contracts\Session\Session::class],
    &#39;url&#39;         => [\Illuminate\Routing\UrlGenerator::class, \Illuminate\Contracts\Routing\UrlGenerator::class],
    &#39;validator&#39;      => [\Illuminate\Validation\Factory::class, \Illuminate\Contracts\Validation\Factory::class],
    &#39;view&#39;         => [\Illuminate\View\Factory::class, \Illuminate\Contracts\View\Factory::class],
  ];
  foreach ($aliases as $key => $aliases) {
    foreach ($aliases as $alias) {
      $this->alias($key, $alias);
    }
  }
}
Copier après la connexion

Une fonction instance apparaît ici. En fait, ce n'est pas une fonction de la classe Application, mais une fonction de la classe Container, la parent. classe de la classe Application

/**
 * Register an existing instance as shared in the container.
 *
 * @param string $abstract
 * @param mixed  $instance
 * @return void
 */
public function instance($abstract, $instance)
{
  $this->removeAbstractAlias($abstract);
  unset($this->aliases[$abstract]);
  // We&#39;ll check to determine if this type has been bound before, and if it has
  // we will fire the rebound callbacks registered with the container and it
  // can be updated with consuming classes that have gotten resolved here.
  $this->instances[$abstract] = $instance;
  if ($this->bound($abstract)) {
    $this->rebound($abstract);
  }
}
Copier après la connexion

Application est une sous-classe de Container, donc

n'est pas seulement un objet de la classe Application, mais aussi un objet de Container, donc le nouveau

On peut vérifier la fonction singleton$app dans le fichier de code source de la classe Container. Consultez cet article de blog pour connaître la différence entre la fonction de liaison et le singleton.

singleton

Cette fonction, le premier paramètre est le nom réel de la classe, et le dernier paramètre est "l'alias" de la classe. L'objet

déclare trois objets de modèle singleton, à savoir

HttpKernel$app, ConsoleKernel et ExceptionHandler. Veuillez noter que aucun objet n'est créé ici, c'est juste une déclaration et un "alias" . Avez-vous remarqué qu'il existe également une variable $kernel dans index.php, mais que seule la variable HttpKernel produite par make est enregistrée, cet article ne discutera donc pas de ConsoleKernel et d'ExceptionHandler. . .

Continuez à trouver

AppHttpKernel.php

dans le dossier Puisque nous avons écrit toutes les choses réelles faites par HttpKernel dans ce fichier php, voyons ce qui est fait à partir de ce code.

<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
  /**
   * The application&#39;s global HTTP middleware stack.
   *
   * These middleware are run during every request to your application.
   *
   * @var array
   */
  protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    //\App\Http\Middleware\MyMiddleware::class,
  ];
  /**
   * The application&#39;s route middleware groups.
   *
   * @var array
   */
  protected $middlewareGroups = [
    &#39;web&#39; => [
      \App\Http\Middleware\EncryptCookies::class,
      \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
      \Illuminate\Session\Middleware\StartSession::class,
      \Illuminate\View\Middleware\ShareErrorsFromSession::class,
      \App\Http\Middleware\VerifyCsrfToken::class,
    ],
    &#39;api&#39; => [
      &#39;throttle:60,1&#39;,
    ],
  ];
  /**
   * The application&#39;s route middleware.
   *
   * These middleware may be assigned to groups or used inpidually.
   *
   * @var array
   */
  protected $routeMiddleware = [
    &#39;auth&#39; => \App\Http\Middleware\Authenticate::class,
    &#39;auth.basic&#39; => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    &#39;guest&#39; => \App\Http\Middleware\RedirectIfAuthenticated::class,
    &#39;throttle&#39; => \Illuminate\Routing\Middleware\ThrottleRequests::class,
  &#39;mymiddleware&#39;=>\App\Http\Middleware\MyMiddleware::class,
  ];
}
Copier après la connexion

Il est clair en un coup d'œil que le tableau middleware est défini dans HttpKernel.

Après ce qui doit être fait, le processus de la demande à la réponse commence, voir index.php

$response = $kernel->handle(
  $request = Illuminate\Http\Request::capture()
);
$response->send();
Copier après la connexion

Enfin, il s'arrête . Libérez toutes les ressources.

/**
* Call the terminate method on any terminable middleware.
*
* @param \Illuminate\Http\Request $request
* @param \Illuminate\Http\Response $response
* @return void
*/
public function terminate($request, $response)
{
    $this->terminateMiddleware($request, $response);
    $this->app->terminate();
}
Copier après la connexion

Pour résumer, un simple résumé de l'ensemble du processus est :

1.index.php chargement

bootstrapapp.php

, créez le conteneur dans le constructeur de la classe Application, enregistrez le ServiceProvider, définissez le tableau d'alias, puis utilisez la variable app pour enregistrer l'objet construit par le constructeur. 2. Utilisez l'objet app pour créer un objet en mode singleton HttpKernel. Lors de la création de HttpKernel, le constructeur est appelé pour compléter la déclaration du middleware.

3. Le travail ci-dessus est terminé avant de demander une visite. Ensuite, attendez la demande, puis :

Acceptez la demande

-->Traitez la demande -->Envoyer la réponse-->Arrêter la variable de l'applicationCe qui précède est l'intégralité du contenu de cet article, j'espère qu'il sera utile à l'apprentissage de chacun , plus connexes Veuillez faire attention au contenu du site Web chinois PHP !

Recommandations associées :

Le framework Laravel implémente l'utilisation d'un middleware pour la fonction de journalisation des opérations

Le framework Laravel implémente l'utilisation d'écouteurs pour les instructions SQL Fonction d'enregistrement


Paramètres de routage du framework Laravel


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

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.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

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)

vue3 a modifié plusieurs fonctions du cycle de vie vue3 a modifié plusieurs fonctions du cycle de vie Jan 13, 2023 pm 05:57 PM

vue3 a modifié 4 fonctions de cycle de vie. L'API combinée Vue3 annule les fonctions de hook beforeCreated et create et utilise le hook step à la place, et celui-ci ne peut pas y être utilisé. Les fonctions de hook pour la destruction des composants dans Vue3 ont été modifiées de destroy et beforeDestroy à beforeUnmount et démontées.

Comment gérer la destruction et la gestion du cycle de vie des pointeurs de fonctions C++ ? Comment gérer la destruction et la gestion du cycle de vie des pointeurs de fonctions C++ ? Apr 17, 2024 pm 05:48 PM

En C++, les pointeurs de fonction nécessitent une destruction et une gestion du cycle de vie appropriées. Ceci peut être réalisé en détruisant manuellement le pointeur de fonction et en libérant la mémoire. Utilisez des pointeurs intelligents, tels que std::unique_ptr ou std::shared_ptr, pour gérer automatiquement le cycle de vie des pointeurs de fonction. Liez le pointeur de fonction à l'objet et le cycle de vie de l'objet gère la destruction du pointeur de fonction. Dans la programmation GUI, l'utilisation de pointeurs intelligents ou la liaison à des objets garantit que les fonctions de rappel sont détruites au moment approprié, évitant ainsi les fuites de mémoire et les incohérences.

Le cycle de vie d'une servlet est divisé en plusieurs étapes Le cycle de vie d'une servlet est divisé en plusieurs étapes Feb 23, 2023 pm 01:46 PM

Le cycle de vie d'un servlet fait référence à l'ensemble du processus depuis la création jusqu'à la destruction d'un servlet, qui peut être divisé en trois étapes : 1. L'étape d'initialisation, appelant la méthode init() pour initialiser le servlet. 2. L'étape d'exécution (traitement des requêtes) ; le conteneur demandera de créer un objet ServletRequest représentant une requête HTTP et un objet ServletResponse représentant une réponse HTTP, puis les transmettra en paramètres à la méthode service() de la phase de destruction du Servlet ;

Comment utiliser les événements de modèle (Model Events) dans le framework Laravel Comment utiliser les événements de modèle (Model Events) dans le framework Laravel Jul 28, 2023 am 10:49 AM

Comment utiliser les événements de modèle (ModelEvents) dans le framework Laravel Le framework Laravel fournit de nombreuses fonctionnalités puissantes, dont les événements de modèle (ModelEvents). Les événements de modèle sont une fonctionnalité utilisée dans EloquentORM (Object Relational Mapping) de Laravel qui permet aux développeurs d'exécuter du code personnalisé lorsqu'une action spécifique se produit sur le modèle. Dans cet article, nous explorerons comment utiliser les événements de modèle dans le framework Laravel et fournirons un

Fonctions de cycle de vie dans Vue3 : maîtrisez rapidement le cycle de vie de Vue3 Fonctions de cycle de vie dans Vue3 : maîtrisez rapidement le cycle de vie de Vue3 Jun 18, 2023 am 08:20 AM

Vue3 est actuellement l'un des frameworks les plus populaires dans le monde front-end, et la fonction de cycle de vie de Vue3 est une partie très importante de Vue3. La fonction de cycle de vie de Vue3 nous permet de déclencher des événements spécifiques à des moments précis, améliorant ainsi le degré élevé de contrôlabilité des composants. Cet article explorera et expliquera en détail les concepts de base des fonctions de cycle de vie de Vue3, les rôles et l'utilisation de chaque fonction de cycle de vie, ainsi que les cas de mise en œuvre, pour aider les lecteurs à maîtriser rapidement les fonctions de cycle de vie de Vue3. 1. La fonction de cycle de vie de Vue3

Comment contrôler le cycle de vie des coroutines Golang ? Comment contrôler le cycle de vie des coroutines Golang ? May 31, 2024 pm 06:05 PM

Le cycle de vie de la coroutine Go peut être contrôlé des manières suivantes : Créer une coroutine : utilisez le mot-clé go pour démarrer une nouvelle tâche. Terminez les coroutines : attendez que toutes les coroutines soient terminées, utilisez sync.WaitGroup. Utilisez les signaux de fermeture de canal. Utilisez le contexte context.Context.

Quels sont les cycles de vie de vue3 Quels sont les cycles de vie de vue3 Feb 01, 2024 pm 04:33 PM

vue3的生命周期: 1, avantCréation ; 、getDerivedStateFromProps等等

Portée et cycle de vie variables en langage Go Portée et cycle de vie variables en langage Go Jun 01, 2023 pm 12:31 PM

Le langage Go est un langage open source à typage statique. Il présente les caractéristiques de simplicité, d'efficacité et de fiabilité et est de plus en plus apprécié par les développeurs. Dans le langage Go, les variables constituent la forme la plus élémentaire de stockage de données dans les programmes. La portée et le cycle de vie des variables sont très importants pour l'exactitude et l'efficacité du programme. La portée d'une variable fait référence à la visibilité et à l'accessibilité de la variable, c'est-à-dire à l'endroit où la variable est accessible. En langage Go, la portée des variables est divisée en variables globales et variables locales. Les variables globales sont des variables définies en dehors d'une fonction et peuvent être utilisées n'importe où dans l'ensemble du programme.

See all articles