
Laravel 开发扩展包流程 | 并提交到packagist
laravel扩展包开发离不开服务提供者以及容器,请确保你已经对两章已经掌握了。
今天的流程就是开发一个扩展包,然后提交到packagist,然后再composer require到本地项目下。
一:扩展包开发
1.创建一个packages目录
①创建好Laravel项目后,在项目路径下新建packages目录(与app目录同级)
②紧接在packages下新建packages/YaBrady/packagetest 文件夹
③去laravel项目中的composer.json声明包的命名空间
"autoload": { "classmap": [ "database/seeds", "database/factories" ], "psr-4": { "App\\": "app/", "YaBrady\\packagetest\\":"packages/YaBrady/packagetest/src/" } },
④然后在laravel目录下重新生成autoload文件
$ composer dump-autoload
⑤新建一个src文件夹,用于存放我们的逻辑代码
⑥然后用于这个包的提交、引入依赖、作者的信息等,需要初始化一个composer.json文件
$ composer init
输入关于这个包的一些基本信息。大致的信息大致是以下这样。
创建一些基本的文件夹(非必要)比如,views,config,Facades
现在包目录结构是这样的:
2.创建一个功能实现类
实际项目中是很多类之间互相调用的,现在为了测试在src下新建一个实现类Packagetest.php。注意命名空间。
<?php /** * Created by PhpStorm. * User: Ya Brady * Date: 2018/11/13 * Time: 21:06 */ namespace YaBrady\Packagetest; class Packagetest { protected $session; protected $config; public function __construct($app) { $this->session = $app['session'];// $app是服务提供者中传入当前的app信息,session是会话信息 $this->config = $app['config'];//app的配置信息 } public function test_rtn($msg = '') { $config_arr = config('packagetest.options'); //读取包中的配置信息,当然在服务提供者那里已经将config文件添加到项目的config文件夹了 // dump($config_arr);这里打印我们扩展包的信息,可以测试是否成功覆盖文件 return $msg.'from your custom develop package'; } }
3. 新建一个服务提供者provider
返回laravel中用artisan命令
$ php artisan make:provider PackagetestServiceProvider
将生成的 app/Providers/PackagetestServiceProvider.php 文件剪切到我们的 packages/YaBrady/packagetest/src/目录下面,并注册 PackagetestServiceProvider 到 config/app.php
4. 修改PackagetestServiceProvider
<?php namespace YaBrady\Packagetest; use Illuminate\Support\ServiceProvider; class PackagetestServiceProvider extends ServiceProvider { /** * Bootstrap services. * * @return void */ public function boot() { // $this->loadViewsFrom(__DIR__.'/views', 'Pat'); 若由视图文件,则将扩展包视图文件绑定命名空间,然后使用view('Pat::viewName');进行引用视图文件 $this->publishes([ __DIR__.'/views' =>base_path('resources/views/vendor/packagetest'),//将扩展包的view文件夹下的视图文件覆盖到项目的视图文件夹中去 __DIR__ . '/config/packagetest.php' =>config_path('packagetest.php') // 将扩展包中的config文件夹下的所有配置文件覆盖到项目的config文件夹 ]); } /** * Register services. * * @return void */ public function register() { // $this->mergeConfigFrom( 本地config文件与项目config文件合并 // __DIR__.'/config/packagetest.php','packagetest' // ); $this->app->singleton('packagetest', function ($app){//注册实现类到容器中,$app是当前使用这个扩展包的laravel项目的app实例。 return new Packagetest($app);//将packagetest注册到容器中,读取packagtest实际上就是获取new Packagetest实例。 }); } }
5.本地发布,php artisan vendor:publish
实际上这个步骤是因为config和view有配置才需要发布命令的,如果只是单纯的一个功能类注册,那么这步可以跳过。
6.设定别名
顺便也把别名设置了把。
①在Facades文件下新建一个Pat.php文件,继承Facade类,实现getFacadeAccessor方法
<?php namespace YaBrady\Packagetest\Facades; use Illuminate\Support\Facades\Facade; /** * Created by PhpStorm. * User: Ya Brady * Date: 2018/11/13 * Time: 21:12 */ class Pat extends Facade { protected static function getFacadeAccessor() { return 'packagetest'; //这步是返回容器中的packagetest实例,实际上就是new Packagetest() } }
②修改laravel项目中的config/app.php文件,将Pat添加到aliases数组中
到此,就可以使用Pat::method进行调用实现类的方法了。比如Pat::test_rtn(‘test’),就能得到test from your custom develop package
二:提交到packagist
1.github上新建一个仓库
将packages/YaBrady/packagetest文件夹下的文件提交到仓库
现在的文件夹结构是
现在的扩展包结构是
2. 去掉composer.json的扩展包引入
将项目中composer.json文件去掉扩展包引入。
"autoload": { "classmap": [ "database/seeds", "database/factories" ], "psr-4": { "App\\": "app/", "YaBrady\\packagetest\\":"packages/YaBrady/packagetest/src/"---删除这行 } },
3. 在packagist官网中注册好账号
4. 将git的地址复制到输入框中,点击check,即可。
5.查看自己的上传的扩展包
看到这个页面,证明上传成功,然后别人用我们扩展包的时候,composer require yabrady/packagetest-for-laravel 引入即可
参考链接:
https://segmentfault.com/a/1190000009069449