확장팩 개발
ㅋㅋ ~ 확장 팩 개발
- Facades Notes
- 확장 팩 살펴보기
- 서비스 제공자
- Configuration
- 확장 패키지 기본 구성 그룹 파일 게시
Extension Pack Development
소개
확장 패키지는 다음과 같습니다. Laravel에 기능을 추가하는 주요 방법입니다. 확장 패키지에는 시간 처리 확장 Carbon 또는 완전한 BDD 테스트 프레임워크를 제공하는 확장 패키지 Behat 등 유용한 기능이 많이 포함될 수 있습니다.
물론 확장팩의 종류도 많습니다. 일부 확장은 독립형이므로 모든 PHP 프레임워크와 함께 사용할 수 있습니다. Carbon과 Behat은 이러한 독립형 확장팩입니다. Laravel에서 이 확장 패키지를 사용하려면 composer.json
파일에 추가하기만 하면 됩니다.
반면, 일부 확장 패키지는 Laravel에서만 사용할 수 있습니다. 이러한 확장 패키지에는 Laravel 애플리케이션의 경로, 컨트롤러, 보기 및 구성을 향상시키기 위해 특별히 설계된 파일이 포함될 수 있습니다. 이 가이드에서는 주로 Laravel 확장 패키지 개발을 소개합니다.
Facades 노트
Laravel 애플리케이션을 개발할 때 일반적으로 계약과 Facade를 사용하는 것 사이에는 차이가 없습니다. 둘 다 기본적으로 동일한 테스트 기능을 제공하기 때문입니다. 그러나 확장 패키지를 개발할 때 확장 패키지는 Laravel에서 제공하는 모든 테스트 도우미 기능에 접근할 수 없습니다. Laravel 애플리케이션에서와 마찬가지로 확장 패키지에 대한 테스트 케이스를 작성하려면 확장 패키지 Orchestral Testbench를 사용할 수 있습니다.
확장 패키지 살펴보기
Laravel 애플리케이션의 config/app.php
구성 파일에서 providers
옵션은 Laravel이 로드할 수 있는 서비스 공급자 목록을 정의합니다. . 누군가 확장 기능을 설치하면 서비스 제공업체를 이 목록에 포함해야 합니다. 사용자가 서비스 공급자를 목록에 수동으로 추가하도록 하는 대신 확장 패키지 composer.json
파일의 extra
섹션에 서비스 공급자를 정의할 수 있습니다. 서비스 제공자 외에도 등록하려는 모든 Facade를 나열할 수 있습니다: config/app.php
配置文件中,providers
选项定义了能够被 Laravel 加载的服务提供者列表。当有人安装你的扩展包时,你需要将你的服务提供者包含到这个列表中。你可以将服务提供者定义到扩展包的 composer.json
文件中的 extra
部分,而不是让用户手动将你的服务提供者添加到列表中。除了服务提供者,还可以列出所有你想注册的 facades:
"extra": { "laravel": { "providers": [ "Barryvdh\Debugbar\ServiceProvider" ], "aliases": { "Debugbar": "Barryvdh\Debugbar\Facade" } } },
一旦你的扩展包配置为可发现,Laravel 就会在安装时自动注册扩展包的服务提供者和 facades,为扩展包的用户提供一个友好的安装体验。
选择性的发现扩展包
如果你是扩展包的用户,想要禁止一个扩展包被发现,你可以在应用的 composer.json
文件中的 extra
部分列出这个扩展包:
"extra": { "laravel": { "dont-discover": [ "barryvdh/laravel-debugbar" ] } },
你也可以通过在应用的 dont-discover
指令中使用 *
字符,禁用扩展包发现功能:
"extra": { "laravel": { "dont-discover": [ "*" ] } },
服务提供者
服务提供者 让你的扩展包与 Laravel 联系在一起。服务提供者负责将一些东西绑定到 Laravel 的 服务容器 中,并且告诉 Laravel 从哪里加载扩展包的资源文件,例如视图、配置文件、语言包等。
服务提供者继承了 IlluminateSupportServiceProvider
类,并包含了两个方法:register
和 boot
。基类 ServiceProvider
位于名为 illuminate/support
的 Composer 扩展包中,你必须将它加入到你的扩展包依赖。想要了解更多关于服务提供者的结构和用途,请查阅 它的文档.
资源文件
配置
有时,你需要将扩展包配置文件发布到应用本身的 config
目录中。这样使用扩展包的用户就可以轻松的重写默认配置项。想要发布扩展包配置文件,只需要在服务提供者的 boot
方法中调用 publishes
方法即可:
/** * 在注册后启动服务。 * * @return void */ public function boot(){ $this->publishes([ __DIR__.'/path/to/config/courier.php' => config_path('courier.php'), ]); }
现在,当扩展包的用户执行 Laravel 的 vendor:publish
命令,扩展包文件就会被复制到指定的目录中。当然,一旦你的配置文件被发布,就可以如同其他配置一样被访问:
$value = config('courier.option');
{note} 你不应该在配置文件中定义闭包函数。因为当用户执行
config:cache
/** * 在容器中注册绑定。 * * @return void */ public function register(){ $this->mergeConfigFrom( __DIR__.'/path/to/config/courier.php', 'courier' ); }확장 패키지가 검색 가능하도록 구성되면 Laravel은 설치 중에 확장 패키지의 서비스 제공자와 Facade를 자동으로 확장 패키지로 등록합니다. 패키지는 사용자에게 친숙한 설치 환경을 제공합니다.
확장 팩의 선택적 검색
composer.json
파일의 extra
섹션에 이 확장 패키지를 나열하세요. 🎜/** * 在注册后启动服务。 * * @return void */ public function boot(){ $this->loadRoutesFrom(__DIR__.'/routes.php'); }🎜애플리케이션의
dont-discover
를 사용할 수도 있습니다. 확장 패키지 검색 기능을 비활성화하는 명령의 *
문자: 🎜/** * 在注册后启动服务。 * * @return void */ public function boot(){ $this->loadMigrationsFrom(__DIR__.'/path/to/migrations'); }🎜🎜
IlluminateSupportServiceProvider
클래스를 상속하며 register
및 boot
라는 두 가지 메서드를 포함합니다. 기본 클래스 ServiceProvider
는 illuminate/support
라는 Composer 확장 패키지에 있으며 이를 확장 패키지 종속성에 추가해야 합니다. 서비스 제공업체의 구조와 목적에 대해 자세히 알아보려면 해당 문서를 참조하세요. 🎜🎜🎜구성
🎜때때로 확장 기능을 추가해야 할 때가 있습니다. 패키지 구성 파일은 애플리케이션 자체의config
디렉터리에 게시됩니다. 이러한 방식으로 확장 패키지를 사용하는 사용자는 기본 구성 항목을 쉽게 재정의할 수 있습니다. 확장 패키지 구성 파일을 게시하려면 서비스 공급자의 boot
메서드에서 publishes
메서드만 호출하면 됩니다. 🎜/** * 在注册后启动服务。 * * @return void */ public function boot(){ $this->loadTranslationsFrom(__DIR__.'/path/to/translations', 'courier'); }🎜이제 확장 패키지 사용자가 실행하면 Laravel
vendor:publish
명령을 사용하면 확장 패키지 파일이 지정된 디렉터리에 복사됩니다. 물론 구성 파일이 게시되면 다른 구성처럼 액세스할 수 있습니다. 🎜echo trans('courier::messages.welcome');
🎜{note} 구성 파일에 클로저 기능을 정의하면 안 됩니다. 사용자가config:cache
Artisan 명령을 실행할 때 구성 파일이 올바르게 직렬화되지 않기 때문입니다. 🎜🎜🎜🎜확장 패키지 기본 구성
확장 패키지 기본 구성을 애플리케이션의 복사 구성과 병합할 수도 있습니다. 이를 통해 확장 팩 사용자는 복제본 구성 파일에서 재정의하려는 구성 옵션을 정의할 수 있습니다. 구성을 병합하려면 서비스 공급자의
register
메서드에서mergeConfigFrom
메서드를 호출하면 됩니다.register
方法中调用mergeConfigFrom
方法即可:/** * 在注册后启动服务。 * * @return void */ public function boot(){ $this->loadTranslationsFrom(__DIR__.'/path/to/translations', 'courier'); $this->publishes([ __DIR__.'/path/to/translations' => resource_path('lang/vendor/courier'), ]); }{note} 此方法只合并配置数组的第一维。如果扩展包用户定义了多维配置数组,缺少的选项将不会被合并。
路由
如果你的扩展包中包含路由文件,你需要使用
loadRoutesFrom
方法加载他们。此方法将自动判断应用的路由是否已被缓存,如果路由已缓存,将不会加载你的路由文件:/** * 在注册后启动服务。 * * @return void */ public function boot(){ $this->loadViewsFrom(__DIR__.'/path/to/views', 'courier'); }数据库迁移
如果你的扩展包中包含 数据库迁移,你需要使用
loadMigrationsFrom
方法告知 Laravel 如何加载他们。loadMigrationsFrom
方法只需要扩展包迁移文件路径作为唯一参数:Route::get('admin', function () { return view('courier::admin'); });一旦你的扩展包迁移文件被注册,当运行
php artisan migrate
命令时他们就会被自动执行。你不需要将他们导入到应用的database/migrations
目录中。语言包
如果你的扩展包中包含 语言包文件,你需要使用
loadTranslationsFrom
方法告知 Laravel 如何加载他们。例如,如果你的扩展包名为courier
,你需要将下面的内容加入到服务提供者的boot
方法中:/** * 在注册后启动服务。 * * @return void */ public function boot(){ $this->loadViewsFrom(__DIR__.'/path/to/views', 'courier'); $this->publishes([ __DIR__.'/path/to/views' => resource_path('views/vendor/courier'), ]); }扩展包翻译约定使用
package::file.line
语法进行引用。因此,你可以按照下面的方式来加载courier
扩展包中的messages
文件的welcome
行:/** * 引导应用服务。 * * @return void */ public function boot(){ if ($this->app->runningInConsole()) { $this->commands([ FooCommand::class, BarCommand::class, ]); } }发布语言包
如果你想要将扩展包中的语言包发布到应用的
resources/lang/vendor
目录,可以使用服务提供者的publishes
方法。publishes
方法接收一个包含语言包路径和对应发布位置的数组。例如,发布courier
扩展包的语言包文件,操作如下:/** * 在注册后启动服务。 * * @return void */ public function boot(){ $this->publishes([ __DIR__.'/path/to/assets' => public_path('vendor/courier'), ], 'public'); }现在,当扩展包的用户执行 Laravel 的
vendor:publish
php artisan vendor:publish --tag=public --force{note} 이 메서드는 구성 배열의 첫 번째 차원만 병합합니다. 확장 사용자가 다차원 구성 배열을 정의하는 경우 누락된 옵션은 병합되지 않습니다.확장 패키지에 라우팅 파일이 포함된 경우 이를 로드하려면경로
loadRoutesFrom
메서드를 사용해야 합니다. 이 방법은 적용된 경로가 캐시되었는지 자동으로 확인합니다. 경로가 캐시된 경우 경로 파일이 로드되지 않습니다: 🎜/** * 在注册后启动服务。 * * @return void */ public function boot(){ $this->publishes([ __DIR__.'/../config/package.php' => config_path('package.php') ], 'config'); $this->publishes([ __DIR__.'/../database/migrations/' => database_path('migrations') ], 'migrations'); }🎜🎜🎜🎜데이터베이스 마이그레이션
🎜 확장 패키지에 데이터베이스 마이그레이션이 포함되어 있는 경우loadMigrationsFrom
메서드를 사용하여 Laravel에 이를 로드하는 방법을 알려주어야 합니다.loadMigrationsFrom
메소드에는 유일한 인수로 확장 팩 마이그레이션 파일의 경로만 필요합니다. 🎜php artisan vendor:publish --tag=config🎜확장 팩 마이그레이션 파일이 등록되면php artisan migration<이 실행될 때 생성됩니다. /code> 명령이 자동으로 실행됩니다. 이를 애플리케이션의
database/migrations
디렉터리로 가져올 필요는 없습니다. 🎜🎜🎜🎜🎜언어 팩
🎜확장 팩에 언어 팩 파일이 포함되어 있는 경우 다음이 필요합니다.loadTranslationsFrom
메소드를 사용하여 Laravel에 로드 방법을 알려줍니다. 예를 들어 확장 패키지 이름이courier
인 경우 서비스 공급자의boot
메서드에 다음 콘텐츠를 추가해야 합니다. 🎜rrreee🎜확장 패키지 번역 규칙에서는 < 코드를 사용합니다. >package::file.line 구문을 참조하세요. 따라서 다음과 같이courier
확장 패키지에 있는messages
파일의welcome
줄을 로드할 수 있습니다: 🎜rrreee🎜🎜언어 팩 게시🎜🎜확장 패키지의 언어 팩을 애플리케이션의resources/lang/vendor
디렉터리에 게시하려면 서비스 공급자를 사용할 수 있습니다.게시
메소드입니다.publishes
메소드는 언어 팩 경로와 해당 게시 위치가 포함된 배열을 받습니다. 예를 들어courier
확장 패키지의 언어팩 파일을 게시하려면 다음과 같은 작업이 수행됩니다. 🎜rrreee🎜이제 확장 패키지 사용자가 Laravel의vendor:publish를 실행하면 code> Artisan 명령을 실행하면 언어 패키지가 지정된 디렉터리에 게시됩니다. 🎜🎜🎜🎜🎜🎜🎜
구문을 참조하세요. 따라서 보기 경로가 서비스 제공자에 성공적으로 등록되면 다음 방법을 사용하여View
Laravel에 확장 패키지의 뷰를 등록하려면 Laravel에 뷰 파일의 위치를 알려주어야 합니다. 서비스 제공자의
rrreeeloadViewsFrom
메소드를 사용하여 이 작업을 수행할 수 있습니다.loadViewsFrom
메서드를 사용하면 뷰 템플릿 경로와 확장 패키지 이름이라는 두 가지 매개변수를 받을 수 있습니다. 예를 들어 확장 패키지 이름이courier
인 경우 서비스 공급자의boot
메서드에 다음 콘텐츠를 추가해야 합니다.loadViewsFrom
方法来实现。loadViewsFrom
方法允许接收两个参数:视图模板路径和扩展包名。例如,如果你的扩展包名为courier
,你需要将下面的内容加入到服务提供者的boot
方法中:扩展包视图约定使用
rrreeepackage::view
语法进行引用。因此,一旦视图路径在服务提供者中注册成功,你可以使用下面的方式来加载courier
扩展包中的admin
视图:重写扩展包视图
当你使用
loadViewsFrom
方法时,Laravel 实际上在两个位置注册视图:应用的resources/views/vendor
目录和你的自定义目录。所以,还以courier
扩展包为例,Laravel 首先会检查开发人员是否在resources/views/vendor/courier
中提供了一个自定义版本的视图。然后,如果视图尚未被定义,Laravel 将会搜索在loadViewsFrom
中定义的视图目录。这种方法可以让用户很简单的自定义或重写扩展包的视图。发布视图
如果你希望将你的视图发布到应用的
rrreeeresources/views/vendor
目录中,可以使用服务提供者的publishes
方法。publishes
方法接收一个包含视图路径和对应发布位置的数组:现在,当扩展包的用户执行 Laravel 的
vendor:publish
Artisan 命令,视图将会被发布到自定的目录中。命令
想要在 Laravel 中注册扩展包的 Artisan 命令,需要使用
rrreeecommands
方法。此方法接收一个命令类的数组。一旦这些命令注册成功,可以使用 Artisan 命令行 执行他们:公共资源文件
你的扩展包中可能存在 JavaScript、CSS 和图片之类的资源文件。想要发布这些资源文件到应用的
rrreeepublic
目录,可以使用服务提供者的publishes
方法。在下面的例子中,我们也可以添加一个public
资源分类标签,可用于相关发布资源的分类:现在,当扩展包的用户执行
확장 패키지 보기 규칙에서는 < 코드를 사용합니다. >package::viewvendor:publish
命令,你的资源文件将会被复制到指定的目录中。由于每次更新扩展包时通常都需要覆盖资源文件,因此需要使用--force
rrreeecourier
확장 패키지의admin
보기를 로드할 수 있습니다:rrreee
확장 패키지 뷰 재작성
loadViewsFrom
메소드를 사용하면 Laravel은 실제로 애플리케이션의 < code>resources/views/vendor 디렉토리와 사용자 정의 디렉토리. 따라서courier
확장 패키지를 예로 들면, Laravel은 먼저 개발자가resources/views/vendor/courier
에 뷰의 사용자 정의 버전을 제공했는지 여부를 확인합니다. 그런 다음 뷰가 아직 정의되지 않은 경우 Laravel은loadViewsFrom
에 정의된 뷰 디렉터리를 검색합니다. 이 접근 방식을 사용하면 사용자는 확장 패키지의 보기를 쉽게 사용자 정의하거나 재정의할 수 있습니다.앱의뷰 게시
resources/views/vendor
에 뷰를 게시하려는 경우 디렉토리에 대해서는 서비스 제공자의publishes
메소드를 사용할 수 있습니다.publishes
메소드는 보기 경로와 해당 게시 위치를 포함하는 배열을 받습니다: 🎜rrreee🎜이제 확장 패키지 사용자가 Laravel의vendor:publish
Artisan 명령을 실행할 때, 보기는 사용자 정의 디렉터리에 게시됩니다. 🎜🎜🎜🎜🎜Commands
🎜 확장 패키지의 Artisan 명령어를 등록하고 싶다면 Laravel,commands
메소드를 사용해야 합니다. 이 메소드는 명령 클래스 배열을 수신합니다. 이러한 명령이 성공적으로 등록되면 Artisan 명령줄을 사용하여 실행할 수 있습니다: 🎜rrreee🎜🎜🎜🎜🎜공개 자산 파일
🎜 확장 패키지에는 JavaScript, CSS, 이미지와 같은 리소스 파일이 있을 수 있습니다. 이러한 리소스 파일을 애플리케이션의public
디렉터리에 게시하려면 서비스 공급자의publishes
메서드를 사용할 수 있습니다. 아래 예에서는 관련된 게시된 리소스를 분류하는 데 사용할 수 있는public
리소스 분류 태그를 추가할 수도 있습니다. 🎜rrreee🎜이제 확장 패키지 사용자가vendor를 실행할 때: 게시 코드> 명령을 실행하면 리소스 파일이 지정된 디렉터리에 복사됩니다. 일반적으로 확장 팩이 업데이트될 때마다 리소스 파일을 덮어써야 하므로
--force
태그를 사용해야 합니다: 🎜rrreee🎜🎜🎜🎜🎜🎜그룹 파일 게시
확장팩 리소스 파일이나 리소스를 별도로 패키지하고 게시할 수 있습니다. 예를 들어, 확장 패키지의 모든 리소스 파일을 강제로 게시하는 대신 사용자가 확장 패키지의 구성 파일을 개별적으로 게시하도록 할 수 있습니다. 확장 패키지 서비스 제공자에서
rrreeepublishes
메소드를 호출하여 다양한 파일에 "태그"를 지정할 수 있습니다. 예를 들어 확장 패키지 서비스 공급자의boot
메서드를 사용하여 두 개의 게시 그룹을 정의해 보겠습니다.publishes
方法给不同文件打上「标签」。例如,让我们使用扩展包服务提供者中的boot
方法来定义两个发布群组:现在你的用户就可以通过执行
이제 사용자는vendor:publish
rrreeevendor:publish
명령을 실행하여 다른 그룹을 게시할 수 있습니다. 정의된 태그를 기반으로 하는 파일:rrreee이 기사는 LearnKu.com웹사이트에 처음 게시되었습니다.