Advertisement

Laravel扩展包开发介绍

阅读量:
Laravel扩展包介绍

使用扩展包作为主要途径,在 Laravel 应用程序中集成功能是一个主流的方式。这些扩展包通常提供了丰富的功能组合。比如时间处理相关的 Carbon 模块。以及像 Behat 这样的测试框架支持模块。

显然按照不同的功能划分成多种类别。有些PHP扩展包完全独立运行,在各种 PHP 框架中无缝集成。Carbon 和 Behat 就是这样的独立扩展包。通过将这些独立运行的PHP扩展包添加到项目中的composer.json文件里就能顺利集成到任何PHP框架中。

另一方面,在某些情况下,某些扩展包仅限于在 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

复制代码
    <?php
    
    namespace Wuwei\PackageTest;
    
    class Test
    {
    public function exec()
    {
        echo 'hello world!';
    }
    }

TestServiceProvider.php

复制代码
    <?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": "linjinwei@icloud.com"
        }
    ],
    "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

复制代码
    <?php
    
    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添加/提交相关依赖项,并在版本号上进行升级。
  2. 将该软件包托管至Packagist平台,并在其中提交详细信息。

在开发基于Laravel的应用过程中,
通常使用的契约(contracts)与facades在功能上是等价的,
它们都能提供基础且相似的可测试功能。

需要注意的是,
在开发扩展包时,
扩展包无法访问到Laravel提供的全部测试辅助函数。

如果你希望像在Laravel应用中那样编写扩展包的测试案例,
可以使用Orchestral Testbench这一工具来实现。

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

全部评论 (0)

还没有任何评论哟~