Laravel扩展包开发介绍

Laravel扩展包介绍

扩展包是向 Laravel 中添加功能的主要方式。扩展包可以包含很多有用的功能,例如时间处理扩展包 Carbon,或提供完整 BDD 测试框架的扩展包 Behat。

当然,扩展包有很多种类型。有些扩展包是独立运行的,意味着他们可以在任意的 PHP 框架中使用。Carbon 和 Behat 就是这样的独立扩展包。要在 Laravel 中使用这种扩展包只需要在 composer.json 文件中引入他们即可。

另一方面,有些扩展包只能在 Laravel 中使用。这些扩展包可能包含专门用来增强 Laravel 应用的路由、控制器、视图和配置的文件。

Step1. 创建目录, 初始化composer.json

mkdir packages/wuwei/package-test # wuwei表示谁的包,package-test表示包名
cd packages/wuwei/package-test
composer init # 按引导填写信息
touch README.md # 描述包功能,使用帮助
mkdir src # 创建源码目录
cd src
touch Test.php TestServiceProvider.php

Step2. 编写包内容

Test.php



namespace Wuwei\PackageTest;

class Test
{
    public function exec()
    {
        echo 'hello world!';
    }
}

TestServiceProvider.php



namespace Wuwei\PackageTest;

use Illuminate\Support\ServiceProvider;

class TestServiceProvider extends ServicerProvider
{
    /**
     * 在注册后启动服务
     */
    public function boot()
    {
        // todo:
    }
    
    /**
     * 在容器中注册绑定
     */
    public function register()
    {
        // todo:
    }
}

composer.json

{
    "name": "wuwei/package-test",
    "description": "Hello world.",
    "type": "library",
    "license": "MIT",
    "authors": [
        {
            "name": "linjinwei",
            "email": "[email protected]"
        }
    ],
    "minimum-stability": "dev",
    "require": {},
    "autoload": {
        "psr-4": {
            "Wuwei\\PackageTest\\": "src/"
        }
    }
}

Step3. 本地扩展包的使用

  • 修改根目录下的composer.json文件
...
"repositories": {
    "0": {
        "type": "vcs",
        "url": "https://git.coding.net/dudukeji/wechat.git"
    },
    "packagist": {
        "type": "composer",
        "url": "https://packagist.phpcomposer.com"
    },
    "wuwei": {
        "type": "path",
        "url": "/var/www/html/dolife/packages/wuwei/package-test" # 这里必须为绝对路径
    }
}
...
  • 引入包
composer require wuei/package-test:dev-master # 执行结算之后,会出现在vendor目录中
  • 注册到laravel项目中
  1. 方法一,在config/app.php中添加
...

'providers' => [
    ...
    Wuwei\PackageTest\TestServiceProvider::class,
    ...
],
...
  1. 方法二,修改包的composer.json文件(该方式从laravel5.5之后开始支持)
...
"extra": {
    "laravel": {
        "providers": [
            "Wuwei\\PackageTest\\TestServiceProvider"
        ],
        "aliases": {
            "facade-name": "Wuwei\\PackageTest\\Facade"
        }
    }
}
...

Step4. 资源文件

  1. config
cd packages/wuwei/package-test/src
mkdir config
touch test.config

test.config



return [
    'pakage_name' => 'pakage-test'
];

TestServiceProvider.php

...

public function boot()
{
    $this->publishes([
        __DIR__.'/config/test.php' => config_path('test.php'),
    ]);
}
...

# 这样可以在引用的项目里面修改默认的配置项,但是有时候只想修改其中的少量的配置项,可以合并默认配置项

...
public function register()
{
    $this->mergeConfigFrom(
        __DIR__.'/config/test.php', 'test'
    );
}
...
  1. migrations
cd packages/wuwei/package-test/src
mkdir migrations
cd migrations
touch migrations.php

public function boot()
{
    $this->loadMigrationsFrom(__DIR__.'/migrations');
}
  1. route
cd packages/wuwei/package-test/src
touch routes.php

public function boot()
{
    $this->loadRoutesFrom(__DIR__.'/routes.php');
}
  1. lang
cd packages/wuwei/package-test/src
mkdir translations
cd translations
touch zh.php

public function boot()
{
    $this->loadTranslationsFrom(__DIR__.'/translations', 'test'); # test为语言包名
}

# 在项目中使用例子
echo trans('test::messages.welcome');
# test 扩展包中的 messages 文件的 welcome 行

# 可以将语言包发布到应用的resources/lang/vendor目录
$this->publishes([__DIR__.'/translations' => resource_path('lang/vendor/test')]);
  1. view
public function boot()
{
    $this->loadViewsFrom(__DIR__.'/views', 'test');

    $this->publishes([
        __DIR__.'/views' => resource_path('views/vendor/test'),
    ]);
}
  1. command
public function boot()
{
    if ($this->app->runningInConsole()) {
        $this->commands([
            TestCommand::class,
        ]);
    }
}
  1. assets
public function boot()
{
    $this->publishes([
        __DIR__.'/assets' => public_path('vendor/test'),
    ], 'public');
}
# 最后一个参数 public 是资源分类标签
php artisan vendor:publish --tag=public --force # --provider="服务提供者"

Step5.发布拓展包到 packagist

  1. 把包上传到github, 给composer.json,增加version
  2. 上传到packagist

当开发 Laravel 应用时,通常使用契约(contracts)或 facades 没有什么区别,因为他们都提供基本相同的可测试能力。然而,在进行扩展包开发的时候,扩展包并不能访问 Laravel 提供的所有测试辅助函数。如果你想像在 Laravel 应用中一样编写扩展包的测试用例,你可以使用扩展包 Orchestral Testbench。

文章的个人博客链接:https://linjinwei.com/laravel/20190906165919.html

你可能感兴趣的:(Laravel,PHP)