{"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 vorhanden ist. 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. Wenn Sie ein Kommando ausgef\u00fchrt haben, dann sehen sie im Visual Studio die neu erstellen Dateien: Selektieren sie [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":8087,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","_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}]}}