扩展包是向 Laravel 中添加功能的主要方式。扩展包可以包含很多有用的功能,例如时间处理扩展包 Carbon,或提供完整 BDD 测试框架的扩展包 Behat。
当然,扩展包有很多种类型。有些扩展包是独立运行的,意味着他们可以在任意的 PHP 框架中使用。Carbon 和 Behat 就是这样的独立扩展包。要在 Laravel 中使用这种扩展包只需要在 composer.json 文件中引入他们即可。
另一方面,有些扩展包只能在 Laravel 中使用。这些扩展包可能包含专门用来增强 Laravel 应用的路由、控制器、视图和配置的文件。
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
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/"
}
}
}
...
"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目录中
...
'providers' => [
...
Wuwei\PackageTest\TestServiceProvider::class,
...
],
...
...
"extra": {
"laravel": {
"providers": [
"Wuwei\\PackageTest\\TestServiceProvider"
],
"aliases": {
"facade-name": "Wuwei\\PackageTest\\Facade"
}
}
}
...
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'
);
}
...
cd packages/wuwei/package-test/src
mkdir migrations
cd migrations
touch migrations.php
public function boot()
{
$this->loadMigrationsFrom(__DIR__.'/migrations');
}
cd packages/wuwei/package-test/src
touch routes.php
public function boot()
{
$this->loadRoutesFrom(__DIR__.'/routes.php');
}
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')]);
public function boot()
{
$this->loadViewsFrom(__DIR__.'/views', 'test');
$this->publishes([
__DIR__.'/views' => resource_path('views/vendor/test'),
]);
}
public function boot()
{
if ($this->app->runningInConsole()) {
$this->commands([
TestCommand::class,
]);
}
}
public function boot()
{
$this->publishes([
__DIR__.'/assets' => public_path('vendor/test'),
], 'public');
}
# 最后一个参数 public 是资源分类标签
php artisan vendor:publish --tag=public --force # --provider="服务提供者"
当开发 Laravel 应用时,通常使用契约(contracts)或 facades 没有什么区别,因为他们都提供基本相同的可测试能力。然而,在进行扩展包开发的时候,扩展包并不能访问 Laravel 提供的所有测试辅助函数。如果你想像在 Laravel 应用中一样编写扩展包的测试用例,你可以使用扩展包 Orchestral Testbench。
文章的个人博客链接:https://linjinwei.com/laravel/20190906165919.html