توسعه بسته
معرفی
بسته ها راه اصلی اضافه کردن قابلیت به لاراول هستند. بستهها ممکن است هر چیزی باشند، از روشی عالی برای کار با تاریخهایی مانند کربن یا بستهای که به شما امکان میدهد فایلها را با مدلهای Eloquent مانند Spatie's Laravel Media Library مرتبط کنید .
بسته بندی انواع مختلفی دارد. برخی از بسته ها مستقل هستند، به این معنی که
با هر چارچوب PHP کار می کنند. Carbon و PHPUnit نمونه هایی از بسته های مستقل هستند. هر یک از این بسته ها می
تواند با لاراول استفاده شود و آنها را در
composer.json
فایل شما نیاز دارد.
از سوی دیگر، بسته های دیگر به طور خاص برای استفاده با لاراول در نظر گرفته شده اند. این بستهها ممکن است مسیرها، کنترلکنندهها، نماها و پیکربندیهایی داشته باشند که بهطور خاص برای بهبود برنامه لاراول در نظر گرفته شدهاند. این راهنما در درجه اول توسعه بسته هایی را پوشش می دهد که مخصوص لاراول هستند.
نکته ای در مورد نماها
هنگام نوشتن یک برنامه لاراول، معمولاً مهم نیست که از قراردادها یا نماها استفاده می کنید، زیرا هر دو اساساً سطح تست پذیری یکسانی را ارائه می دهند. با این حال، هنگام نوشتن بستهها، بسته شما معمولاً به تمام کمکهای تست لاراول دسترسی نخواهد داشت. اگر میخواهید بتوانید آزمایشهای بسته خود را طوری بنویسید که گویی بسته در یک برنامه معمولی لاراول نصب شده است، میتوانید از بسته Orchestral Testbench استفاده کنید .
کشف بسته
config/app.php
در فایل پیکربندی
برنامه لاراول ، این
providers
گزینه فهرستی از ارائه دهندگان خدماتی را که باید توسط لاراول بارگذاری
شوند، تعریف می کند. هنگامی که شخصی بسته شما را نصب می کند، معمولاً می خواهید ارائه دهنده خدمات شما در این
لیست قرار گیرد. به جای اینکه از کاربران بخواهید به صورت دستی ارائه دهنده خدمات خود را به لیست اضافه کنند، می
توانید ارائه دهنده را در
extra
بخش فایل بسته خود تعریف کنید
composer.json
. علاوه بر ارائه دهندگان خدمات، می توانید
نماهایی را
که می خواهید ثبت شوند نیز فهرست کنید:
"extra": { "laravel": { "providers": [ "Barryvdh\\Debugbar\\ServiceProvider" ], "aliases": { "Debugbar": "Barryvdh\\Debugbar\\Facade" } }},
هنگامی که بسته شما برای کشف پیکربندی شد، لاراول به طور خودکار ارائه دهندگان خدمات و نماهای خود را هنگام نصب ثبت می کند و تجربه نصب راحت را برای کاربران بسته شما ایجاد می کند.
انصراف از کشف بسته
اگر شما مصرفکننده یک بسته هستید و میخواهید کشف بسته را برای یک بسته
غیرفعال کنید، میتوانید نام بسته را در بخش فایل
extra
برنامه خود ذکر کنید
composer.json
:
"extra": { "laravel": { "dont-discover": [ "barryvdh/laravel-debugbar" ] }},
*
شما می توانید با استفاده از کاراکتر داخل دستورالعمل برنامه خود،
کشف بسته را برای همه بسته ها غیرفعال کنید
dont-discover
:
"extra": { "laravel": { "dont-discover": [ "*" ] }},
ارائه دهندگان خدمات
ارائه دهندگان خدمات نقطه اتصال بسته شما و لاراول هستند. یک ارائهدهنده خدمات مسئول اتصال چیزها به کانتینر سرویس لاراول و اطلاع دادن به لاراول برای بارگیری منابع بسته مانند نماها، پیکربندی و فایلهای محلیسازی است.
یک ارائه دهنده سرویس
Illuminate\Support\ServiceProvider
کلاس را گسترش می دهد و شامل دو روش است:
register
و
boot
. کلاس
پایه
ServiceProvider
در بسته Composer قرار دارد
illuminate/support
که باید آن را به وابستگی های بسته خود اضافه کنید. برای کسب اطلاعات بیشتر
در مورد ساختار و هدف ارائه دهندگان خدمات،
مستندات آنها را
بررسی کنید .
منابع
پیکربندی
به طور معمول، شما باید فایل پیکربندی بسته خود را در
config
دایرکتوری برنامه منتشر کنید. این به کاربران بسته شما اجازه می دهد تا به
راحتی گزینه های پیکربندی پیش فرض شما را نادیده بگیرند. برای اینکه اجازه دهید فایل های پیکربندی شما منتشر
شوند،
publishes
روش را از
boot
روش ارائه دهنده خدمات خود فراخوانی کنید:
/** * Bootstrap any package services. * * @return void */public function boot(){ $this->publishes([ __DIR__.'/../config/courier.php' => config_path('courier.php'), ]);}
اکنون، زمانی که کاربران بسته شما دستور لاراول را اجرا می کنند
vendor:publish
، فایل شما در محل انتشار مشخص شده کپی می شود. هنگامی که پیکربندی شما
منتشر شد، مقادیر آن مانند هر فایل پیکربندی دیگری قابل دسترسی است:
$value = config('courier.option');
شما نباید در فایل های پیکربندی خود بسته ها را تعریف کنید. هنگامی که کاربران دستور Artisan را اجرا می کنند، نمی توان آنها را به درستی سریال کرد
config:cache
.
پیکربندی بسته پیشفرض
همچنین می توانید فایل پیکربندی بسته خود را با نسخه منتشر شده برنامه ادغام
کنید. این به کاربران شما این امکان را میدهد که فقط گزینههایی را که واقعاً میخواهند در نسخه منتشر شده فایل
پیکربندی لغو کنند، تعریف کنند. برای ادغام مقادیر فایل پیکربندی، از
mergeConfigFrom
روش موجود در روش ارائه دهنده خدمات خود استفاده کنید
register
.
این
mergeConfigFrom
متد مسیر فایل پیکربندی بسته شما را به عنوان اولین آرگومان خود و نام کپی
برنامه از فایل پیکربندی را به عنوان آرگومان دوم می پذیرد:
/** * Register any application services. * * @return void */public function register(){ $this->mergeConfigFrom( __DIR__.'/../config/courier.php', 'courier' );}
این روش فقط سطح اول آرایه پیکربندی را ادغام می کند. اگر کاربران شما تا حدی یک آرایه پیکربندی چند بعدی را تعریف کنند، گزینه های از دست رفته ادغام نمی شوند.
مسیرها
اگر بسته شما حاوی مسیرهایی است، می توانید آنها را با استفاده از
loadRoutesFrom
روش بارگیری کنید. این روش به طور خودکار تعیین می کند که آیا مسیرهای
برنامه در حافظه پنهان هستند یا خیر و اگر مسیرها قبلاً کش شده باشند، فایل مسیرهای شما را بارگیری نمی کند:
/** * Bootstrap any package services. * * @return void */public function boot(){ $this->loadRoutesFrom(__DIR__.'/../routes/web.php');}
مهاجرت ها
اگر بسته شما حاوی
مهاجرت های پایگاه داده
است ، می توانید از
loadMigrationsFrom
روشی برای اطلاع رسانی به لاراول برای بارگذاری آنها استفاده کنید. این
loadMigrationsFrom
متد مسیر مهاجرت های بسته شما را به عنوان تنها آرگومان خود می پذیرد:
/** * Bootstrap any package services. * * @return void */public function boot(){ $this->loadMigrationsFrom(__DIR__.'/../database/migrations');}
هنگامی که مهاجرت های بسته شما ثبت شد، هنگام
php artisan migrate
اجرای دستور به طور خودکار اجرا می شوند. لازم نیست آنها را به
database/migrations
فهرست برنامه صادر کنید.
ترجمه ها
اگر بسته شما حاوی
فایل های ترجمه
است ، می توانید از
loadTranslationsFrom
روشی برای اطلاع رسانی به لاراول برای بارگذاری آنها استفاده کنید. به عنوان
مثال، اگر بسته شما نام دارد
courier
، باید موارد زیر را به
boot
روش ارائه دهنده خدمات خود اضافه کنید:
/** * Bootstrap any package services. * * @return void */public function boot(){ $this->loadTranslationsFrom(__DIR__.'/../lang', 'courier');}
ترجمه های بسته با استفاده از
package::file.line
قرارداد نحوی ارجاع می شوند. بنابراین، میتوانید خط
courier
بسته
welcome
را از
messages
فایل به صورت زیر بارگیری کنید:
echo trans('courier::messages.welcome');
انتشار ترجمه ها
اگر می خواهید ترجمه های بسته خود را در فهرست برنامه منتشر کنید
lang/vendor
، می توانید از
publishes
روش ارائه دهنده خدمات استفاده کنید. این
publishes
روش آرایه ای از مسیرهای بسته و مکان های انتشار دلخواه آنها را می پذیرد.
به عنوان مثال، برای انتشار فایل های ترجمه برای
courier
بسته، می توانید کارهای زیر را انجام دهید:
/** * Bootstrap any package services. * * @return void */public function boot(){ $this->loadTranslationsFrom(__DIR__.'/../lang', 'courier'); $this->publishes([ __DIR__.'/../lang' => $this->app->langPath('vendor/courier'), ]);}
اکنون زمانی که کاربران بسته شما دستور Artisan لاراول را اجرا می کنند
vendor:publish
، ترجمه های بسته شما در محل انتشار مشخص شده منتشر می شود.
بازدیدها
برای ثبت نماهای
بسته خود
با لاراول، باید به لاراول بگویید نماها در کجا قرار دارند. می توانید این
کار را با استفاده از
loadViewsFrom
روش ارائه دهنده خدمات انجام دهید. این
loadViewsFrom
متد دو آرگومان را می پذیرد: مسیر قالب های view و نام بسته شما. به عنوان
مثال، اگر نام بسته شما است
courier
، باید موارد زیر را به
boot
روش ارائه دهنده خدمات خود اضافه کنید:
/** * Bootstrap any package services. * * @return void */public function boot(){ $this->loadViewsFrom(__DIR__.'/../resources/views', 'courier');}
نماهای بسته با استفاده از
package::view
قرارداد نحوی ارجاع داده می شوند. بنابراین، هنگامی که مسیر مشاهده شما در
یک ارائه دهنده خدمات ثبت شد، می توانید نمای
dashboard
بسته را
courier
مانند این بارگذاری کنید:
Route::get('/dashboard', function () { return view('courier::dashboard');});
نادیده گرفتن بازدیدهای بسته
وقتی از این
loadViewsFrom
روش استفاده می کنید، لاراول در واقع دو مکان را برای نماهای شما ثبت می
کند: دایرکتوری برنامه
resources/views/vendor
و دایرکتوری که شما مشخص کرده اید. بنابراین، با استفاده از
courier
بسته به عنوان مثال، لاراول ابتدا بررسی می کند که آیا یک نسخه سفارشی از
view
resources/views/vendor/courier
توسط توسعه دهنده در دایرکتوری قرار داده شده است یا خیر. سپس، اگر نمای
شخصی سازی نشده باشد، لاراول دایرکتوری نمای بسته را که در تماس خود با آن مشخص کرده اید جستجو می کند
loadViewsFrom
. این امر باعث میشود تا کاربران بسته به راحتی نماهای بسته شما را
شخصیسازی یا نادیده بگیرند.
انتشار نماها
اگر می خواهید نماهای خود را برای انتشار در
resources/views/vendor
فهرست برنامه در دسترس قرار دهید، می توانید از
publishes
روش ارائه دهنده خدمات استفاده کنید. این
publishes
روش آرایه ای از مسیرهای مشاهده بسته و مکان های انتشار دلخواه آنها را می
پذیرد:
/** * Bootstrap the package services. * * @return void */public function boot(){ $this->loadViewsFrom(__DIR__.'/../resources/views', 'courier'); $this->publishes([ __DIR__.'/../resources/views' => resource_path('views/vendor/courier'), ]);}
اکنون وقتی کاربران بسته شما دستور Artisan لاراول را اجرا می کنند
vendor:publish
، نماهای بسته شما در محل انتشار مشخص شده کپی می شود.
مشاهده کامپوننت ها
اگر در حال ساخت بستهای هستید که از اجزای Blade استفاده میکند یا
کامپوننتها را در دایرکتوریهای غیر متعارف قرار میدهد، باید کلاس کامپوننت و نام مستعار تگ HTML آن را بهطور
دستی ثبت کنید تا لاراول بداند کامپوننت را کجا پیدا کند. شما معمولاً باید اجزای خود را در
boot
روش ارائه دهنده خدمات بسته خود ثبت کنید:
use Illuminate\Support\Facades\Blade;use VendorPackage\View\Components\AlertComponent; /** * Bootstrap your package's services. * * @return void */public function boot(){ Blade::component('package-alert', AlertComponent::class);}
هنگامی که کامپوننت شما ثبت شد، ممکن است با استفاده از تگ مستعار آن رندر شود:
<x-package-alert/>
بارگیری خودکار اجزای بسته
از طرف دیگر، میتوانید از
componentNamespace
روشی برای بارگیری خودکار کلاسهای مؤلفه بر اساس قرارداد استفاده کنید. به
عنوان مثال، یک
Nightshade
بسته ممکن است دارای
Calendar
اجزایی باشد
ColorPicker
که در
Nightshade\Views\Components
فضای نام قرار دارند:
use Illuminate\Support\Facades\Blade; /** * Bootstrap your package's services. * * @return void */public function boot(){ Blade::componentNamespace('Nightshade\\Views\\Components', 'nightshade');}
این اجازه می دهد تا از اجزای بسته توسط فضای نام فروشنده آنها با استفاده
از نحو استفاده شود
package-name::
:
<x-nightshade::calendar /><x-nightshade::color-picker />
Blade به طور خودکار کلاسی را که به این مؤلفه پیوند داده شده است، با پوشش پاسکال نام مؤلفه شناسایی می کند. زیر شاخه ها نیز با استفاده از نماد "نقطه" پشتیبانی می شوند.
اجزای ناشناس
components
اگر بسته شما حاوی اجزای ناشناس است، آنها باید در فهرستی از فهرست "views"
بسته شما
قرار گیرند (همانطور که در
loadViewsFrom
روش
مشخص شده است ). سپس، می توانید آنها را با پیشوند نام کامپوننت با فضای
نام view بسته ارائه دهید:
<x-courier::alert />
"درباره" فرماندهی صنعتگر
دستور Artisan داخلی لاراول
about
خلاصه ای از محیط و پیکربندی برنامه را ارائه می دهد. بستهها ممکن است
اطلاعات اضافی را از طریق کلاس به خروجی این فرمان وارد کنند
AboutCommand
. به طور معمول، این اطلاعات ممکن است از روش ارائه دهنده خدمات بسته شما
اضافه شود
boot
:
use Illuminate\Foundation\Console\AboutCommand; /** * Bootstrap any application services. * * @return void */public function boot(){ AboutCommand::add('My Package', fn () => ['Version' => '1.0.0']);}
دستورات
برای ثبت دستورات Artisan بسته خود با لاراول، می توانید از این
commands
روش استفاده کنید. این متد آرایه ای از نام کلاس های فرمان را انتظار دارد.
هنگامی که دستورات ثبت شد، می توانید آنها را با استفاده از
Artisan CLI
اجرا کنید :
use Courier\Console\Commands\InstallCommand;use Courier\Console\Commands\NetworkCommand; /** * Bootstrap any package services. * * @return void */public function boot(){ if ($this->app->runningInConsole()) { $this->commands([ InstallCommand::class, NetworkCommand::class, ]); }}
دارایی های عمومی
بسته شما ممکن است دارایی هایی مانند جاوا اسکریپت، CSS و تصاویر داشته
باشد. برای انتشار این دارایی ها در فهرست برنامه
public
، از روش ارائه دهنده خدمات استفاده کنید
publishes
. در این مثال، ما همچنین یک
public
برچسب گروه دارایی اضافه می کنیم که ممکن است برای انتشار آسان گروه هایی از
دارایی های مرتبط استفاده شود:
/** * Bootstrap any package services. * * @return void */public function boot(){ $this->publishes([ __DIR__.'/../public' => public_path('vendor/courier'), ], 'public');}
اکنون، هنگامی که کاربران بسته شما این
vendor:publish
دستور را اجرا می کنند، دارایی های شما در محل انتشار مشخص شده کپی می شود.
از آنجایی که کاربران معمولاً هر بار که بسته بهروزرسانی میشوند باید داراییها را بازنویسی کنند، میتوانید
از پرچم استفاده کنید
--force
:
php artisan vendor:publish --tag=public --force
انتشار گروه های فایل
ممکن است بخواهید گروه هایی از دارایی ها و منابع بسته را جداگانه منتشر
کنید. به عنوان مثال، ممکن است بخواهید به کاربران خود اجازه دهید تا فایل های پیکربندی بسته شما را بدون اینکه
مجبور به انتشار دارایی های بسته شما باشند، منتشر کنند. میتوانید این کار را با «برچگذاری» آنها هنگام
فراخوانی
publishes
روش از سوی ارائهدهنده خدمات بسته انجام دهید. به عنوان مثال، بیایید از تگ
ها برای تعریف دو گروه انتشار برای
courier
بسته (
courier-config
و
courier-migrations
) در
boot
روش ارائه دهنده خدمات بسته استفاده کنیم:
/** * Bootstrap any package services. * * @return void */public function boot(){ $this->publishes([ __DIR__.'/../config/package.php' => config_path('package.php') ], 'courier-config'); $this->publishes([ __DIR__.'/../database/migrations/' => database_path('migrations') ], 'courier-migrations');}
اکنون کاربران شما می توانند این گروه ها را به طور جداگانه با ارجاع به
برچسب خود هنگام اجرای
vendor:publish
دستور منتشر کنند:
php artisan vendor:publish --tag=courier-config