Développement de packs d'extension
~
- Découverte des packs d'extension
- Découverte sélective des packs d'extension Fichier ressource
- Extension configuration par défaut du package
- Routage
Développement du pack d'extension
- Introduction
- Découvrir le pack d'extension
- Fournisseur de services
- Fichiers de ressources
- Commande
- Fichier de ressources publiques
- Publier le fichier de groupe
Introduction
Les packages d'extension sont le principal moyen d'ajouter des fonctionnalités à Laravel. Les packages d'extension peuvent contenir de nombreuses fonctionnalités utiles, telles que l'extension de traitement du temps Carbon ou le package d'extension Behat qui fournit un cadre de test BDD complet.
Bien sûr, il existe de nombreux types de packs d'extension. Certaines extensions sont autonomes, ce qui signifie qu'elles peuvent être utilisées avec n'importe quel framework PHP. Carbon et Behat sont de tels packs d'extension autonomes. Pour utiliser ce package d'extension dans Laravel, il vous suffit de les introduire dans le fichier
composer.json
.D'un autre côté, certains packages d'extension ne peuvent être utilisés que dans Laravel. Ces packages d'extension peuvent contenir des fichiers spécialement conçus pour améliorer les routes, les contrôleurs, les vues et la configuration de votre application Laravel. Ce guide présente principalement le développement des packages d'extensions Laravel.
Notes sur les façades
Lors du développement d'applications Laravel, il n'y a généralement aucune différence entre l'utilisation de contrats ou de façades, car ils offrent tous deux fondamentalement les mêmes capacités de testabilité. Cependant, lors du développement de packages d'extension, le package d'extension n'a pas accès à toutes les fonctions d'aide aux tests fournies par Laravel. Si vous souhaitez écrire des cas de test pour un package d'extension comme dans une application Laravel, vous pouvez utiliser le package d'extension Orchestral Testbench.
Découvrez le package d'extension
Dans le fichier de configuration
config/app.php
de l'application Laravel, l'optionproviders
définit la liste des fournisseurs de services pouvant être chargés par Laravel . Lorsque quelqu'un installe votre extension, vous devez inclure votre fournisseur de services dans cette liste. Au lieu de demander aux utilisateurs d'ajouter manuellement vos fournisseurs de services à une liste, vous pouvez définir vos fournisseurs de services dans la sectionextra
du fichiercomposer.json
de votre package d'extension. En plus des prestataires de services, vous pouvez également lister toutes les façades que vous souhaitez enregistrer :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' ); }
Une fois votre package d'extension configuré pour être détectable, Laravel enregistrera automatiquement les prestataires de services et les façades du package d'extension lors de l'installation, comme le fournit le package d'extension. une expérience d'installation conviviale.Si vous êtes un utilisateur de pack d'extension et souhaitez empêcher la découverte d'un pack d'extension, vous pouvez Répertoriez ce package d'extension dans la sectionDécouverte sélective des packs d'extension
extra
du fichiercomposer.json
de l'application : 🎜/** * 在注册后启动服务。 * * @return void */ public function boot(){ $this->loadRoutesFrom(__DIR__.'/routes.php'); }
🎜Vous pouvez également utiliser l'optiondont-discover
Utiliser*
caractères dans la commande pour désactiver la fonction de découverte du package d'extension : 🎜/** * 在注册后启动服务。 * * @return void */ public function boot(){ $this->loadMigrationsFrom(__DIR__.'/path/to/migrations'); }
🎜🎜🎜🎜Fournisseurs de services🎜🎜Les fournisseurs de services connectent vos extensions à Laravel. Le fournisseur de services est chargé de lier quelque chose au conteneur de services de Laravel et d'indiquer à Laravel où charger les fichiers de ressources du package d'extension, tels que les vues, les fichiers de configuration, les packs de langue, etc. 🎜🎜Le fournisseur de services hérite de la classeIlluminateSupportServiceProvider
et contient deux méthodes :register
etboot
. La classe de baseServiceProvider
se trouve dans le package d'extension Composer nomméilluminate/support
et vous devez l'ajouter aux dépendances de votre package d'extension. Pour en savoir plus sur la structure et la finalité d'un prestataire de services, consultez sa documentation 🎜🎜🎜🎜🎜Resource. files🎜🎜🎜🎜Configuration
🎜Parfois, vous devez ajouter des extensions Configuration du package les fichiers sont publiés dans le répertoireconfig
de l'application elle-même. De cette manière, les utilisateurs utilisant le package d'extension peuvent facilement remplacer les éléments de configuration par défaut. Pour publier le fichier de configuration du package d'extension, il vous suffit d'appeler la méthodepublishes
dans la méthodeboot
du fournisseur de services : 🎜/** * 在注册后启动服务。 * * @return void */ public function boot(){ $this->loadTranslationsFrom(__DIR__.'/path/to/translations', 'courier'); }
🎜Maintenant, lorsque l'utilisateur du package d'extension exécute Laravelvendor:publish
, le fichier du package d'extension sera copié dans le répertoire spécifié. Bien entendu, une fois votre fichier de configuration publié, il est accessible comme n'importe quelle autre configuration : 🎜echo trans('courier::messages.welcome');
🎜{note} Vous ne devez pas définir de fonctions de fermeture dans les fichiers de configuration. Car lorsque l'utilisateur exécute la commande
config:cache
Artisan, le fichier de configuration ne sera pas sérialisé correctement. 🎜🎜🎜🎜Configuration par défaut du package d'extension
Vous pouvez également fusionner la configuration par défaut du package d'extension avec la configuration de copie de l'application. Cela permet aux utilisateurs du pack d'extension de définir les options de configuration qu'ils souhaitent remplacer dans le fichier de configuration de la réplique. Pour fusionner des configurations, appelez simplement la méthode
mergeConfigFrom
dans la méthoderegister
du fournisseur de services :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} Cette méthode fusionne uniquement les tableaux de configuration de la première dimension. Si l'utilisateur de l'extension définit un tableau de configuration multidimensionnel, les options manquantes ne seront pas fusionnées.
Si votre package d'extension contient des fichiers de routage, vous vous devez utiliser la méthodeRoutes
loadRoutesFrom
pour les charger. Cette méthode déterminera automatiquement si la route appliquée a été mise en cache. Si la route a été mise en cache, votre fichier de route ne sera pas chargé : 🎜/** * 在注册后启动服务。 * * @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'); }
🎜🎜🎜🎜Migrations de bases de données
🎜Si votre package d'extension contient des migrations de bases de données, vous devez utiliser la méthodeloadMigrationsFrom
pour indiquer à Laravel comment les charger. La méthodeloadMigrationsFrom
nécessite uniquement le chemin d'accès au fichier de migration du pack d'extension comme seul argument : 🎜php artisan vendor:publish --tag=config
🎜Une fois les fichiers de migration de votre pack d'extension enregistrés, ils seront générés lors de la migrationphp artisan< La commande /code> est exécutée et exécutée automatiquement. Vous n'avez pas besoin de les importer dans le répertoire
database/migrations
de votre application. 🎜🎜🎜🎜🎜Pack de langue
🎜Si votre pack d'extension contient des fichiers de pack de langue, vous avez besoin pour utiliser la méthodeloadTranslationsFrom
pour indiquer à Laravel comment les charger. Par exemple, si votre package d'extension est nommécourier
, vous devez ajouter le contenu suivant à la méthodeboot
du fournisseur de services : 🎜rrreee🎜La convention de traduction du package d'extension utilise < code Syntaxe >package::file.line pour référence. Par conséquent, vous pouvez charger la lignewelcome
du fichiermessages
dans le package d'extensioncourier
comme suit : 🎜rrreee🎜🎜Publier le module linguistique🎜🎜Si vous souhaitez publier le module linguistique dans le package d'extension dans le répertoireresources/lang/vendor
de l'application, vous pouvez utiliser un fournisseur de services La méthodepublie
. La méthodepublies
reçoit un tableau contenant le chemin d'accès au module linguistique et l'emplacement de publication correspondant. Par exemple, pour publier le fichier du pack de langue du package d'extensioncourier
, l'opération est la suivante : 🎜rrreee🎜Maintenant, lorsque l'utilisateur du package d'extension exécute levendor:publish de Laravel code> Commande Artisan, le package de langue sera publié dans le répertoire spécifié. 🎜🎜🎜🎜🎜🎜🎜
pour référence. Par conséquent, une fois le chemin d'accès à la vue enregistré avec succès auprès du fournisseur de services, vous pouvez utiliser la méthode suivante pour charger la vueView
Si vous souhaitez enregistrer la vue de votre package d'extension dans Laravel, vous devez indiquer à Laravel l'emplacement du fichier de vue. Vous pouvez le faire en utilisant la méthode
rrreeeloadViewsFrom
du fournisseur de services. La méthodeloadViewsFrom
permet de recevoir deux paramètres : le chemin du modèle de vue et le nom du package d'extension. Par exemple, si votre package d'extension est nommécourier
, vous devez ajouter le contenu suivant à la méthodeboot
du fournisseur de services :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
资源分类标签,可用于相关发布资源的分类:现在,当扩展包的用户执行
La convention d'affichage du package d'extension utilise < code Syntaxe >package::viewvendor:publish
命令,你的资源文件将会被复制到指定的目录中。由于每次更新扩展包时通常都需要覆盖资源文件,因此需要使用--force
rrreeeadmin
dans le package d'extensioncourier
:rrreee
Réécriture des vues du package d'extension
Lorsque vous utilisez la méthodeloadViewsFrom
, Laravel enregistre en fait les vues à deux endroits : le < de l'application code>resources/views/vendor et votre répertoire personnalisé. Ainsi, en prenant le package d'extensioncourier
comme exemple, Laravel vérifiera d'abord si le développeur a fourni une version personnalisée de la vue dansresources/views/vendor/courier
. Ensuite, si la vue n'a pas encore été définie, Laravel recherchera le répertoire de vues défini dansloadViewsFrom
. Cette approche permet aux utilisateurs de personnaliser ou de remplacer facilement les vues du package d'extension.Si vous souhaitez publier vos vues dans lesPublier les vues
ressources/vues/fournisseur
de votre application le répertoire, vous pouvez utiliser la méthodepublies
du fournisseur de services. La méthodepublishes
reçoit un tableau contenant le chemin de la vue et l'emplacement de publication correspondant : 🎜rrreee🎜Maintenant, lorsque l'utilisateur du package d'extension exécute la commande Artisanvendor:publish
de Laravel, la vue sera publiée dans un répertoire personnalisé. 🎜🎜🎜🎜🎜Commandes
🎜Si vous souhaitez enregistrer la commande Artisan du package d'extension dans Laravel, vous devez utiliser la méthodecommands
. Cette méthode reçoit un tableau de classes de commandes. Une fois ces commandes enregistrées avec succès, elles peuvent être exécutées à l'aide de la ligne de commande Artisan : 🎜rrreee🎜🎜🎜🎜🎜Fichiers de ressources publiques
🎜Il peut y avoir des fichiers de ressources tels que JavaScript, CSS et des images dans votre package d'extension. Pour publier ces fichiers de ressources dans le répertoirepublic
de l'application, vous pouvez utiliser la méthodepublishes
du fournisseur de services. Dans l'exemple ci-dessous, nous pouvons également ajouter une balise de classification de ressourcespublic
, qui peut être utilisée pour classer les ressources publiées associées : 🎜rrreee🎜Maintenant, lorsque l'utilisateur du package d'extension exécutevendor : publiez code>, vos fichiers de ressources seront copiés dans le répertoire spécifié. Étant donné que les fichiers de ressources doivent généralement être écrasés à chaque fois qu'un pack d'extension est mis à jour, la balise
--force
doit être utilisée : 🎜rrreee🎜🎜🎜🎜🎜🎜Publier des fichiers de groupe
Vous souhaiterez peut-être empaqueter et publier des fichiers de ressources ou des ressources de pack d'extension séparément. Par exemple, vous souhaiterez peut-être que les utilisateurs publient les fichiers de configuration dans un package d'extension individuellement, plutôt que d'être obligés de publier tous les fichiers de ressources dans un package d'extension. Vous pouvez « étiqueter » différents fichiers en appelant la méthode
rrreeepublies
dans le fournisseur de services du package d'extension. Par exemple, utilisons la méthodeboot
dans le fournisseur de services du package d'extension pour définir deux groupes de publication :publishes
方法给不同文件打上「标签」。例如,让我们使用扩展包服务提供者中的boot
方法来定义两个发布群组:现在你的用户就可以通过执行
Vos utilisateurs peuvent désormais exécuter la commandevendor:publish
rrreeevendor:publish
pour publier différents groupes. fichiers basés sur des balises définies :rrreeeCet article a été publié pour la première fois sur le site LearnKu.com.