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

您或许感兴趣

[2018-09-04]基于laravel队列+Redis的秒杀锁库存实现
[2017-10-01]IE/Edge浏览器元素设置position:fixed后滚动屏幕闪跳

发表评论

电子邮件地址不会被公开。