Maison > cadre php > Laravel > le corps du texte

Un article expliquant l'instanciation du noyau Laravel

藏色散人
Libérer: 2021-09-06 09:07:29
avant
1564 Les gens l'ont consulté

Ce qui suit est une introduction à l'instanciation du noyau Laravel F de la colonne LaravelTutoriel J'espère que cela sera utile aux amis qui en ont besoin !

Instanciation du noyau Laravel

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
Copier après la connexion

Noyau d'instanciation

Lorsque l'application est instanciée, de nombreuses opérations de base ont été initialisées, donc la méthode de construction suivante utilisera directement l'injection de dépendances du conteneur de service pour résoudre le problème de classe des dépendances entre .

// \Illuminate\Contracts\Http\Kernel 类构造器依赖 \Illuminate\Contracts\Foundation\Application 和 \Illuminate\Routing\Router,将会通过服务容器来处理依赖关系
public function __construct(Application $app, Router $router)
{
    $this->app = $app;

    // 主要委托 $router 来处理
    $this->router = $router;
    // 以下均为中间件的设置
    $router->middlewarePriority = $this->middlewarePriority;

    foreach ($this->middlewareGroups as $key => $middleware) {
        $router->middlewareGroup($key, $middleware);
    }

    foreach ($this->routeMiddleware as $key => $middleware) {
        $router->aliasMiddleware($key, $middleware);
    }
}

\Illuminate\Contracts\Foundation\Application 的处理:
make 时通过别名方式直接调用 $this->instances['app']

\Illuminate\Routing\Router 的处理:
make 时通过别名方式直接调用 $this->bindings['router'] 数组里面 concrete 对应的匿名函数
Router 依赖 \Illuminate\Contracts\Events\Dispatcher 和 \Illuminate\Container\Container
public function __construct(Dispatcher $events, Container $container = null)
{
    $this->events = $events;
    $this->routes = new RouteCollection;
    $this->container = $container ?: new Container;
}

\Illuminate\Contracts\Events\Dispatcher 的处理:
make 时通过别名方式直接调用 $this->bindings['events'] 数组里面 concrete 对应的匿名函数
Dispatcher 依赖 \Illuminate\Contracts\Container\Container
public function __construct(ContainerContract $container = null)
{
    $this->container = $container ?: new Container;
}

\Illuminate\Container\Container 的处理:
make 时直接调用 $this->instances['Illuminate\Container\Container'] = Object(app)
\Illuminate\Contracts\Container\Container 的处理:
make 时调用别名直接调用 $this->instances['app'] = Object(app)
上面两个一样,没有区别
Copier après la connexion

Remarque : Les dépendances listées ci-dessus sont toutes directement confiées au conteneur de services pour un traitement automatique. Il n'y a pas lieu d'avoir peur

de $this->bindings['router'] et $this-> binds['events'] gère les événements de liaison. Lors de la création, la fonction anonyme correspondant à la clé concrète du tableau sera directement appelée.

L'extrait de code utilisé lors de make

##############################################
if ($concrete instanceof Closure) {            
    return $concrete($this, end($this->with)); 
}
###############################################

$this->bindings['router'] = [
        'concrete' => function ($app) {
                            return new Router($app['events'], $app);
                        },
        'shared' => 'true',
    ];
$router = new Router($app['events'], $app);

\Illuminate\Routing\Router
public function __construct(Dispatcher $events, Container $container = null)
{
    $this->events = $events;
    $this->routes = new RouteCollection;
    $this->container = $container ?: new Container;
}
Copier après la connexion

renvoie un objet Router et réinitialise en même temps l'objet $this->instances['router'] = $router pour un appel direct la prochaine fois.

$this->bindings['events'] = [
    'concrete' => function ($app) {
            return (new Dispatcher($app))->setQueueResolver(function () use ($app) {
                return $app->make(QueueFactoryContract::class);
            });
            }
    'shared' => 'true',
];

$dispatcher = (new \Illuminate\Events\Dispatcher($app))->setQueueResolver(function () use ($app) {
                return $app->make(QueueFactoryContract::class);
            });

Illuminate\Events\Dispatcher:
public function __construct(ContainerContract $container = null)
{
    $this->container = $container ?: new Container;
}
public function setQueueResolver(callable $resolver)
{
    $this->queueResolver = $resolver;

    return $this;
}
Copier après la connexion

Renvoie un objet Dispatcher et réinitialise l'objet $this->instances['events'] = $dispatcher pour un appel direct la prochaine fois.

Remarque :
L'objet noyau est un objet qui combine application et routage, et le routage injecte l'objet IlluminateEventsDispatcher, qui est l'objet principal.

Recommandations associées : Les cinq derniers didacticiels vidéo 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!

Étiquettes associées:
source:segmentfault.com
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal