یکی از مهم ترین بخش های آموزش فریم ورک لاراول این است که بتوانید، اقدام به پکیج نویسی در آن کنید، در واقع پکیج ها امکاناتی هستند که شما با استفاده از آن ها می توانید، قابلیت های جدیدی را به سایت خود اضافه کنید، پکیج ها می توانند، در هر جایی از برنامه که باعث بهبود روند برنامه نویسی و راحت شدن کار برنامه نویسان شود، به کار گرفته شوند. پکیج ها دارای انواع مختلفی هم چون پکیج های مستقلی که قابل استفاده در تمام فریم ورک های زبان PHP هستند (پکیج های Carbon و Behat)، پکیج های مخصوص لاراول و سایر پکیج ها می باشند. در ادامه ی این مطلب نکاتی مهم درباره پکیج نویسی در لاراول را بررسی خواهیم کرد، تا پس از مطالعه ی کامل این مطلب بتوانید، اقدام به ساخت پکیج در لاراول کنید، و پکیج های مورد نظر خود را برای این فریم ورک محبوب و قدرتمند طراحی کنید، تا سایر افراد و برنامه نویسان نیز بتوانند، از پکیج های شما استفاده کنند.

هنگام نوشتن یک برنامه ی Laravel، فرقی نمی کند که از Contract ها یا Facade ها استفاده کنید، زیرا هر دو سطح تست پذیری یا testability یکسانی دارند. با این حال هنگام نوشتن Package ها، Package شما به همه ی helper های تست کردن ( testing helper های لاراول ) دسترسی ندارد. در این صورت اگر می خواهید خودتان test های پکیج تان را بنویسید، می توانید از پکیج Orchstral Testbench استفاده کنید.
Package Discovery
در فایل config/app.php در درون یک برنامه ی Laravel، لیستی از Service Provider هایی که باید توسط برنامه load شوند، در بخش providers، به شکل زیر قرار دارد. هنگامی که شخصی Package شما را نصب می کند، می خواهید Service Provider خودتان در این لیست گنجانده شود. شما می توانید به جای اینکه کاربران را مجبور به اضافه کردن Service Provider خودتان به لیست کنید، در قسمت extra از فایل composer.json موجود در Package خودتان، Provider را تعریف کنید. هم چنین علاوه بر Service Provider ها ،می توانید Facade هایی را که می خواهید register کنید نیز ذکر کنید.
"extra": {
"laravel": {
"providers": [
"Barryvdh\\Debugbar\\ServiceProvider"
],
"aliases": {
"Debugbar": "Barryvdh\\Debugbar\\Facade"
}
}
},هنگامی که پکیج شما برای discovery پیکربندی شد، Laravel به طور خودکار Service Provider ها و Facade های خود را هنگام نصب register می کند، و یک نصب آسان و سریع را برای کاربرانی که می خواهند، از پکیج شما استفاده کنند، به ارمغان می آورد. [rlink pid=76393]
جلوگیری کردن از Package Discovery
اگر شما مصرف کننده یک Package هستید، و می خواهید Package Discovery را غیرفعال کنید، می توانید نام Package را در بخش extra از فایل composer.json برنامه ی خود قرار دهید.
"extra": {
"laravel": {
"dont-discover": [
"barryvdh/laravel-debugbar"
]
}
},هم چنین اگر بخواهید Package Discovery را برای همه ی Package ها غیرفعال کنید، می توانید از علامت * به شکل زیر استفاده کنید.
"extra": {
"laravel": {
"dont-discover": [
"*"
]
}
},Service Providers
Service Provider ها در واقع یک پل ارتباطی بین اپلیکیشن شما و پکیج مورد نظرتان می باشد، یکی از مهم ترین عملکردهای Service Provider این است، که منابع پکیج ها، View ها و فایل های تنظیمات را برای شما load می کند، تا به راحتی بتوانید از آن ها استفاده کنید.
Service Provider ها از کلاس Illuminate\Support\ServiceProvider ارث بری می کنند و دارای دو متد اصلی boot و register که بیشتر عملیات ها را انجام می دهند، می باشند. هم چنین لازم به ذکر است که کلاس پایه ی Service Provider در illuminate/support قرار دارد، که باید آن را به dependeciy های پکیج خودمان اضافه کنیم.
Configuration
شما باید به طور معمول، فایل configuration پکیج خود را در directory به نام config در برنامه ی خود قرار دهید. این کار باعث می شود، که کاربرانی که از پکیج شما استفاده می کنند، بتوانند به راحتی تنظیمات پیش فرض configuration پکیج تان را، مطابق با خواسته و میل خود تغییر دهند.
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
$this->publishes([
__DIR__.'/path/to/config/courier.php' => config_path('courier.php'),
]);
}حال هنگامی که کاربران Package شما، vendor لاراول را اجرا می کنند، یا یک command را publish می کنند، فایل شما به سرعت در مکان Publish کپی می شود. پس از انتشار Configuration شما، می توانید به مقادیر یا Value های آن مانند هر فایل Configuration دیگری، دسترسی پیدا کنید.
$value = config('courier.option');
کانفیگ های پیش فرض Package ها
شما می توانید فایل Configuration پکیج خود را با یک کپی از برنامه ی Publish شده، به راحتی ادغام کنید. شما با این کار به کاربران اجازه می دهید، که در کپی Publish شده از فایل کانفیگ، تنظیماتی را که خودشان می خواهند، تعریف کنند. هم چنین می توانید برای ادغام Configuration ها، از متد mergeConfigFrom در درون متد register از Service Provider استفاده کنید.
/**
* Register any application services.
*
* @return void
*/
public function register()
{
$this->mergeConfigFrom(
__DIR__.'/path/to/config/courier.php', 'courier'
);
}[titles]Routes اگر Package شما حاوی یک یا چند Route باشد، می توانید آن ها را با استفاده از متد loadRoutesFrom بارگذاری (load) کنید. در صورتی که Route های برنامه Cache شده باشند، و نتوانید Route ها را load کنید، این متد به صورت خودکار اجرا می شود.
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
$this->loadRoutesFrom(__DIR__.'/routes.php');
}Migrations
اگر Package شما حاوی یک یا چند Migration باشد، می توانید آن ها را با استفاده از متد loadMigrationsFrom به Laravel معرفی کنید تا بتوانید، آن ها را بارگذاری (load) کنید. متد loadMigrationsFrom مسیر Migration های پکیج را به عنوان تنها آرگومان خود می پذیرد.
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
$this->loadMigrationsFrom(__DIR__.'/path/to/migrations');
}پس از register یا ثبت Migration های Package شما، هنگامی که دستور php artisan migrate اجرا شود، به طور خودکار تمام Migration ها نیز اجرا می شود.
Factories
اگر Package شما حاوی یک یا چند Factory باشد، می توانید آن ها را با استفاده از متد loadFactoriesFrom به Laravel معرفی کنید، تا بتوانید آن ها را بارگذاری (load) کنید. متد loadFactoriesFrom مسیر Factory های پکیج را به عنوان تنها آرگومان خود می پذیرد.
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
$this->loadFactoriesFrom(__DIR__.'/path/to/factories');
}پس از register یا ثبت Factory های Package شما، می توانید آن ها را در برنامه ی خود استفاده کنید.
factory(Package\Namespace\Model::class)->create();Translations
اگر Package شما حاوی یک یا چند فایل Translation باشد، می توانید آن ها را با استفاده از متد loadTranslationsFrom به Laravel معرفی کنید، تا بتوانید آن ها را بارگذاری (load) کنید. به طور مثال، اگر نام Package شما courier باشد، می توانید به شکل زیر عمل کنید.
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
$this->loadTranslationsFrom(__DIR__.'/path/to/translations', 'courier');
}شما می توانید پکیج courier و دستور welcome آن را به صورت زیر load کنید.
echo trans('courier::messages.welcome');
Publishing Translations (انتشار ترجمه ها)
اگر می خواهید Translation های پکیج خود را در directory یا بخش resources/lang/vendor برنامه ی خود Publish کنید، می توانید از متد publishes در Service Provider استفاده کنید. متد publishes آرایه ای از مسیرهای Package و مکان های Publish دلخواه آن را می پذیرد. به طور مثال، برای Publish کردن فایل های Translation پکیج courier می توانید به شکل زیر عمل کنید.
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
$this->loadTranslationsFrom(__DIR__.'/path/to/translations', 'courier');
$this->publishes([
__DIR__.'/path/to/translations' => resource_path('lang/vendor/courier'),
]);
}حال هنگامی که کاربران Package شما، vendor لاراول را اجرا می کنند یا یک Artisan command را publish می کنند، Translation پکیج شما در یک مکان Publish خاص، منتشر (Publish) می شود.
Views
برای register کردن View های پکیج خود، باید به Laravel بگویید، که View ها در کجا واقع شده اند. شما می توانید این کار را با استفاده از متد loadViewsFrom در Service Provider انجام دهید. متد loadViewsFrom دو آرگومان مسیر View ها و نام پکیج را می پذیرد. به طور مثال، اگر نام پکیج شما courier باشد، می توانید کدهایی مانند کدهای زیر را در متد boot از Service Provider وارد کنید.
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
$this->loadViewsFrom(__DIR__.'/path/to/views', 'courier');
}هنگامی که مسیر View شما در Service Provider ثبت یا همان register شد، می توانید View دلخواه خود، مانند admin را به شکل زیر از courier بارگذاری (load) کنید.
Route::get('admin', function () {
return view('courier::admin');
});بازنویسی View های پکیج
در بازنویسی یا Override کردن View های یک پکیج، در واقع وقتی از متد loadViewsFrom استفاده می کنید، لاراول دو location، یعنی پوشه resources/views/vendor برنامه و directory که خودمان مشخص کردیم، را برای View های شما ثبت (register) می کند. بنابراین، فرض کنید در این مثال هم می خواهیم از courier استفاده کنیم، ابتدا Laravel بررسی می کند، که آیا نسخه ی سفارشی View، توسط توسعه دهنده در resources/views/vendor/courier ارائه شده است یا خیر. سپس، اگر نسخه ی سفارشی View وجود نداشت، لاراول directory یا مکان View را که در همان متد call ،loadViewsFrom کردیم، جستجو می کند. این کار ها باعث می شود، تا کاربرانی که از پکیج شما استفاده می کنند، بتوانند به راحتی همان گونه که می خواهند، View های پکیج شما را سفارشی سازی کنند.
Publish کردن View ها
اگر بخواهید، View ها قابلیت Publish شدن در directory یا قسمت resources/views/vendor را داشته باشد، می توانید از متد publishes در Service Provider استفاده کنید. این متد یک آرایه که شامل مسیر های View پکیج و مکان های Publish دلخواه است، را می پذیرد.
پ/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
$this->loadViewsFrom(__DIR__.'/path/to/views', 'courier');
$this->publishes([
__DIR__.'/path/to/views' => resource_path('views/vendor/courier'),
]);
}حال هنگامی که کاربران Package شما، vendor:publish را اجرا می کنند، View های پکیج شما به سرعت در مکان Publish، کپی می شود.
View Components
اگر Package شما حاوی یک یا چند View Component باشد، می توانید آن ها را با استفاده از متد loadViewComponentsAs به Laravel معرفی کنید، تا بتوانید، آن ها را بارگذاری (load) کنید. متد loadViewComponentsAs دو آرگومان tag prefix برای View Component ها و آرایه ای از کلاس های View Component ها را می پذیرد. به طور مثال، اگر Prefix پکیج شما courier باشد، و یک Alert و یک دکمه View Components داشته باشید، می توانید، کدهایی مانند کدهای زیر را در متد boot از Service Provider وارد کنید.
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
$this->loadViewComponentsAs('courier', [
Alert::class,
Button::class,
]);
}هنگامی که View Component ها در Service Provider های شما Register شد، می توانید از آن ها به شکل زیر در View ها استفاده کنید.
<x-courier-alert />
<x-courier-button />Commands
برای register کردن دستورهای پکیج خود با لاراول، می توانید از تابع Commands استفاده کنید. این تابع یک آرایه از نام های کلاس فرمان (command class names) را به عنوان ورودی می گیرد. وقتی فرمان ها برای بار اول ثبت می شوند، می توانید آن ها را با استفاده از CLI اجرا کنید:
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
if ($this->app->runningInConsole()) {
$this->commands([
FooCommand::class,
BarCommand::class,
]);
}
}Public Assets
Package شما ممکن است دارای Asset هایی مانند JavaScript ،CSS و تصاویر باشد. برای Publish کردن این Asset ها در پوشه Public برنامه، می توانید از متد publishes در Service Provider استفاده کنید. در مثال زیر، به اصطلاح یک Public Asset Group Tag به متد publishes اضافه می کنیم.
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
$this->publishes([
__DIR__.'/path/to/assets' => public_path('vendor/courier'),
], 'public');
}حال هنگامی که کاربران Package شما، vendor:publish را اجرا می کنند، Asset های پکیج شما به سرعت در مکان Publish، کپی می شود. از آن جا که به طور معمول، با هر بار بروزرسانی Package نیاز به Overwrite یا بازنویسی Asset ها دارید، می توانید از force-- در انتهای دستورتان استفاده کنید.
php artisan vendor:publish --tag=public --forcePublishing File Groups
گاهی اوقات ممکن است بخواهید، گروه هایی از Public Asset های یک پکیج و منابع یا Resource ها را به طور جداگانه Publish کنید. به طور مثال، ممکن است بخواهید به کاربران خود اجازه دهید، تا Configuration های پکیج تان را Publish کنند، بدون این که مجبور باشند، Asset های آن را Publish کنند. شما می توانید این کار را با tag کردن آن ها هنگام call کردن متد publishesh از Service Provider پکیج انجام دهید. به طور مثال، فرض کنید می خواهید از tag ها برای تعریف کردن دو Publish Group در متد boot از Service Provider پکیج استفاده کنید.
/**
* Bootstrap any application services.
*
* @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');
}اکنون کاربرانی که از پکیج شما استفاده می کنند، می توانند این گروه ها را به صورت جداگانه با استفاده از tag های آن، هنگامی که vendor:publish را اجرا می کنند Publish کنند.
php artisan vendor:publish --tag=configجمع بندی
یادگیری پکیج نویسی در لاراول حرفه ای می تواند، یکی از بزرگترین نیاز های هر برنامه نویس لاراول باشد. امروزه بسیاری از برنامه نوسان برای ارتقا کیفیت برنامه های خود به جای آن که کد هایی را خودشان از اول بنویسند، از پکیج های آماده استفاده می کنند. قطعا پکیج هایی که دارای Bug های مختلف امنیتی یا هر نوع Bug دیگری باشند، کم تر مورد استفاده قرار می گیرند، و شاید طی گذشت چند ماه با روی کار آمدن یک پکیج دیگر با همان امکانات ولی با Bug های کم تر، پکیج شما به طور کلی دیگر مورد استفاده ی هیچ برنامه نویسی قرار نگیرد. پکیج هایی که شما می سازید، یکی از بزرگ ترین نقاط قوت رزومه شما چه برای استخدام در ایران و چه برای استخدام در هر کشور دیگری هستند. اگر درباره پکیج نویسی در لاراول سوال یا نظری داشتید، خوشحال می شویم، که با ما و کاربران سون لرن به اشتراک بگذارید.
اگر به یادگیری بیشتر لاراول علاقه دارید می توانید در دوره آموزش لاراول پروژه محور کاربردی (بسته پروژه محور) شرکت کنید، این دوره شامل ۱۲ پروژه کاربردی و پر استفاده در دنیای واقعی است، که تمامی پروژه ها به صورت کامل برنامه نویسی خواهند شد، تا دانشجو بتواند با روند ایجاد و تکمیل پروژه به صورت کامل آشنا شود.
بسیار عالی ، اگه امکانش هست یه مطلب یا اموزش عملی ساخت یه پکیج هم تهیه کنید
توضیحات Commands، کپی شده توضیحات views هستش و متن مربوط به خودش نوشته نشده!!
سلام.
ممنون که اطلاع دادید :) اصلاح شد.