Generator modułu Laravel
Migracja, model, FormRequest, kontroler CRUD, trasy API, fabryka i testy Feature z jednej listy pól
-
1Wprowadź dane
Wpisz treść, wklej tekst lub załaduj plik z dysku. -
2Kliknij przycisk
Narzędzie natychmiast przetworzy Twoje dane w przeglądarce. -
3Pobierz wynik
Skopiuj gotowy tekst lub zapisz plik na urządzeniu.
return "Wynik gotowy w 0.1s";
}
Nazwa klasy w liczbie pojedynczej. Tabela i trasy powstaną z niej automatycznie.
Typy: string, text, decimal, integer, boolean, date, datetime, json. Reguły to zwykła walidacja Laravela rozdzielona znakiem |. Fragment default:wartość trafia do migracji.
Podgląd kodu odświeża się na bieżąco po zmianie pól i opcji.
Plików
Pól
Linii kodu
Tabela
Model Product, każdy plik ma własny przycisk kopiowania.
database/migrations/xxxx_xx_xx_xxxxxx_create_products_table.php
app/Models/Product.php
app/Http/Requests/StoreProductRequest.php
app/Http/Controllers/ProductController.php
routes/api.php (fragment)
database/factories/ProductFactory.php
tests/Feature/ProductTest.php
Ściąga: jak generator czyta pola i co z tego powstaje
Co zrobić z wynikiem
| Krok | Co zrobić | Polecenie |
|---|---|---|
| Migracja | Utwórz plik migracji i wklej wygenerowany kod | php artisan make:migration create_products_table |
| Baza danych | Zastosuj migracje | php artisan migrate |
| Model i request | Skopiuj pliki do wskazanych katalogów w app/ | — |
| Kontroler i trasy | Skopiuj kontroler, dopisz linię do routes/api.php (w Laravel 11+ plik tworzy install:api) | php artisan install:api |
| Testy | Skopiuj plik do tests/Feature i uruchom | php artisan test --filter=ProductTest |
Mapowanie typów pól
| Typ w polu | Kolumna w migracji | Cast w modelu | Wartość w fabryce |
|---|---|---|---|
| string | $table->string(nazwa) | — | fake()->words(3, true) |
| text | $table->text(nazwa) | — | fake()->paragraph() |
| decimal, float, double | $table->decimal(nazwa, 12, 2) | decimal:2 | fake()->randomFloat(2, 1, 1000) |
| integer, int | $table->integer(nazwa) | integer | fake()->numberBetween(1, 100) |
| boolean, bool | $table->boolean(nazwa) | boolean | fake()->boolean() |
| date | $table->date(nazwa) | date | fake()->date() |
| datetime, timestamp | $table->dateTime(nazwa) | datetime | fake()->dateTime() |
| json | $table->json(nazwa) | array | [] |
Na co uważać
Jak czytamy reguły
required daje kolumnę bez NULL, nullable lub brak reguły daje kolumnę z NULL. unique:tabela dodaje ->unique() w migracji, a default:wartość ustawia ->default() i nie trafia do reguł walidacji.
Nazwy tabeli i tras
Dla modelu Product tabela to products (konwencja Eloquent: snake_case w liczbie mnogiej), a zmienna w kontrolerze to $product. Nazwa zmiennej musi pasować do parametru trasy, inaczej nie zadziała route model binding.
Unikalność przy edycji
Ten sam FormRequest obsługuje zapis i aktualizację. Reguła unique zablokuje edycję rekordu bez zmiany wartości, dlatego przy aktualizacji dodaj Rule::unique(...)->ignore(...) albo osobny UpdateRequest. Metoda authorize() zwraca true, więc dodaj własną autoryzację.
Fabryka i testy
Fabryka zgaduje wartości z typu i reguł max, email, url, unique. Przy regułach takich jak in: lub exists: popraw ją ręcznie, inaczej testy store i update mogą zwrócić błąd walidacji.
Trasy API w Laravel 11 i 12
Świeża instalacja nie ma pliku routes/api.php. Polecenie php artisan install:api tworzy go i dodaje Sanctum. Trasy mają wtedy prefiks /api, tak jak w wygenerowanych testach.
Oceń to narzędzie:
Powiązane narzędzia
Inne narzędzia, które mogą Ci się przydaćGenerator modułu Laravel
Zamiast tworzyć siedem plików ręcznie, podaj nazwę modelu i listę pól, a generator modułu Laravel przygotuje spójny pakiet kodu zgodny z konwencjami frameworka: migrację, model, FormRequest, kontroler CRUD, trasę Route::apiResource, fabrykę i test Feature.
Podgląd kodu odświeża się przy każdej zmianie, a każdy plik ma osobny przycisk kopiowania (jest też „Kopiuj wszystkie pliki”). Na start możesz wczytać jeden z pięciu przykładów: Product, Post, Order, Customer lub Task. Przełącznikami wyłączysz migrację, soft deletes, kontroler z trasami API, fabrykę albo testy. Testy korzystają z fabryki, więc przy włączonych testach fabryka jest dołączana zawsze.
Format pól
Jedno pole w wierszu, trzy segmenty rozdzielone dwukropkiem:
nazwa: typ: reguły walidacji
Przykład:
name: string: required|max:255price: decimal: required|numeric|min:0is_active: boolean: default:truepublished_at: datetime: nullable
Reguły to zwykła walidacja Laravela rozdzielona znakiem |. Wyjątkiem jest default:wartość: trafia do migracji jako ->default() i nie jest przenoszony do reguł. Narzędzie przyjmuje do 40 pól i 4000 znaków. Kolumny id, created_at, updated_at i deleted_at pomija, bo Laravel tworzy je sam.
Generowane pliki
| Plik | Ścieżka (dla modelu Product) | Zawartość |
|---|---|---|
| Migracja | database/migrations/…_create_products_table.php | tabela z kolumnami, opcjonalnie softDeletes(), zawsze timestamps() |
| Model | app/Models/Product.php | $fillable, $casts, traity HasFactory i SoftDeletes (gdy włączone) |
| FormRequest | app/Http/Requests/StoreProductRequest.php | reguły walidacji z definicji, authorize() zwraca true |
| Kontroler | app/Http/Controllers/ProductController.php | index (paginacja po 20), store (kod 201), show, update, destroy (kod 204) |
| Trasy API | fragment routes/api.php | Route::apiResource('products', …) |
| Fabryka | database/factories/ProductFactory.php | wartości fake() dobrane do typu i reguł pola |
| Testy | tests/Feature/ProductTest.php | 5 testów feature: lista, tworzenie, podgląd, edycja i usunięcie |
Nazwa pliku migracji ma w miejscu daty znacznik xxxx_xx_xx_xxxxxx. Utwórz plik poleceniem php artisan make:migration create_products_table i wklej do niego kod. Bez kontrolera API generator tworzy jeden test, który sprawdza zapis rekordu przez fabrykę.
Jak generator zamienia definicję pola na kod Laravel
Generator czyta definicję pola linia po linii. Każdy wiersz dzieli na trzy segmenty: nazwę pola, typ oraz reguły walidacji. Nazwa trafia do migracji, modelu, FormRequestu i fabryki, typ decyduje o metodzie Blueprint, rzutowaniu i wartości testowej, a reguły (bez default:) są przenoszone do FormRequestu bez zmiany kolejności.
Typy pochodzą ze stałej listy z aliasami: float i double dają decimal, int daje integer, bool daje boolean, a timestamp daje dateTime. Nieznany typ zamienia się na string, a nad kodem pojawia się ostrzeżenie z numerem wiersza. Reguły wpływają też na migrację: required daje kolumnę NOT NULL, nullable albo brak required dodaje ->nullable(), a reguła zaczynająca się od unique dodaje ->unique().
Dalsza część jest powtarzalna. Tabela dostaje nazwę według konwencji Eloquent (snake_case w liczbie mnogiej, np. OrderItem to order_items), kontroler otrzymuje akcje index, store, show, update i destroy, trasy korzystają z Route::apiResource, a testy feature sprawdzają wszystkie pięć endpointów. Dzięki temu definicja pól jest jednym źródłem prawdy dla całego modułu.
Przykład krok po kroku: moduł produktu w pięciu polach
- Wpisz model Product i pięć pól: name: string: required|max:255, price: decimal: required|numeric|min:0, stock: integer: required|integer|min:0, published_at: datetime: nullable, metadata: json: nullable.
- Generator dzieli każdą linię na nazwę, typ i reguły. Tabela dostaje nazwę products, a zmienna w kontrolerze to $product.
- Migracja dostaje pięć kolumn:
string('name'),decimal('price', 12, 2),integer('stock'),dateTime('published_at')->nullable()ijson('metadata')->nullable(), a do tegosoftDeletes()itimestamps(). - Model uzupełnia listę fillable o pięć pól, a casts obejmują cztery z nich: price jako decimal:2, stock jako integer, published_at jako datetime i metadata jako array. Pole name nie wymaga rzutowania.
- StoreProductRequest zawiera pięć reguł w dokładnie takiej postaci, w jakiej je wpisano.
- Fabryka przygotowuje wartości dopasowane do typów:
words(3, true)dla name,randomFloat(2, 1, 1000)dla price,numberBetween(1, 100)dla stock,dateTime()dla published_at i pustą tablicę dla metadata.
Wynik: 7 plików, w tym test z pięcioma przypadkami. Test usuwania używa assertSoftDeleted, bo soft deletes są włączone; po ich wyłączeniu generator wstawia assertModelMissing.
Mapowanie typów w generatorze modułu Laravel
| Typ w definicji | Kolumna w migracji | Cast w modelu | Wartość w fabryce |
|---|---|---|---|
| string | string(nazwa) | — | words(3, true); safeEmail() przy regule email, url() przy url, lexify() przy max poniżej 30 |
| text | text(nazwa) | — | paragraph() |
| decimal, float, double | decimal(nazwa, 12, 2) | decimal:2 | randomFloat(2, 1, 1000) |
| integer, int | integer(nazwa) | integer | numberBetween(1, 100) |
| boolean, bool | boolean(nazwa) | boolean | boolean() |
| date | date(nazwa) | date | date() |
| datetime, timestamp | dateTime(nazwa) | datetime | dateTime() |
| json | json(nazwa) | array | [] |
Typ nie dodaje reguł walidacji. Jeśli Laravel ma sprawdzać liczbę, datę albo JSON, wpisz numeric, integer, date lub json w trzecim segmencie. Przy regule unique fabryka dostaje fake()->unique(), żeby testy nie trafiały na duplikaty.
Jak przygotować definicję pól, aby moduł był gotowy do pracy
- Trzymaj format nazwa: typ: reguły. Jedna linia opisuje jedno pole; wiersz bez typu, duplikat nazwy albo nazwa zaczynająca się od cyfry są pomijane z ostrzeżeniem.
- Używaj snake_case. Nazwy w stylu published_at i is_active są naturalne dla migracji, fillable i JSON-a zwracanego przez API. Znaki inne niż litery, cyfry i podkreślenie generator usuwa z nazwy.
- Dodawaj nullable świadomie. Pole bez
requiredstaje się w bazie nullable, nawet jeśli o tym nie myślałeś. Wartość obowiązkową oznaczrequired, a stałą wartość startową zapisz jakodefault:. - Dopisuj reguły liczbowe. Bez
numericlubintegerregułamin:0sprawdza w Laravelu długość tekstu, a nie wartość, więc przepuści liczbę ujemną. - Grupuj pola w kolejności formularza. Generator zachowuje kolejność definicji, więc łatwiej potem porównać migrację, FormRequest i fabrykę z rzeczywistym widokiem.
- Rozszerzaj moduł iteracyjnie: najpierw wygeneruj podstawowy zestaw pól, uruchom migrację i testy, a dopiero potem dodawaj kolejne kolumny i reguły.
Czego generator nie uwzględni
- Relacji między modelami. Na liście typów nie ma foreignId, więc klucze obce, relacje belongsTo i hasMany oraz tabele pivot trzeba dopisać ręcznie w migracji i modelu.
- Autoryzacji.
authorize()zwraca true, a kontroler nie ma Policies ani middleware. Trasy bezauth:sanctumsą publiczne, więc ochronę endpointów dodaj przed wdrożeniem. - Osobnego UpdateRequest. Ten sam FormRequest obsługuje zapis i aktualizację, a reguła
uniquezablokuje edycję rekordu bez zmiany wartości. Przy aktualizacji użyjRule::unique(...)->ignore(...)albo dopisz osobną klasę. - Typów spoza listy. Enum, uuid czy kolumny geometryczne generator zamieni na string z ostrzeżeniem; właściwą metodę Blueprint wpisz w migracji sam.
- Logiki biznesowej. Reguły są przenoszone literalnie, więc walidacja warunkowa, transakcje, zdarzenia i klasy JsonResource wymagają ręcznej pracy.
Najczęstsze pytania
Jakie typy pól obsługuje generator modułu Laravel?
string, text, decimal, integer, boolean, date, datetime i json oraz aliasy float, double, int, bool i timestamp. Inny typ zamieni się na string, a narzędzie pokaże ostrzeżenie.
Po co soft deletes?
Kolumna deleted_at pozwala „usuwać” rekordy bez fizycznego kasowania i przywracać je metodą restore(). Po wyłączeniu opcji model nie dostaje traitu SoftDeletes, a test usuwania sprawdza assertModelMissing.
Jak uruchomić testy?
Zapisz plik w tests/Feature i uruchom php artisan test --filter=ProductTest. Testy wołają adresy z prefiksem /api, więc w Laravel 11 i 12 najpierw wykonaj php artisan install:api, które tworzy routes/api.php.
Czy generator tworzy kontroler API i trasy API?
Tak, powstaje kontroler z metodami index, store, show, update i destroy oraz linia Route::apiResource do wklejenia w routes/api.php. Lista zwraca paginację po 20 rekordów, zapis kod 201, a usunięcie pustą odpowiedź 204.
Co wpisać w definicji pola, jeśli nie chcę walidacji?
Wpisz tylko nazwę i typ, np. note: string. Kolumna będzie nullable, a w FormRequest pole dostanie regułę nullable, dzięki czemu trafi do validated() i zapisze się przez create().
Czy generator modułu Laravel obsługuje relacje między tabelami?
Nie. Klucze obce, tabele pivot i metody relacji trzeba dopisać ręcznie w modelu i migracji.