包开发
介绍
包是向 Laravel 添加功能的主要方式。包可以是任何东西,从像 Carbon 这样处理日期的好方法,到像 Behat 这样完整的 BDD 测试框架。
当然,包有不同的类型。有些包是独立的,意味着它们可以与任何框架一起工作,而不仅仅是 Laravel。Carbon 和 Behat 都是独立包的例子。任何这些包都可以通过在你的 composer.json
文件中请求它们来与 Laravel 一起使用。
另一方面,其他包是专门为 Laravel 使用而设计的。这些包可能有路由、控制器、视图和配置,专门用于增强 Laravel 应用程序。本指南主要涵盖那些专门为 Laravel 开发的包。
所有 Laravel 包都通过 Packagist 和 Composer 分发,因此了解这些出色的 PHP 包分发工具是必不可少的。
视图
你的包的内部结构完全由你决定;然而,通常每个包都会包含一个或多个服务提供者。服务提供者包含任何服务容器绑定,以及包配置、视图和翻译文件所在位置的说明。
视图
包视图通常使用双冒号“命名空间”语法引用:
return view('package::view.name');
你只需告诉 Laravel 给定命名空间的视图所在的位置。例如,如果你的包名为“courier”,你可以在服务提供者的 boot
方法中添加以下内容:
public function boot()
{
$this->loadViewsFrom(__DIR__.'/path/to/views', 'courier');
}
现在你可以使用以下语法加载你的包视图:
return view('courier::view.name');
当你使用 loadViewsFrom
方法时,Laravel 实际上会为你的视图注册两个位置:一个在应用程序的 resources/views/vendor
目录中,另一个在你指定的目录中。因此,使用我们的 courier
示例:当请求包视图时,Laravel 首先会检查开发人员是否在 resources/views/vendor/courier
中提供了视图的自定义版本。然后,如果视图没有被自定义,Laravel 将搜索你在调用 loadViewsFrom
时指定的包视图目录。这使得最终用户可以轻松地自定义/覆盖你的包视图。
发布视图
要将包的视图发布到 resources/views/vendor
目录,你应该在服务提供者的 boot
方法中使用 publishes
方法:
public function boot()
{
$this->loadViewsFrom(__DIR__.'/path/to/views', 'courier');
$this->publishes([
__DIR__.'/path/to/views' => base_path('resources/views/vendor/courier'),
]);
}
现在,当你的包的用户执行 Laravel 的 vendor:publish
命令时,你的视图目录将被复制到指定位置。
如果你想覆盖现有文件,请使用 --force
开关:
php artisan vendor:publish --force
你可以使用 publishes
方法将任何类型的文件发布到你希望的任何位置。
翻译
包翻译文件通常使用双冒号语法引用:
return trans('package::file.line');
你只需告诉 Laravel 给定命名空间的翻译所在的位置。例如,如果你的包名为“courier”,你可以在服务提供者的 boot
方法中添加以下内容:
public function boot()
{
$this->loadTranslationsFrom(__DIR__.'/path/to/translations', 'courier');
}
请注意,在你的 translations
文件夹中,你将有每种语言的进一步目录,例如 en
、es
、ru
等。
现在你可以使用以下语法加载你的包翻译:
return trans('courier::file.line');
配置
通常,你会希望将包的配置文件发布到应用程序自己的 config
目录。这将允许你的包的用户轻松覆盖你的默认配置选项。
要发布配置文件,只需在服务提供者的 boot
方法中使用 publishes
方法:
$this->publishes([
__DIR__.'/path/to/config/courier.php' => config_path('courier.php'),
]);
现在,当你的包的用户执行 Laravel 的 vendor:publish
命令时,你的文件将被复制到指定位置。当然,一旦你的配置被发布,它可以像任何其他配置文件一样访问:
$value = config('courier.option');
你也可以选择将你自己的包配置文件与应用程序的副本合并。这允许你的用户在发布的配置副本中仅包含他们实际想要覆盖的选项。要合并配置,请在服务提供者的 register
方法中使用 mergeConfigFrom
方法:
$this->mergeConfigFrom(
__DIR__.'/path/to/config/courier.php', 'courier'
);
公共资源
你的包可能有 JavaScript、CSS 和图像等资源。要发布资源,请在服务提供者的 boot
方法中使用 publishes
方法。在此示例中,我们还将添加一个“public”资源组标签。
$this->publishes([
__DIR__.'/path/to/assets' => public_path('vendor/courier'),
], 'public');
现在,当你的包的用户执行 vendor:publish
命令时,你的文件将被复制到指定位置。由于通常需要在每次更新包时覆盖资源,你可以使用 --force
标志:
php artisan vendor:publish --tag=public --force
如果你想确保你的公共资源始终是最新的,可以将此命令添加到 composer.json
文件的 post-update-cmd
列表中。
发布文件组
你可能希望单独发布文件组。例如,你可能希望你的用户能够单独发布包的配置文件和资源文件。你可以通过“标记”它们来实现:
// 发布配置文件
$this->publishes([
__DIR__.'/../config/package.php' => config_path('package.php')
], 'config');
// 发布你的迁移
$this->publishes([
__DIR__.'/../database/migrations/' => database_path('/migrations')
], 'migrations');
然后你可以通过引用它们的标签单独发布这些文件,如下所示:
php artisan vendor:publish --provider="Vendor\Providers\PackageServiceProvider" --tag="config"
路由
要为你的包加载路由文件,只需在服务提供者的 boot
方法中 include
它。
从服务提供者中包含路由文件
public function boot()
{
include __DIR__.'/../../routes.php';
}
如果你的包使用控制器,你需要确保它们在 composer.json
文件的自动加载部分中正确配置。