Maison  >  Article  >  cadre php  >  Un article expliquant l'instanciation du noyau Laravel

Un article expliquant l'instanciation du noyau Laravel

藏色散人
藏色散人avant
2021-09-03 15:21:571499parcourir

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);

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)
上面两个一样,没有区别

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;
}

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;
}

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer