{"id":9991,"date":"2024-04-19T09:03:29","date_gmt":"2024-04-19T07:03:29","guid":{"rendered":"https:\/\/via-internet.de\/blog\/?p=9991"},"modified":"2024-04-19T17:49:18","modified_gmt":"2024-04-19T15:49:18","slug":"laravel-erstellen-eines-api-backend","status":"publish","type":"post","link":"https:\/\/via-internet.de\/blog\/2024\/04\/19\/laravel-erstellen-eines-api-backend\/","title":{"rendered":"Laravel | Erstellen eines API Backend"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\" id=\"tl-dr\">TL;DR<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Der Code f\u00fcr die in diesem Post erstelle Anwendung liegt <a href=\"https:\/\/github.com\/r14r\/Laravel_Tutorial_Erstellen-eines-API-Backend\" data-type=\"link\" data-id=\"https:\/\/github.com\/r14r\/Laravel_Tutorial_Arbeiten-mit-htmx\">hier<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Notwendige Komponenten eines API Backend<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr die Umsetzung eines API Backend ben\u00f6tigen wir in unserer Laravel App mehrere Komponenten:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ein <code>Model<\/code>, das beschreibt, wir die Daten aussehen, die unsere API verwendet<\/li>\n\n\n\n<li>ein <code>Controller<\/code>, der den Programmcode beinhaltet, m die einzelnen Aktionen (Create, Read, Update, Delete, ..) auszuf\u00fchren<\/li>\n\n\n\n<li>weitere Komponenten, um die Nutzung zu erleichern\n<ul class=\"wp-block-list\">\n<li>ein <code>Seeder<\/code> um die Datenbank mit definierte Werten zu f\u00fcllen<\/li>\n\n\n\n<li>ein <code>Migrationsskript<\/code>, um die notwendigen Datenbankeintr\u00e4ge (Tabelle, Spalten) zu erstellen<\/li>\n\n\n\n<li><code>Testskripte<\/code>, um unseren Controller und weitere Kompoentne zu pr\u00fcfen<\/li>\n\n\n\n<li><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Hinweis<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Vorab ein Hinweis: jeder der nachfolgenden Kommandos erstellen Komponenten in Form von Dateien. Ein erneutes Erstellen wird fehlschlagen, da die entsprechende Datei schon vorhanden ist.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Um mit den verschiedenen Kommandos zu experimentieren, verwenden sie am besten eine Funktionalit\u00e4t von Git, die es ihnen erm\u00f6glicht de Status zur\u00fcckzusetzen, also Dateien zu l\u00f6schen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn Sie ein Kommando ausgef\u00fchrt haben, dann sehen sie im Visual Studio die neu erstellen Dateien:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"845\" height=\"623\" src=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-09.43.23.png\" alt=\"\" class=\"wp-image-9998\" style=\"width:430px;height:auto\" srcset=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-09.43.23.png 845w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-09.43.23-300x221.png 300w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-09.43.23-768x566.png 768w\" sizes=\"auto, (max-width: 845px) 100vw, 845px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Selektieren sie die neu erstellten Dateien und w\u00e4hlen sie dann die Option Discard Changes:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"738\" src=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/image-1-1024x738.png\" alt=\"\" class=\"wp-image-10000\" style=\"width:441px;height:auto\" srcset=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/image-1-1024x738.png 1024w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/image-1-300x216.png 300w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/image-1-768x553.png 768w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/image-1.png 1382w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Komponenten erstellen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Jede dieser Komponenten kann einzeln erstellt werden, z. B mit<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f php artisan make:model Post\n\u276f php artisan make:controller PostController<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Hierbei gilt es nat\u00fcrlich, die Abh\u00e4ngigkeiten zu ber\u00fccksichtigen. Der Controller muss mit dem Model arbeiten und sollte daher die gleichen Felder und Feldnamen verwendet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Einfacher ist es daher, das Laravel diese Abh\u00e4ngigkeiten kennt und entsprechend verwendet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bei der Erstellung des Models k\u00f6nnen wir auch einen dazu passenden Controller und weitere Komponenten erstellen:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"1\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f php artisan make:model Post --migration --controller --seed --api --requests --pest\n\n   INFO  Model and test [app\/Models\/Post.php] created successfully.\n   INFO  Migration [database\/migrations\/2024_04_19_073500_create_posts_table.php] created successfully.\n   INFO  Seeder [database\/seeders\/PostSeeder.php] created successfully.\n   INFO  Request [app\/Http\/Requests\/StorePostRequest.php] created successfully.\n   INFO  Request [app\/Http\/Requests\/UpdatePostRequest.php] created successfully.\n   INFO  Controller and test [app\/Http\/Controllers\/PostController.php] created successfully.<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dies erstellt die Dateien<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\tapp\/Http\/Controllers\/PostController.php\n\tapp\/Http\/Requests\/\n\tapp\/Models\/Post.php\n\tdatabase\/migrations\/2024_04_19_073500_create_posts_table.php\n\tdatabase\/seeders\/PostSeeder.php\n\ttests\/Feature\/Http\/\n\ttests\/Feature\/Models\/<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Und um alle m\u00f6glichen Komponenten zu erstellen, verwenden wir den nachfolgenden Befehl:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f php artisan make:model Post --all --pest\n\n   INFO  Model and test [app\/Models\/Post.php] created successfully.\n   INFO  Factory [database\/factories\/PostFactory.php] created successfully.\n   INFO  Migration [database\/migrations\/2024_04_19_073800_create_posts_table.php] created successfully.\n   INFO  Seeder [database\/seeders\/PostSeeder.php] created successfully.\n   INFO  Request [app\/Http\/Requests\/StorePostRequest.php] created successfully.\n   INFO  Request [app\/Http\/Requests\/UpdatePostRequest.php] created successfully.\n   INFO  Controller and test [app\/Http\/Controllers\/PostController.php] created successfully.\n   INFO  Policy [app\/Policies\/PostPolicy.php] created successfully.<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dies erstellt die Dateien<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\tapp\/Http\/Controllers\/PostController.php\n\tapp\/Http\/Requests\/\n\tapp\/Models\/Post.php\n\tapp\/Policies\/PostPolicy.php\n\tdatabase\/factories\/PostFactory.php\n\tdatabase\/migrations\/2024_04_19_075242_create_posts_table.php\n\tdatabase\/seeders\/PostSeeder.php\n\ttests\/Feature\/Http\/\n\ttests\/Feature\/Models\/<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Jetzt aber genug der Einf\u00fchrung. Lassen Sie uns mit dem Erstellen des API Backend beginnen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sollten Sie Komponentne erstellen haben, dann l\u00f6schen Sie diese wie beschrieben.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"laravel-okosystem\">Einrichten der Starter-App<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Erstellen der Starter App. In <a href=\"https:\/\/via-internet.de\/blog\/2024\/04\/10\/laravel-erstellen-einer-starter-app\/\" data-type=\"link\" data-id=\"https:\/\/via-internet.de\/blog\/2024\/04\/10\/laravel-erstellen-einer-starter-app\/\">diesem<\/a> Post beschreibe ich, wie sie eine Starter-App erstellen und die grundlegenden Anpassungen durchf\u00fchren k\u00f6nnen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sie k\u00f6nnen die Starter App auch mit dem Laravel-Installer erstellen:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f laravel new App   --jet \n                   --api \n                   --database sqlite \n                   --stack livewire  \n                   --teams \n                   --dark \n                   --verification \n                   --git \n                   --pest<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Oder auch direkt mit dem dazugeh\u00f6rigen Repository starten:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f git clone https:\/\/github.com\/r14r\/Laravel_Tutorial_Erstellen-einer-Starter-App App<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f cd App\n\u276f composer install\n\u276f npm install\n\u276f npm run build<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f cp .env.example  .env\n\u276f php artisan migrate\n\u276f php artisan key:generate<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f php artisan serve<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"701\" src=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/laravel_startpage-1024x701.png\" alt=\"\" class=\"wp-image-9914\" srcset=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/laravel_startpage-1024x701.png 1024w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/laravel_startpage-300x205.png 300w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/laravel_startpage-768x526.png 768w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/laravel_startpage-1536x1051.png 1536w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/laravel_startpage-2048x1402.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Erstellen der erforderlichen Komponenten<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f php artisan make:model Post --all --pest\n\n   INFO  Model and test [app\/Models\/Post.php] created successfully.\n   INFO  Factory [database\/factories\/PostFactory.php] created successfully.\n   INFO  Migration [database\/migrations\/2024_04_19_075600_create_posts_table.php] created successfully.\n   INFO  Seeder [database\/seeders\/PostSeeder.php] created successfully.\n   INFO  Request [app\/Http\/Requests\/StorePostRequest.php] created successfully.\n   INFO  Request [app\/Http\/Requests\/UpdatePostRequest.php] created successfully.\n   INFO  Controller and test [app\/Http\/Controllers\/PostController.php] created successfully.\n   INFO  Policy [app\/Policies\/PostPolicy.php] created successfully.<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Anpassen des Routing<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Erweiteren Sie die Datei <code>routes\/api.php<\/code> um den nachfolgenden Programmcode (Zeile 6 und 12-14):<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"6,12-14\" data-enlighter-linenumbers=\"true\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;?php\n\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Route;\n\nuse App\\Http\\Controllers\\PostController;\n\nRoute::get('\/user', function (Request $request) {\n    return $request->user();\n})->middleware('auth:sanctum');\n\nRoute::get('\/post',         [PostController::class, 'index']);\nRoute::post('\/post',        [PostController::class, 'store']);\nRoute::delete('\/post\/{id}', [PostController::class, 'destroy']);\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Pr\u00fcfen wir die von Laravel erkannten Routen:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"176\" src=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.25.06-1024x176.png\" alt=\"\" class=\"wp-image-10027\" srcset=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.25.06-1024x176.png 1024w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.25.06-300x52.png 300w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.25.06-768x132.png 768w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.25.06-1536x265.png 1536w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.25.06-2048x353.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Erster Test<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pr\u00fcfen wir die bisherigen Schritte. Starten sie Laravel und \u00f6ffnen sie einen Browser unter der Adresse <a href=\"http:\/\/127.0.0.1:8000\/api\/get\">http:\/\/127.0.0.1:8000\/api\/post<\/a><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f php artisan serve\n\n   INFO  Server running on [http:\/\/127.0.0.1:8000].\n\n  Press Ctrl+C to stop the server<\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1359\" height=\"206\" src=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.28.15-1.png\" alt=\"\" class=\"wp-image-10034\" srcset=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.28.15-1.png 1359w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.28.15-1-300x45.png 300w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.28.15-1-1024x155.png 1024w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.28.15-1-768x116.png 768w\" sizes=\"auto, (max-width: 1359px) 100vw, 1359px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Sie sehen, das sie nichts sehen. Was zu erwarten war, da die API noch keine Daten hat und daher auch keine Daten liefern kann.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Datenbank<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Tabelle erstellen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Erweitern wir als n\u00e4chstes das Migrations-Skript, um die notwendige Tabelle zu erstellen und mit Werten zu f\u00fcllen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die entsprechende Datei ist<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">database\/migrations\/2024_04_19_075600_create_posts_table.php <\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Der genaue Name kann dabei bei Ihnen abweichen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Passen sie die Funktion <code>up()<\/code> an:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public function up(): void\n{\n    Schema::create('posts', function (Blueprint $table) {\n        $table->id();\n        $table->string('title');\n        $table->text('content');\n        $table->timestamps();\n    });\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Die neuen Felder werden \u00fcber eine Migration in der Datenbank erstellt:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f php artisan migrate<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"105\" src=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-16.14.18-1024x105.png\" alt=\"\" class=\"wp-image-10012\" srcset=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-16.14.18-1024x105.png 1024w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-16.14.18-300x31.png 300w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-16.14.18-768x79.png 768w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-16.14.18-1536x158.png 1536w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-16.14.18-2048x211.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Wir kontrollieren, ob die Tabelle richtig erstellt wurde:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"4\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f php artisan db\nSQLite version 3.37.0 2021-12-09 01:34:53\nEnter \".help\" for usage hints.\nsqlite> PRAGMA table_info(posts);\n0|id|INTEGER|1||1\n1|title|varchar|1||0\n2|content|TEXT|1||0\n3|created_at|datetime|0||0\n4|updated_at|datetime|0||0\nsqlite> .quit<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Tabelle f\u00fcllen mit Hilfe eines Seeder<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Erstellen Sie den Seeder, falls die Datei <code>database\/seeders\/PostSeeder.php<\/code> nicht vorhanden ist:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">php artisan make:seeder PostSeeder<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ersetzen Sie den Inhalt mit dem nachfolgenden Programmcode:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;?php\n\nnamespace Database\\Seeders;\n\nuse Illuminate\\Support\\Facades\\DB;\n\nuse Illuminate\\Database\\Console\\Seeds\\WithoutModelEvents;\nuse Illuminate\\Database\\Seeder;\n\nclass PostSeeder extends Seeder\n{\n    static $posts = [\n        ['title' => 'Summer Health', 'content' => 'Stay hydrated!'],\n        ['title' => 'Pasta Recipe',  'content' => 'Tomato base'],\n        ['title' => 'Decor Ideas',   'content' => 'Go minimal'],\n        ['title' => 'Python Tips',   'content' => 'Use lists']\n    ];\n\n    public function run(): void\n    {\n        foreach (self::$posts as $post) {\n            DB::table('posts')->insert([\n                'title' => $post['title'], 'content' => $post['content']\n            ]);\n        }\n    }\n}\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Starten Sie den Seeder:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f php artisan db:seed --class PostSeeder<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"70\" src=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-16.58.20-1024x70.png\" alt=\"\" class=\"wp-image-10016\" srcset=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-16.58.20-1024x70.png 1024w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-16.58.20-300x20.png 300w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-16.58.20-768x52.png 768w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-16.58.20-1536x105.png 1536w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-16.58.20-2048x140.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Hinweis: Sie k\u00f6nnen diesen Seeder auch die den generellen DatabaseSeeder mit aufnehmen, so das der Name des Seeders nicht mit angegeben werden muss.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcgen die in der Datei <code>database\/seeders\/DatabaseSeeder.php<\/code> den nachfolgenden Programmcode hinzu:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$this->call([\n    PostSeeder::class,\n]);<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"374\" src=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-16.59.59-1024x374.png\" alt=\"\" class=\"wp-image-10017\" srcset=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-16.59.59-1024x374.png 1024w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-16.59.59-300x110.png 300w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-16.59.59-768x281.png 768w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-16.59.59.png 1128w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Starten Sie den Seeder:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f php artisan db:seed<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"122\" src=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.02.11-1024x122.png\" alt=\"\" class=\"wp-image-10018\" srcset=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.02.11-1024x122.png 1024w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.02.11-300x36.png 300w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.02.11-768x92.png 768w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.02.11-1536x183.png 1536w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.02.11-2048x244.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Bearbeiten der Komponenten<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Model<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Erweitern Sie die Datei <code>app\/Models\/Post.php<\/code> um die zus\u00e4tzlichen Felder:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">protected $fillable = ['title', 'content', 'created_at', 'updated_at'];<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"215\" src=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-16.23.49-1024x215.png\" alt=\"\" class=\"wp-image-10015\" srcset=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-16.23.49-1024x215.png 1024w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-16.23.49-300x63.png 300w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-16.23.49-768x161.png 768w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-16.23.49.png 1268w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Testing<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr die Operationen <code>GET<\/code> (Eintr\u00e4ge anzeigen), <code>POST<\/code> (neuen Eintrag erstellen) und <code>DELETE<\/code> (Eintrag l\u00f6schen) stehen jeweils eigene URLs zur Verf\u00fcgung. Am einfachsten ist der Test der URLs mit <a href=\"https:\/\/www.postman.com\/downloads\/\" data-type=\"link\" data-id=\"https:\/\/www.postman.com\/downloads\/\">Postman<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Testen mit Postman<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">GET<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">http:\/\/127.0.0.1:8000\/api\/get<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"898\" src=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.12.37-1024x898.png\" alt=\"\" class=\"wp-image-10023\" srcset=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.12.37-1024x898.png 1024w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.12.37-300x263.png 300w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.12.37-768x673.png 768w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.12.37-1536x1346.png 1536w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.12.37-2048x1795.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">POST<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">http:\/\/127.0.0.1:8000\/api\/post<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"648\" src=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.13.21-1024x648.png\" alt=\"\" class=\"wp-image-10024\" srcset=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.13.21-1024x648.png 1024w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.13.21-300x190.png 300w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.13.21-768x486.png 768w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.13.21-1536x972.png 1536w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.13.21-2048x1295.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">DELETE<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">http:\/\/127.0.0.1:8000\/api\/delete\/6        <\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"599\" src=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.14.39-1024x599.png\" alt=\"\" class=\"wp-image-10025\" srcset=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.14.39-1024x599.png 1024w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.14.39-300x176.png 300w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.14.39-768x450.png 768w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.14.39-1536x899.png 1536w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2024\/04\/Bildschirmfoto-2024-04-19-um-17.14.39-2048x1199.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Testen mit curl in der Kommandozeile<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">GET<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"1\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f curl http:\/\/127.0.0.1:8000\/api\/post\n[{\"id\":1,\"title\":\"Summer Health\",\"content\":\"Stay hydrated!\",\"created_at\":null,\"updated_at\":null},{\"id\":2,\"title\":\"Pasta Recipe\",\"content\":\"Tomato base\",\"created_at\":null,\"updated_at\":null},{\"id\":3,\"title\":\"Decor Ideas\",\"content\":\"Go minimal\",\"created_at\":null,\"updated_at\":null},{\"id\":4,\"title\":\"Python Tips\",\"content\":\"Use lists\",\"created_at\":null,\"updated_at\":null}]<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">POST<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"1\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f curl -X POST  http:\/\/127.0.0.1:8000\/api\/post -H \"Content-Type: application\/json\" -d '{ \"title\": \"Neuer Titel\", \"content\": \"Neuer Inhalt!\" }'\n{\"title\":\"Neuer Titel\",\"content\":\"Neuer Inhalt!\",\"updated_at\":\"2024-04-19T15:48:22.000000Z\",\"created_at\":\"2024-04-19T15:48:22.000000Z\",\"id\":6}\n<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">DELETE<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"1\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f curl -X DELETE http:\/\/127.0.0.1:8000\/api\/post\/6\n{\"message\":\"Post deleted\"}        <\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>TL;DR Der Code f\u00fcr die in diesem Post erstelle Anwendung liegt hier. Notwendige Komponenten eines API Backend F\u00fcr die Umsetzung eines API Backend ben\u00f6tigen wir in unserer Laravel App mehrere Komponenten: Hinweis Vorab ein Hinweis: jeder der nachfolgenden Kommandos erstellen Komponenten in Form von Dateien. Ein erneutes Erstellen wird fehlschlagen, da die entsprechende Datei schon [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":8087,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[99,57],"tags":[],"class_list":["post-9991","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-laravel","category-php"],"jetpack_featured_media_url":"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2021\/07\/Laravel-Installation-einer-Beispielanwendung.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/posts\/9991","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/comments?post=9991"}],"version-history":[{"count":11,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/posts\/9991\/revisions"}],"predecessor-version":[{"id":10035,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/posts\/9991\/revisions\/10035"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/media\/8087"}],"wp:attachment":[{"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/media?parent=9991"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/categories?post=9991"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/tags?post=9991"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}