Backend

Jak stworzyć własny package w Laravel

W programowaniu często spotykanym problemem jest próba znalezienia złotego środka pomiędzy tworzeniem aplikacji monolitycznej, a aplikacji zbudowanej z modułów czy też mikroserwisów. W Laravelu, gdzieś pomiędzy tymi wyborami, leży możliwość tworzenia własnych pakietów, czyli odrębnych jednostek kodu, które mogą być użyte w innych projektach. Taka potrzeba nie jest rzadkością – na pewno każdy z nas szybko znalazłby funkcjonalności, które chociaż raz zdublowały się w dwóch i więcej projektach. Przejdźmy do konkretów.

Paweł Kamiński. Absolwent Politechniki Białostockiej, programista z ponad 8-letnim doświadczeniem zawodowym. Zajmuje się frontendem (sass, React) i backendem (Laravel). Pracował przy projektach o różnej skali — przy ugruntowanych serwisach, ale także przy aplikacjach tworzonych w start-upach. Jest nauczycielem przedmiotów zawodowych w technikum informatycznym. W życiu stawia na stały rozwój. Poza programowanie, jego hobby to wszystko, co można uznać za retro w informatyce: gry, czasopisma, ślady po pionierach komputeryzacji w naszym kraju.


W dzisiejszym wpisie postaramy się stworzyć podstawowy pakiet, który będzie wyświetlał imię pobrane z parametru adresu URL. Od czego zaczynamy?

Na początek stwórzmy strukturę katalogów:

  • packages/<autor>/<nazwaPakietu>,
  • packages/<autor>/<nazwaPakietu>/src.

gdzie <autor> to oczywiście autor pakietu, czy też organizacja, natomiast <nazwaPakietu> to nazwa. Całą tą strukturę umieszczamy w katalogu głównym aplikacji (na tym samym poziomie, co katalog app). Jak łatwo się domyśleć, podkatalog src będzie zawierał źródła naszego pakietu.

Idąc dalej, przejdźmy do głównego katalogu aplikacji i zmodyfikujmy główny composer.json:

{
    "name": "laravel/laravel",
    "description": "The Laravel Framework.",
    "keywords": ["framework", "laravel"],
    "license": "MIT",
    "type": "project",
    "require": {
        "php": ">=7.0.0",

    },
    "autoload": {
        "classmap": [
            "database",
        ],
        "psr-4": {
            "App\\": "app/",
            "Kaminski\\Imiona\\": "packages/kaminski/imiona/src/"
        }
    }
}

Tu właściwie dodajemy do naszego autoloadera nowy pakiet i podajemy jego źródła. Na koniec uruchamiamy composer dump-autoload i przechodzimy do tworzenia samego kodu naszego pakietu.

Zaczynamy od stworzenia pliku packages/kaminski/imiona/src/KaminskiImionaProvider.php. Plik ten będzie miejscem startowym naszego pakietu. W metodzie register() dołączamy jeszczenie stworzony plik z routingiem naszego pakietu (zauważmy, iż pakiet będzie miał osobny plik routingu!), a także tworzymy kontroler Imie.

<?php

namespace Kaminski\Imiona;

use Illuminate\Support\ServiceProvider;

class KaminskiImionaProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
   
        include __DIR__.'/routes/web.php';
        $this->app->make('Kaminski\Imiona\ImionaController');
   
    }
}

Mając już Service Provider możemy go zarejestrować dodając w pliku config/app.php:

'providers' => [
        /*
         * Laravel Framework Service Providers...
         */
       ....
        Kaminski\Imiona\KaminskiImionaProvider::class
    ],

Rejestracja package’u jest już zakończona, przejdźmy do brakującego kontrolera i routingu:

Plik packages/kaminski/imiona/ImieController:

<?php

namespace Kaminski/Imiona;

use App\Http\Controllers\Controller;
use Carbon\Carbon;

class ImionaController extends Controller
{

    public function index($imie)
    {
        echo $imie;
    }

}

Tworzymy też plik routingu:

packages/kaminski/imiona/src/routers/web.php

<?php

Route::get('imiona/{imie}','Polcode\Payments\PaymentController@index');

Struktura stworzonego pakietu powinna przedstawiać się następująco. Tak więc powinna wyglądać struktura katalogów naszego pakietu:

Samo uruchomienie projektu i wywołanie odpowiedniego routingu zaowocuje:

Czyli oznacza to, iż nasz projekt działa.

Czas podsumowań. Ustalmy pewne fakty, mianowicie tworzenie nowego pakietu ograniczyło się do:

  • utworzenia katalogu packages/<vendor>/<packageName> z routingiem, kontolerem i Providerem,
  • zmiany linii w pliku config/app.php (dodanie Providera),
  • zmiany w głównym pliku composer.json (dodanie w PSR-4/autoload katalogu packages),
  • dump autoload przez composera.

Prawda, że niewiele? Może czasem warto zastanowić się, czy coś, co właśnie piszemy, nie przyda nam się przy okazji innych projektów? Może warto stworzyć osobny pakiet i choć trochę rozbić monolityczność projektowanej aplikacji?


Artykuł został pierwotnie opublikowany na blog.pawelkaminski.net. Zdjęcie główne artykułu pochodzi z unsplash.com.

Wraz z Tomaszem Gańskim jestem współtwórcą justjoin.it - największego job boardu dla polskiej branży IT. Portal daje tym samym największy wybór spośród branżowych stron na polskim rynku. Rozwijamy go organicznie, serdecznie zapraszam tam również i Ciebie :)

Podobne artykuły

[wpdevart_facebook_comment curent_url="https://justjoin.it/blog/jak-stworzyc-wlasny-package-w-laravel" order_type="social" width="100%" count_of_comments="8" ]