使用composer安装的laravel插件是如何被自动加载的

使用composer安装的laravel插件是如何被自动加载的

我自己也写过自动加载,主要思路是将类的命名空间和目录结构一一对应上,这样就很容易找到了,但是在laravel框架中,看到很多类的命名空间和目录完全不匹配,那么它们是怎么实现自动加载的呢?

public/index.php 中 
require __DIR__.'/../vendor/autoload.php';

于是依次排查到了
__DIR__ . '/composer/autoload_real.php
__DIR__ . '/composer/autoload_static.php

原来在 autoload_static.php 中将这些命名空间和其所在的目录做了一一对应,而最终的 autoload_static.php 是由全局的 vendor/composer/autoload_static.php 和当前项目的 vendor/composer/autoload_static.php 的合成。

而这些配置是由 composer require 命令 和 composer global require 来完成的。

我们以 Laravel/Envoy 插件为例。

composer global require "laravel/envoy"

插件被下载到了全局composer目录 D:\composer\vendor\laravel\envoy

它的目录结构为:

bin/
src/
composer.json
...

在envoy的根目录下的 composer.json 中记录了它的依赖,以及自动加载

"autoload": {
    "psr-4": {
        "Laravel\\Envoy\\": "src/"
    }
}

psr-4 是一种命名规范。意思是将命名空间以 Laravel\\Envoy\\ 开头的的类的自动加载定位到 laravel/envoy/src/

我们来打开全局 composer 目录下的 D:\composer\vendor\composer\autoload_static.php

在静态属性 $prefixDirsPsr4

扫描二维码关注公众号,回复: 8510356 查看本文章
'Laravel\\Envoy\\' => 
array (
    0 => __DIR__ . '/..' . '/laravel/envoy/src',
)

到这里就一目了然了。

所以很多时候,我们使用 composer 安装的插件可以很好的运行,但是如果是从 github 下载的插件直接放到vendor下却是无法加载的,原因也就在这里了,你还需要在对应的 autoload_static.php 中按照 composer.json 的配置来对应上。

发布了412 篇原创文章 · 获赞 25 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/raoxiaoya/article/details/103509227