本文共 1159 字,大约阅读时间需要 3 分钟。
使用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
中
'Laravel\\Envoy\\' => array ( 0 => __DIR__ . '/..' . '/laravel/envoy/src',)
到这里就一目了然了。
所以很多时候,我们使用 composer 安装的插件可以很好的运行,但是如果是从 github 下载的插件直接放到vendor下却是无法加载的,原因也就在这里了,你还需要在对应的 autoload_static.php
中按照 composer.json
的配置来对应上。
转载地址:http://kzaui.baihongyu.com/