Laravel 自定义扩展包开发详解

今天有人问我:laravel5.5以后不是可以包自动发现么,他写的包的命名空间已经在composer.json 文件中autoload属性的psr-4中已经配置了,为啥他自己写了个扩展包,框架没有自动发现他的包,没起作用。

问这个问题肯定是他对composer这个自动加载还没有搞清楚,laravel的文档肯定是没仔细看,晃一眼就过了。

先回答这个问题:

包要自动发现必须要有个配置,把包配置到扩展属性中如下:

#composer.json
....
"extra": {
    "laravel": {
        "providers": [
            "Xcwmoon\\Com\\XcwServiceProvider"
        ],
        "aliases": {
            "Xcwmoon": "Xcwmoon\\Com\\Facade"
        }
    }
},

这个配置就是对应的app/config/app.php文件中的  provider与aliases这两个属性。

你如果在composer.json中配置了,就不用去app.php中中配置这两属性,它就能自动发现,否则你就需要去app.php文件中配置它的provider.


与这个包自动发现的属性对应的还有一个属性dont-discover这个有个特点是要列出包名,不是命令空间。

"extra": {
    "laravel": {
        "dont-discover": [
            "xcwmoon/com"
        ]
    }
 },

这个配置就是禁止 xcwmoon/com这个包被自动发现,如果要禁止所有的扩展包被自动发现,你就需要给dont-discover配置一个数*数组 ['*'] 像这样。

扩展包中还有很多配置,可以多看一下文档

#加载路由
$this->loadRoutesFrom(__DIR__.'/path/to/routes.php');

#加载视图
$this->loadViewsFrom(__DIR__.'/path/to/views', '包名');

#合并配置
$this->mergeConfigFrom(__DIR__.'/path/to/config/config.php', '包名');

 #加载迁移
 $this->loadMigrationsFrom(__DIR__.'/path/to/migrations');   
 
 #加载本地化 翻译
 $this->loadTranslationsFrom(__DIR__.'/path/to/translations', '包名');
 
 
 #最后还有一个发布资源 例如这是将一个扩展包的视图发布到目标路径下 还可以分组 打标签发布。
 $this->publishes(__DIR__.'/path/to/views' => base_path('resources/views/vendor/包名'),)
 
 
 #最后一个最重要的就是使用 扩展包的翻译  视图这些配置的时候如果你发布了就没关系。如果你是没有发布那么你使用的时候就需要加上   包名::*** 以这种格式来使用,比如你的包名是demo你要使用你的index.blade.php视图那么你就需要与成  return view('demo::index', $data);


一个扩展包大致就是这些,具体更多的可以查看官方文档,上面写得很详细。






Tags php

留言(0)

评论