Sprytne Okazje — promocje, kody rabatowe i wyprzedaże

Generator modułu Laravel

Migracja, model, FormRequest, kontroler CRUD, trasy API, fabryka i testy Feature z jednej listy pól

Bezpieczne (SSL)
Przetwarzanie Lokalne
100% Darmowe
Instrukcja
  • 1
    Wprowadź dane
    Wpisz treść, wklej tekst lub załaduj plik z dysku.
  • 2
    Kliknij przycisk
    Narzędzie natychmiast przetworzy Twoje dane w przeglądarce.
  • 3
    Pobierz wynik
    Skopiuj gotowy tekst lub zapisz plik na urządzeniu.
function runTool() {
  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

7

Pól

5

Linii kodu

188

Tabela

products

Model Product, każdy plik ma własny przycisk kopiowania.

database/migrations/xxxx_xx_xx_xxxxxx_create_products_table.php

<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; return new class extends Migration { public function up(): void { Schema::create('products', function (Blueprint $table) { $table->id(); $table->string('name'); $table->decimal('price', 12, 2); $table->text('description')->nullable(); $table->boolean('is_active')->default(true); $table->dateTime('published_at')->nullable(); $table->softDeletes(); $table->timestamps(); }); } public function down(): void { Schema::dropIfExists('products'); } };

app/Models/Product.php

<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; class Product extends Model { use HasFactory, SoftDeletes; protected $fillable = [ 'name', 'price', 'description', 'is_active', 'published_at', ]; protected $casts = [ 'price' => 'decimal:2', 'is_active' => 'boolean', 'published_at' => 'datetime', ]; }

app/Http/Requests/StoreProductRequest.php

<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class StoreProductRequest extends FormRequest { public function authorize(): bool { return true; } public function rules(): array { return [ 'name' => 'required|max:255', 'price' => 'required|numeric|min:0', 'description' => 'nullable', 'is_active' => 'nullable', 'published_at' => 'nullable', ]; } }

app/Http/Controllers/ProductController.php

<?php namespace App\Http\Controllers; use App\Http\Requests\StoreProductRequest; use App\Models\Product; class ProductController extends Controller { public function index() { return Product::query()->latest()->paginate(20); } public function store(StoreProductRequest $request) { return response()->json(Product::create($request->validated()), 201); } public function show(Product $product) { return $product; } public function update(StoreProductRequest $request, Product $product) { $product->update($request->validated()); return $product; } public function destroy(Product $product) { $product->delete(); return response()->noContent(); } }

routes/api.php (fragment)

Route::apiResource('products', \App\Http\Controllers\ProductController::class);

database/factories/ProductFactory.php

<?php namespace Database\Factories; use App\Models\Product; use Illuminate\Database\Eloquent\Factories\Factory; class ProductFactory extends Factory { protected $model = Product::class; public function definition(): array { return [ 'name' => fake()->words(3, true), 'price' => fake()->randomFloat(2, 1, 1000), 'description' => fake()->paragraph(), 'is_active' => fake()->boolean(), 'published_at' => fake()->dateTime(), ]; } }

tests/Feature/ProductTest.php

<?php namespace Tests\Feature; use App\Models\Product; use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; class ProductTest extends TestCase { use RefreshDatabase; public function test_index_returns_paginated_list(): void { Product::factory()->count(3)->create(); $this->getJson('/api/products')->assertOk()->assertJsonStructure(['data']); } public function test_store_creates_record(): void { $payload = Product::factory()->make()->toArray(); $this->postJson('/api/products', $payload)->assertCreated(); } public function test_show_returns_record(): void { $record = Product::factory()->create(); $this->getJson('/api/products/' . $record->id)->assertOk(); } public function test_update_changes_record(): void { $record = Product::factory()->create(); $payload = Product::factory()->make()->toArray(); $this->putJson('/api/products/' . $record->id, $payload)->assertOk(); } public function test_destroy_deletes_record(): void { $record = Product::factory()->create(); $this->deleteJson('/api/products/' . $record->id)->assertNoContent(); $this->assertSoftDeleted($record); } }

Ściąga: jak generator czyta pola i co z tego powstaje

Co zrobić z wynikiem

Kolejność wdrożenia wygenerowanych plików
KrokCo 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 pola a wygenerowany kod
Typ w poluKolumna w migracjiCast w modeluWartość 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:255
price: decimal: required|numeric|min:0
is_active: boolean: default:true
published_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ść
Migracjadatabase/migrations/…_create_products_table.phptabela z kolumnami, opcjonalnie softDeletes(), zawsze timestamps()
Modelapp/Models/Product.php$fillable, $casts, traity HasFactory i SoftDeletes (gdy włączone)
FormRequestapp/Http/Requests/StoreProductRequest.phpreguły walidacji z definicji, authorize() zwraca true
Kontrolerapp/Http/Controllers/ProductController.phpindex (paginacja po 20), store (kod 201), show, update, destroy (kod 204)
Trasy APIfragment routes/api.phpRoute::apiResource('products', …)
Fabrykadatabase/factories/ProductFactory.phpwartości fake() dobrane do typu i reguł pola
Testytests/Feature/ProductTest.php5 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

  1. 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.
  2. Generator dzieli każdą linię na nazwę, typ i reguły. Tabela dostaje nazwę products, a zmienna w kontrolerze to $product.
  3. Migracja dostaje pięć kolumn: string('name'), decimal('price', 12, 2), integer('stock'), dateTime('published_at')->nullable() i json('metadata')->nullable(), a do tego softDeletes() i timestamps().
  4. 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.
  5. StoreProductRequest zawiera pięć reguł w dokładnie takiej postaci, w jakiej je wpisano.
  6. 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 definicjiKolumna w migracjiCast w modeluWartość w fabryce
stringstring(nazwa)—words(3, true); safeEmail() przy regule email, url() przy url, lexify() przy max poniżej 30
texttext(nazwa)—paragraph()
decimal, float, doubledecimal(nazwa, 12, 2)decimal:2randomFloat(2, 1, 1000)
integer, intinteger(nazwa)integernumberBetween(1, 100)
boolean, boolboolean(nazwa)booleanboolean()
datedate(nazwa)datedate()
datetime, timestampdateTime(nazwa)datetimedateTime()
jsonjson(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 required staje się w bazie nullable, nawet jeśli o tym nie myślałeś. Wartość obowiązkową oznacz required, a stałą wartość startową zapisz jako default:.
  • Dopisuj reguły liczbowe. Bez numeric lub integer reguła min:0 sprawdza 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 bez auth:sanctum są publiczne, więc ochronę endpointów dodaj przed wdrożeniem.
  • Osobnego UpdateRequest. Ten sam FormRequest obsługuje zapis i aktualizację, a reguła unique zablokuje edycję rekordu bez zmiany wartości. Przy aktualizacji użyj Rule::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.

Zainstaluj Webp.pl Miej narzędzia we własnej kieszeni!