ساخت پکیج لاراول 5 - قسمت دوم

ترجمه و تالیف : امیررضا سیستانه ای
تاریخ انتشار : 13 خرداد 98
خواندن در 1 دقیقه
دسته بندی ها : لاراول

مقدمه

برای قسمت دوم سری آموزش های ساخت پکیج لاراول ما سراغ توسعه و کدنویسی میریم. ما مباحث مسیریابی, کنترلرها و view ها رو مطرح می کنیم.

پوشه src

شما میتونید از هر ساختاری که دوست دارید در پکیج استفاده کنید. اگرچه بهترین تمرین اینه که یک مسیر src داشته باشید که تمام کد رو به نگه میداره. و طبیعتا یک فایل composer.json در کنار این مسیر و در مسیر اصلی وجود داره :

.\pacakges\websanova\demo\src
.\pacakges\websanova\demo\composer.json

Composer.json

ما تعداد کمی فیلد به composer.json که در مسیر اصلی پروژه لاراول هست اضافه می کنیم. 

{
    "name": "websanova/demo",
    "description": "Demo package for Websanova article.",
    "keywords": ["laravel", "demo"],
    "license": "MIT",
    "authors": [
        {
            "name": "websanova",
            "email": "rob@websanova.com"
        }
    ],
    "autoload": {
        "psr-4": {
            "Websanova\\Demo\\": "src/"
        }
    },
    "require": {
        "illuminate/support": "~5"
    }
}

فیلد autoload به ما میگه که کجا دنبال namespace پکیج های ما بگرده. این بسیار مهمه پس مطمئن بشید اسم منحصربفرد برای پکیج تون انتخاب می کنید.

بستگی داره چه نوع پکیجی رو توسعه بدید, اما برای راحتی فرض کنید ما می خواهیم سرویسی بسازیم که نیاز به ServiceProvider داره. در این مورد ما به کتابخانه illuminate/support احتیاج داریم.

لاراول

سپس نیاز داریم هر ورژن از لاراولی که می خواهیم در پکیج تست کنیم رو آپدیت کنیم. این معمولا فقط شامل آپدیت config/app.php میشه که تغییرات facades و provider ها انجام میشه. ما همچنین باید فایل composer.json رو آپدیت کنیم تا بهش بگیم پکیج هامون رو چطور پیدا کنه.

// config/app.php

'providers' => [
    ...
    'Websanova\Demo\DemoServiceProvider',
    ...
],

'aliases' => [
    ...
    'Demo' => 'Websanova\Demo\DemoFacade',
    ...
],

// composer.json
...
"autoload": {
    ...
    "psr-4": {
        "App\\": "app/",
        "Websanova\\Demo\\": "packages/Websanova/Demo/src/"
    }
},

...

کلاس پکیج

حالا بیاییم یک کلاس ساده, service provider و facade بسازیم. توجه کنید که یک service provider و facade ضروری نیستند و ما فقط برای نشان دادن یک مثال ساده اونها رو میسازیم :


// src/Demo.php

namespace Websanova\Demo;

class Demo
{
    public function hello()
    {
        return 'hello';
    }
}

// src/DemoServiceProvider.php

namespace Websanova\Demo;

use Illuminate\Support\ServiceProvider;

class DemoServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->bind('websanova-demo', function() {
            return new Demo;
        });
    }
}

// src/DemoFacade.php

namespace Websanova\Demo;

use Illuminate\Support\Facades\Facade;

class DemoFacade extends Facade
{
    protected static function getFacadeAccessor() { 
        return 'websanova-demo';
    }
}

با مقادیری که در config/app.php وارد کردیم حالا میتونیم بصورت زیر صدا بزنیم :

Demo::hello();

توجه کنید که نام websanova-demo باید منحصر به فرد باشه. 

مسیرها

در مثال بالا ما یک پکیج ساده ساختیم. گاهی ما نیاز داریم یکسری کاربردهای دیگر که شامل مسیرهای آماده میشه رو به پکیج اضافه کنیم.

ما باید یک متد boot به DemoServiceProvider اضافه کنیم. این متد boot جایی هست که ما همه چیز رو به هم وصل می کنیم (مثل مسیرها و migration ها).

// src/DemoServiceProvider.php

namespace Websanova\Demo;

use Illuminate\Support\ServiceProvider;

class DemoServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->bind('websanova-demo', function() {
            return new Demo;
        });
    }

    public function boot()
    {
        require __DIR__ . '/Http/routes.php';
    }
}

همچنین ما باید یک فایل src/Http/routes.php بسازیم و بصورت زیر عمل کنیم :

// src/Http/routes.php

Route::get('demo/test', function () {
    return 'Test';
});

Route::get('demo/hello', function () {
    return Demo::hello();
});

حالا میتونید مسیرهای http://localhost:8000/demo/test و http://localhost:8000/demo/hello رو تست کنید.

کنترلرها

// src/Http/DemoController.php

namespace Websanova\Demo\Http;

use Illuminate\Routing\Controller as BaseController;

class DemoController extends BaseController
{
    public function index()
    {
        return \Demo::hello() . ' from controller.';
    }
}

مسیر مورد نظر رو به routes.php اضافه کنید :

Route::get('demo', 'Websanova\Demo\Http\DemoController@index');

View ها

برای افزودن view ها ابتدا تغییراتی در متد boot اعمال کنید :

public function boot()
{
    require __DIR__ . '/Http/routes.php';

    $this->loadViewsFrom(__DIR__ . '/views', 'websanova-demo');
}

تعیین کردیم که ویوها در مسیر src/views ذخیره بشوند.

ابتدا یک ویو ساده می سازیم :

// src/views/index.php

{{ "{{ Demo::hello() . ' from index view.' " }}}}

و یک مسیر برای فراخوانی :

Route::get('demo/view', function () {
    return view('websanova-demo::index');
});

نکته : اگر شما به یک کنترلر یا مدل پایه دارید اون رو بسازید و در پکیج مستقیما وارد کنید :

use Illuminate\Routing\Controller as BaseController;

بجای

use App\Http\Controllers\Controller;

در قسمت بعدی سراغ پیکربندی پکیج و انتشارش میریم.

منبع

دیدگاه‌ها و پرسش‌ها

برای ارسال نظر لازم است ابتدا وارد سایت شوید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید