Laravel扩展包开发介绍

Laravel扩展包介绍

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

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

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

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

1
2
3
4
5
6
7
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

1
2
3
4
5
6
7
8
9
10
11
<?php

namespace Wuwei\PackageTest;

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

TestServiceProvider.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php

namespace Wuwei\PackageTest;

use Illuminate\Support\ServiceProvider;

class TestServiceProvider extends ServicerProvider
{
/**
* 在注册后启动服务
*/
public function boot()
{
// todo:
}

/**
* 在容器中注册绑定
*/
public function register()
{
// todo:
}
}

composer.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"name": "wuwei/package-test",
"description": "Hello world.",
"type": "library",
"license": "MIT",
"authors": [
{
"name": "linjinwei",
"email": "linjinwei@icloud.com"
}
],
"minimum-stability": "dev",
"require": {},
"autoload": {
"psr-4": {
"Wuwei\\PackageTest\\": "src/"
}
}
}

Step3. 本地扩展包的使用

  • 修改根目录下的composer.json文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    ...
    "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" # 这里必须为绝对路径
    }
    }
    ...
  • 引入包

    1
    composer require wuei/package-test:dev-master # 执行结算之后,会出现在vendor目录中
  • 注册到laravel项目中

  1. 方法一,在config/app.php中添加

    1
    2
    3
    4
    5
    6
    7
    8
    ...

    'providers' => [
    ...
    Wuwei\PackageTest\TestServiceProvider::class,
    ...
    ],
    ...
  2. 方法二,修改包的composer.json文件(该方式从laravel5.5之后开始支持)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ...
    "extra": {
    "laravel": {
    "providers": [
    "Wuwei\\PackageTest\\TestServiceProvider"
    ],
    "aliases": {
    "facade-name": "Wuwei\\PackageTest\\Facade"
    }
    }
    }
    ...

Step4. 资源文件

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

test.config

1
2
3
4
5
<?php

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

TestServiceProvider.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
...

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    cd packages/wuwei/package-test/src
    mkdir migrations
    cd migrations
    touch migrations.php

    public function boot()
    {
    $this->loadMigrationsFrom(__DIR__.'/migrations');
    }
  2. route

    1
    2
    3
    4
    5
    6
    7
    cd packages/wuwei/package-test/src
    touch routes.php

    public function boot()
    {
    $this->loadRoutesFrom(__DIR__.'/routes.php');
    }
  3. lang

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    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')]);
  4. view

    1
    2
    3
    4
    5
    6
    7
    8
    public function boot()
    {
    $this->loadViewsFrom(__DIR__.'/views', 'test');

    $this->publishes([
    __DIR__.'/views' => resource_path('views/vendor/test'),
    ]);
    }
  5. command

    1
    2
    3
    4
    5
    6
    7
    8
    public function boot()
    {
    if ($this->app->runningInConsole()) {
    $this->commands([
    TestCommand::class,
    ]);
    }
    }
  6. assets

    1
    2
    3
    4
    5
    6
    7
    8
    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。