{"id":24,"date":"2024-04-02T05:53:49","date_gmt":"2024-04-02T05:53:49","guid":{"rendered":"https:\/\/rikiag.com\/blog\/?p=24"},"modified":"2024-04-02T06:05:27","modified_gmt":"2024-04-02T06:05:27","slug":"restful-api-laravel-11","status":"publish","type":"post","link":"https:\/\/rikiag.com\/blog\/read\/restful-api-laravel-11\/","title":{"rendered":"Restful API Laravel 11"},"content":{"rendered":"\n<p>Pada tutorial kali ini, kita akan mempelajari tentang pembuatan RESTful API di Laravel 11, untuk pemula. Tutorial ini akan menerangkan langkah-langkah awal menginstall Laravel 11 hingga pengujian API yang telah dibuat. Selama proses pembuatan API, kita juga akan belajar cara mengupload gambar di Laravel 11. Selain itu, kita akan memanfaatkan fitur bawaan Laravel yang dikenal sebagai API Resources. Dengan menggunakan fitur ini, kita dapat dengan mudah dan cepat menampilkan data dari model ke format JSON.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Membuat Project Laravel 11<\/h2>\n\n\n\n<p>Tahapan awal yang perlu dilakukan adalah menginstal Composer pada komputer. Untuk menginstal Composer, kalian dapat mengikuti panduan yang disediakan oleh situs resminya <a href=\"https:\/\/getcomposer.org\/download\/\" target=\"_blank\" rel=\"noreferrer noopener\">di sini<\/a>.<\/p>\n\n\n\n<p>Jika composer telah terinstall, maka kita dapat membuat sebuah projek laravel baru dengan menggunakan perintah berikut pada terminal\/CMD.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1\">terminal\/CMD<\/span><span role=\"button\" tabindex=\"0\" data-code=\"composer create-project --prefer-dist laravel\/laravel:^11.0 laravel11-restapi\" style=\"color:#272822;display:none;background-color:#F8F8F2\" aria-label=\"Copy\" data-copied-text=\"Copied!\" data-has-text-button=\"textSimple\" data-inside-header-type=\"simpleString\" aria-live=\"polite\" class=\"code-block-pro-copy-button\"><span class=\"cbp-btn-text\">Copy<\/span><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F8F8F2\">composer create-project --prefer-dist laravel\/laravel:^11.0 laravel11-restapi<\/span><\/span><\/code><\/pre><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"655\" height=\"400\" src=\"https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api-instalasi-laravel-11.webp\" alt=\"\" class=\"wp-image-37\" srcset=\"https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api-instalasi-laravel-11.webp 655w, https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api-instalasi-laravel-11-300x183.webp 300w\" sizes=\"auto, (max-width: 655px) 100vw, 655px\" \/><\/figure>\n<\/div>\n\n\n<p>Dalam beberapa kasus, instalasi laravel 11 akan gagal dan menampilkan error seperti berikut.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"655\" height=\"799\" src=\"https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api-error-sqlite.webp\" alt=\"\" class=\"wp-image-38\" srcset=\"https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api-error-sqlite.webp 655w, https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api-error-sqlite-246x300.webp 246w\" sizes=\"auto, (max-width: 655px) 100vw, 655px\" \/><\/figure>\n<\/div>\n\n\n<p>Hal ini disebabkan karena secara <em>default<\/em>, laravel 11 menggunakan <strong>sqlite <\/strong>sebagai driver database default. Untuk menghilangkan error ini, bisa dengan mengaktifkan ekstensi <code>pdo_sqlite <\/code>pada php nya. Jika ekstensi  <code>pdo_sqlite <\/code>pada php sudah diaktifkan, maka proses instalasi tidak akan error. Kalian juga bisa mengabaikan error ini karena nanti kita akan menggunakan <strong>mysql <\/strong>sebagai dirver database nya.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"655\" height=\"495\" src=\"https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api-instalasi-laravel-11-success.webp\" alt=\"\" class=\"wp-image-39\" srcset=\"https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api-instalasi-laravel-11-success.webp 655w, https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api-instalasi-laravel-11-success-300x227.webp 300w\" sizes=\"auto, (max-width: 655px) 100vw, 655px\" \/><\/figure>\n<\/div>\n\n\n<p>Sekarang kita dapat masuk ke dalam folder project dan menjalankan project laravel 11 yang baru kita install.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1\">terminal\/CMD<\/span><span role=\"button\" tabindex=\"0\" data-code=\"cd laravel11-restapi\nphp artisan serve\" style=\"color:#272822;display:none;background-color:#F8F8F2\" aria-label=\"Copy\" data-copied-text=\"Copied!\" data-has-text-button=\"textSimple\" data-inside-header-type=\"simpleString\" aria-live=\"polite\" class=\"code-block-pro-copy-button\"><span class=\"cbp-btn-text\">Copy<\/span><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F8F8F2\">cd laravel11-restapi<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">php artisan serve<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Perintah tersebut digunakan untuk menjalankan server local Laravel. Jika berhasil, proyek kita akan berjalan di localhost dengan port 8000. Kalian dapat membukanya di browser dengan mengetikkan http:\/\/localhost:8000. Jika berhasil, akan ditampilkan hasil seperti berikut ini.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"655\" height=\"495\" src=\"https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/Screenshot-2024-04-02-090546.png\" alt=\"\" class=\"wp-image-40\" srcset=\"https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/Screenshot-2024-04-02-090546.png 655w, https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/Screenshot-2024-04-02-090546-300x227.png 300w\" sizes=\"auto, (max-width: 655px) 100vw, 655px\" \/><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"832\" src=\"https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/Screenshot-2024-04-02-090735-1024x832.png\" alt=\"\" class=\"wp-image-41\" srcset=\"https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/Screenshot-2024-04-02-090735-1024x832.png 1024w, https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/Screenshot-2024-04-02-090735-300x244.png 300w, https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/Screenshot-2024-04-02-090735-768x624.png 768w, https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/Screenshot-2024-04-02-090735.png 1208w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p><strong>Menjalankan Storange Link<\/strong><\/p>\n\n\n\n<p>Karena kita akan mengupload gambar, maka kita perlu menjalankan perintah <code>storage:link<\/code> di Laravel. Hal ini kita lakukan agar nantinya kita dapat mengakses file yang telah kita upload pada Projek Laravel. Silahkan mengetik perintah berikut pada terminal\/CMD dan pastikan kalian berada pada folder projek laravel.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1\">terminal\/CMD<\/span><span role=\"button\" tabindex=\"0\" data-code=\"php artisan storage:link\" style=\"color:#272822;display:none;background-color:#F8F8F2\" aria-label=\"Copy\" data-copied-text=\"Copied!\" data-has-text-button=\"textSimple\" data-inside-header-type=\"simpleString\" aria-live=\"polite\" class=\"code-block-pro-copy-button\"><span class=\"cbp-btn-text\">Copy<\/span><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F8F8F2\">php artisan storage:link<\/span><\/span><\/code><\/pre><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"655\" height=\"267\" src=\"https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api-php-artisan-storage-link.webp\" alt=\"\" class=\"wp-image-45\" srcset=\"https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api-php-artisan-storage-link.webp 655w, https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api-php-artisan-storage-link-300x122.webp 300w\" sizes=\"auto, (max-width: 655px) 100vw, 655px\" \/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">Membuat Model dan Migration<\/h2>\n\n\n\n<p>Untuk membuat file Model dan Migration. kita dapat menjalankan perintah berikut pada terminal\/CMD.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1\">terminal\/CMD<\/span><span role=\"button\" tabindex=\"0\" data-code=\"php artisan make:model Post -m\" style=\"color:#272822;display:none;background-color:#F8F8F2\" aria-label=\"Copy\" data-copied-text=\"Copied!\" data-has-text-button=\"textSimple\" data-inside-header-type=\"simpleString\" aria-live=\"polite\" class=\"code-block-pro-copy-button\"><span class=\"cbp-btn-text\">Copy<\/span><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F8F8F2\">php artisan make:model Post -m<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Jika berhasil, maka akan ada 2 file baru pada folder Model dan Migration.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>app\/Models\/Post.php<\/li>\n\n\n\n<li>database\/migrations\/ xxx_xx_xx_xxxxxx_create_posts_table.php<\/li>\n<\/ol>\n\n\n\n<p><strong><em>untuk nama file migration akan random sesuai waktu pembuatannya.<\/em><\/strong><\/p>\n\n\n\n<p>Kemudian kita dapat mengubah file migration untuk menambahkan <em>Field <\/em>\/ Kolom pada method<code> up<\/code>.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers cbp-highlight-hover\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-start:9;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(253, 253, 237, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1\">xx_create_posts_table.php<\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/**\n* Run the migrations.\n*\/\npublic function up(): void\n{\n    Schema::create('posts', function (Blueprint $table) {\n        $table-&gt;id();\n        $table-&gt;string('title');\n        $table-&gt;string('image');\n        $table-&gt;text('content');\n        $table-&gt;timestamps();\n    });\n}\n\" style=\"color:#272822;display:none;background-color:#F8F8F2\" aria-label=\"Copy\" data-copied-text=\"Copied!\" data-has-text-button=\"textSimple\" data-inside-header-type=\"simpleString\" aria-live=\"polite\" class=\"code-block-pro-copy-button\"><span class=\"cbp-btn-text\">Copy<\/span><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #88846F\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">* Run the migrations.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">*\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">public<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">function<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">up<\/span><span style=\"color: #F8F8F2\">()<\/span><span style=\"color: #F92672\">:<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">void<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">Schema<\/span><span style=\"color: #F92672\">::<\/span><span style=\"color: #A6E22E\">create<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&#39;posts&#39;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #66D9EF; font-style: italic\">function<\/span><span style=\"color: #F8F8F2\"> (<\/span><span style=\"color: #66D9EF; font-style: italic\">Blueprint<\/span><span style=\"color: #F8F8F2\"> $table) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        $table<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #A6E22E\">id<\/span><span style=\"color: #F8F8F2\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        $table<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #A6E22E\">string<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&#39;title&#39;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        $table<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #A6E22E\">string<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&#39;image&#39;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        $table<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #A6E22E\">text<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&#39;content&#39;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        $table<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #A6E22E\">timestamps<\/span><span style=\"color: #F8F8F2\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Kita sudah menambahkan 3 <em>field <\/em>baru di dalam file migration, yaitu title, <code>image<\/code>,<code> <\/code>dan <code>content<\/code>. Berikut ini detailnya.<\/p>\n\n\n\n<figure class=\"wp-block-table aligncenter\"><table><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\"><strong>Field<\/strong><\/td><td><strong>Type Data<\/strong><\/td><td><strong>Keterangan<\/strong><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>title<\/code><\/td><td><code>String<\/code><\/td><td>untuk menyimpan judul <em>post<\/em>.<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>image<\/code><\/td><td><code>String<\/code><\/td><td>untuk menyimpan nama gambar yang di <em>upload<\/em>.<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>content<\/code><\/td><td><code>Text<\/code><\/td><td>untuk menyimpan isi <em>post<\/em>.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Kita juga perlu mengubah file Model, agar field yang telah kita tambahkan dapat menyimpan nilai ke dalam database. Silahkan buka file <code>app\/Models\/Post.php<\/code> dan tambahkan kode berikut.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers cbp-highlight-hover\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(253, 253, 237, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1\">app\/Models\/Post.php<\/span><span role=\"button\" tabindex=\"0\" data-code=\"&lt;?php\n\nnamespace App\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Casts\\Attribute;\nuse Illuminate\\Database\\Eloquent\\Factories\\HasFactory;\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass Post extends Model\n{\n    use HasFactory;\n    \n    \/**\n     * fillable\n     *\n     * @var array\n     *\/\n    protected $fillable = [\n        'image',\n        'title',\n        'content',\n    ];\n    \n    \/**\n     * image\n     *\n     * @return Attribute\n     *\/\n    protected function image(): Attribute\n    {\n        return Attribute::make(\n            get: fn ($image) =&gt; url('\/storage\/posts\/' . $image),\n        );\n    }\n}\" style=\"color:#272822;display:none;background-color:#F8F8F2\" aria-label=\"Copy\" data-copied-text=\"Copied!\" data-has-text-button=\"textSimple\" data-inside-header-type=\"simpleString\" aria-live=\"polite\" class=\"code-block-pro-copy-button\"><span class=\"cbp-btn-text\">Copy<\/span><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F92672\">&lt;?<\/span><span style=\"color: #AE81FF\">php<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">namespace<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E; text-decoration: underline\">App\\Models<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #F92672\">use<\/span><span style=\"color: #F8F8F2\"> Illuminate\\Database\\Eloquent\\Casts\\<\/span><span style=\"color: #66D9EF; font-style: italic\">Attribute<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">use<\/span><span style=\"color: #F8F8F2\"> Illuminate\\Database\\Eloquent\\Factories\\<\/span><span style=\"color: #66D9EF; font-style: italic\">HasFactory<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">use<\/span><span style=\"color: #F8F8F2\"> Illuminate\\Database\\Eloquent\\<\/span><span style=\"color: #66D9EF; font-style: italic\">Model<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF; font-style: italic\">class<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E; text-decoration: underline\">Post<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">extends<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E; font-style: italic; text-decoration: underline\">Model<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">use<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">HasFactory<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\">\/**<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #88846F\">     * fillable<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #88846F\">     *<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #88846F\">     * <\/span><span style=\"color: #F92672\">@var<\/span><span style=\"color: #88846F\"> <\/span><span style=\"color: #F92672\">array<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #88846F\">     *\/<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">protected<\/span><span style=\"color: #F8F8F2\"> $fillable <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> [<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #E6DB74\">&#39;image&#39;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #E6DB74\">&#39;title&#39;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #E6DB74\">&#39;content&#39;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #F8F8F2\">    ];<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #F8F8F2\">    <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\">\/**<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #88846F\">     * image<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #88846F\">     *<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #88846F\">     * <\/span><span style=\"color: #F92672\">@return<\/span><span style=\"color: #88846F\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">Attribute<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #88846F\">     *\/<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">protected<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">function<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">image<\/span><span style=\"color: #F8F8F2\">()<\/span><span style=\"color: #F92672\">:<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">Attribute<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #F8F8F2\">    {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #F92672\">return<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">Attribute<\/span><span style=\"color: #F92672\">::<\/span><span style=\"color: #A6E22E\">make<\/span><span style=\"color: #F8F8F2\">(<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #F8F8F2\">            get: <\/span><span style=\"color: #66D9EF; font-style: italic\">fn<\/span><span style=\"color: #F8F8F2\"> ($image) =&gt; <\/span><span style=\"color: #A6E22E\">url<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&#39;\/storage\/posts\/&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">.<\/span><span style=\"color: #F8F8F2\"> $image),<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #F8F8F2\">        );<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #F8F8F2\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Pada kode di atas, kita menambahkan properti baru dengan nama <code><strong>$fillable<\/strong><\/code>. properti tersebut disebut dengan <em><strong>Mass Assignment<\/strong><\/em> dan di dalamnya berisikan <em>fields<\/em> yang sesuai di dalam file migration.<\/p>\n\n\n\n<p>Kita juga membuat <em>method <\/em>baru dengan nama <code><strong>image()<\/strong><\/code>. Hal ini disebut <em><strong>Accessor <\/strong><\/em>yang memungkinkan kita untuk mengubah nilai pada <em>field<\/em>. Dalam <em>method <\/em>ini, kita mengembalikan <code><em>field image<\/em><\/code> untuk menghasilkan URL lengkap dari folder <em>storage<\/em>. Jadi, saat kita memanggil <code><em>field image<\/em><\/code>, outputnya akan otomatis seperti ini:<\/p>\n\n\n\n<p><code>http:\/\/localhost:8000\/storage\/posts\/nama-file.png<\/code><\/p>\n\n\n\n<p>Kemudian kita harus melakukan konfigurasi database mysql. Silahkan  buka file <strong>.env<\/strong> , kemudian tambahkan kode berikut ini.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers cbp-blur-enabled cbp-highlight-hover\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-start:19;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(253, 253, 237, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1\">.env<\/span><span role=\"button\" tabindex=\"0\" data-code=\"LOG_DEPRECATIONS_CHANNEL=null\nLOG_LEVEL=debug\n\nDB_CONNECTION=mysql\nDB_HOST=127.0.0.1\nDB_PORT=3306\nDB_DATABASE=laravel11-restapi\nDB_USERNAME=root\nDB_PASSWORD=\nDB_COLLATION=utf8mb4_unicode_ci\n\nSESSION_DRIVER=database\nSESSION_LIFETIME=120\" style=\"color:#272822;display:none;background-color:#F8F8F2\" aria-label=\"Copy\" data-copied-text=\"Copied!\" data-has-text-button=\"textSimple\" data-inside-header-type=\"simpleString\" aria-live=\"polite\" class=\"code-block-pro-copy-button\"><span class=\"cbp-btn-text\">Copy<\/span><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F8F8F2\">LOG_DEPRECATIONS_CHANNEL=null<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">LOG_LEVEL=debug<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight cbp-no-blur\"><span style=\"color: #F8F8F2\">DB_CONNECTION=mysql<\/span><\/span>\n<span class=\"line cbp-line-highlight cbp-no-blur\"><span style=\"color: #F8F8F2\">DB_HOST=127.0.0.1<\/span><\/span>\n<span class=\"line cbp-line-highlight cbp-no-blur\"><span style=\"color: #F8F8F2\">DB_PORT=3306<\/span><\/span>\n<span class=\"line cbp-line-highlight cbp-no-blur\"><span style=\"color: #F8F8F2\">DB_DATABASE=laravel11-restapi<\/span><\/span>\n<span class=\"line cbp-line-highlight cbp-no-blur\"><span style=\"color: #F8F8F2\">DB_USERNAME=root<\/span><\/span>\n<span class=\"line cbp-line-highlight cbp-no-blur\"><span style=\"color: #F8F8F2\">DB_PASSWORD=<\/span><\/span>\n<span class=\"line cbp-line-highlight cbp-no-blur\"><span style=\"color: #F8F8F2\">DB_COLLATION=utf8mb4_unicode_ci<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">SESSION_DRIVER=database<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">SESSION_LIFETIME=120<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Setelah semua berhasil dibuat, berikutnya kita dapat menjalankan perintah <code>migrate<\/code>. Dengan menjalankan perintah ini, maka <code>database<\/code><em> <\/em>beserta tabel dan juga <em>field<\/em>-nya akan <em>digenerate<\/em>.<\/p>\n\n\n\n<p>Silahkan jalankan perintah berikut ini di dalam terminal\/CMD di dalam project Laravel-nya.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1\">terminal\/CMD<\/span><span role=\"button\" tabindex=\"0\" data-code=\"php artisan migrate\" style=\"color:#272822;display:none;background-color:#F8F8F2\" aria-label=\"Copy\" data-copied-text=\"Copied!\" data-has-text-button=\"textSimple\" data-inside-header-type=\"simpleString\" aria-live=\"polite\" class=\"code-block-pro-copy-button\"><span class=\"cbp-btn-text\">Copy<\/span><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F8F8F2\">php artisan migrate<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Jika muncul pertanyaan seperti ini, maka silahkan pilih Yes dan tekan Enter.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"880\" height=\"514\" src=\"https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api-php-artisan-migrate.webp\" alt=\"\" class=\"wp-image-44\" srcset=\"https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api-php-artisan-migrate.webp 880w, https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api-php-artisan-migrate-300x175.webp 300w, https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api-php-artisan-migrate-768x449.webp 768w\" sizes=\"auto, (max-width: 880px) 100vw, 880px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Membuat API Resources<\/h2>\n\n\n\n<p>Selanjutnya kita akan membuat API resources. Tujuan dari API Resources ini adalah untuk mengonversi data dari Model ke dalam format JSON sesuai kebutuhan, termasuk penambahan informasi status dan pesan yang akan ditampilkan.<\/p>\n\n\n\n<p>Silahkan jalankan perintah berikut ini di dalam terminal\/CMD di dalam project Laravel-nya.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1\">terminal\/CMD<\/span><span role=\"button\" tabindex=\"0\" data-code=\"php artisan make:resource ApiResource\" style=\"color:#272822;display:none;background-color:#F8F8F2\" aria-label=\"Copy\" data-copied-text=\"Copied!\" data-has-text-button=\"textSimple\" data-inside-header-type=\"simpleString\" aria-live=\"polite\" class=\"code-block-pro-copy-button\"><span class=\"cbp-btn-text\">Copy<\/span><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F8F8F2\">php artisan make:resource ApiResource<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Perintah di atas akan membuat sebuah file baru pada folder <code>app\/Http\/Resources\/ApiResource.php<\/code>. Silahkan membuka file tersebut dan rubah semua kode nya menjadi seperti berikut ini:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1\">app\/Http\/Resources\/ApiResource.php<\/span><span role=\"button\" tabindex=\"0\" data-code=\"&lt;?php\n\nnamespace App\\Http\\Resources;\n\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Http\\Resources\\Json\\JsonResource;\n\nclass ApiResource extends JsonResource\n{\n    \/**\n     * __construct\n     *\n     * @param mixed $status\n     * @param mixed $message\n     * @param mixed $data\n     * @return void\n     *\/\n    public function __construct(public $status, public $message, public $data){ }\n\n    \/**\n     * toArray\n     *\n     * @param mixed $request\n     * @return array\n     *\/\n    public function toArray(Request $request): array\n    {\n        return [\n            'status'  =&gt; $this-&gt;status,\n            'message' =&gt; $this-&gt;message,\n            'data'    =&gt; $this-&gt;data\n        ];\n    }\n}\n\" style=\"color:#272822;display:none;background-color:#F8F8F2\" aria-label=\"Copy\" data-copied-text=\"Copied!\" data-has-text-button=\"textSimple\" data-inside-header-type=\"simpleString\" aria-live=\"polite\" class=\"code-block-pro-copy-button\"><span class=\"cbp-btn-text\">Copy<\/span><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F92672\">&lt;?<\/span><span style=\"color: #AE81FF\">php<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">namespace<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E; text-decoration: underline\">App\\Http\\Resources<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">use<\/span><span style=\"color: #F8F8F2\"> Illuminate\\Http\\<\/span><span style=\"color: #66D9EF; font-style: italic\">Request<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">use<\/span><span style=\"color: #F8F8F2\"> Illuminate\\Http\\Resources\\Json\\<\/span><span style=\"color: #66D9EF; font-style: italic\">JsonResource<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF; font-style: italic\">class<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E; text-decoration: underline\">ApiResource<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">extends<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E; font-style: italic; text-decoration: underline\">JsonResource<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     * __construct<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     *<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     * <\/span><span style=\"color: #F92672\">@param<\/span><span style=\"color: #88846F\"> <\/span><span style=\"color: #F92672\">mixed<\/span><span style=\"color: #88846F\"> $status<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     * <\/span><span style=\"color: #F92672\">@param<\/span><span style=\"color: #88846F\"> <\/span><span style=\"color: #F92672\">mixed<\/span><span style=\"color: #88846F\"> $message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     * <\/span><span style=\"color: #F92672\">@param<\/span><span style=\"color: #88846F\"> <\/span><span style=\"color: #F92672\">mixed<\/span><span style=\"color: #88846F\"> $data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     * <\/span><span style=\"color: #F92672\">@return<\/span><span style=\"color: #88846F\"> <\/span><span style=\"color: #F92672\">void<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">public<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">function<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF\">__construct<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #F92672\">public<\/span><span style=\"color: #F8F8F2\"> $status, <\/span><span style=\"color: #F92672\">public<\/span><span style=\"color: #F8F8F2\"> $message, <\/span><span style=\"color: #F92672\">public<\/span><span style=\"color: #F8F8F2\"> $data){ }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     * toArray<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     *<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     * <\/span><span style=\"color: #F92672\">@param<\/span><span style=\"color: #88846F\"> <\/span><span style=\"color: #F92672\">mixed<\/span><span style=\"color: #88846F\"> $request<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     * <\/span><span style=\"color: #F92672\">@return<\/span><span style=\"color: #88846F\"> <\/span><span style=\"color: #F92672\">array<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">public<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">function<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">toArray<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #66D9EF; font-style: italic\">Request<\/span><span style=\"color: #F8F8F2\"> $request)<\/span><span style=\"color: #F92672\">:<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">array<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #F92672\">return<\/span><span style=\"color: #F8F8F2\"> [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #E6DB74\">&#39;status&#39;<\/span><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #F92672\">=&gt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FD971F\">$this<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #F8F8F2\">status,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #E6DB74\">&#39;message&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=&gt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FD971F\">$this<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #F8F8F2\">message,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #E6DB74\">&#39;data&#39;<\/span><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">=&gt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FD971F\">$this<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #F8F8F2\">data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        ];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Dari perubahan kode di atas, pertama-tama, kita membuat method <code>_construct <\/code>yang menerima 3 parameter: <code>$status<\/code>, <code>$message<\/code>, dan <code>$data<\/code>, yang akan digunakan untuk menginisialisasi nilai dari properti <code>$status<\/code> dan <code>$message<\/code> sesuai dengan nilai yang diberikan oleh <em>Controller<\/em>.<\/p>\n\n\n\n<p>Setelah itu, di dalam method <code>toArray<\/code>, kita mengubah bagian return-nya agar menghasilkan format JSON yang sesuai dengan kebutuhan. ApiResource ini dapat digunakan berulang agar format JSON yang ditampilkan seragam, lalu jika kita membutuhkan format JSON yang lain maka kita dapat membuat file Resource baru.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">CRUD Post<\/h2>\n\n\n\n<p>Silahkan jalankan perintah berikut ini di dalam terminal\/CMD di dalam project Laravel-nya.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1\">terminal\/CMD<\/span><span role=\"button\" tabindex=\"0\" data-code=\"php artisan make:controller Api\/PostController\" style=\"color:#272822;display:none;background-color:#F8F8F2\" aria-label=\"Copy\" data-copied-text=\"Copied!\" data-has-text-button=\"textSimple\" data-inside-header-type=\"simpleString\" aria-live=\"polite\" class=\"code-block-pro-copy-button\"><span class=\"cbp-btn-text\">Copy<\/span><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F8F8F2\">php artisan make:controller Api\/PostController<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Perintah di atas akan membuat sebuah file baru pada folder <code>app\/Http\/Controllers\/Api\/PostController.php<\/code>. Silahkan membuka file tersbut dan rubah semua kode nya menjadi seperti berikut ini:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(3 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1\">PostController.php<\/span><span role=\"button\" tabindex=\"0\" data-code=\"&lt;?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse App\\Http\\Controllers\\Controller;\nuse App\\Http\\Resources\\ApiResource;\nuse App\\Models\\Post;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Storage;\nuse Illuminate\\Support\\Facades\\Validator;\n\nclass PostController extends Controller\n{\n    \/**\n     * index\n     *\n     * @return void\n     *\/\n    public function index()\n    {\n        \/\/get latest posts\n        $posts = Post::latest()-&gt;paginate(10);\n\n        \/\/return response\n        return new ApiResource(true, 'All Posts', $posts);\n    }\n\n    \/**\n     * store\n     *\n     * @param mixed $request\n     * @return void\n     *\/\n    public function store(Request $request)\n    {\n        \/\/define validation rules\n        $validator = Validator::make($request-&gt;all(), [\n            'image'   =&gt; 'required|image|mimes:webp,jpeg,png,jpg|max:2048',\n            'title'   =&gt; 'required',\n            'content' =&gt; 'required',\n        ]);\n\n        \/\/check if validation fails\n        if ($validator-&gt;fails()) {\n            \/\/return error response\n            return response()-&gt;json($validator-&gt;errors(), 422);\n        }\n\n        \/\/upload image\n        $image = $request-&gt;file('image');\n        $image-&gt;storeAs('public\/posts', $image-&gt;hashName());\n\n        \/\/create new post\n        $post = Post::create([\n            'image'   =&gt; $image-&gt;hashName(),\n            'title'   =&gt; $request-&gt;title,\n            'content' =&gt; $request-&gt;content,\n        ]);\n\n        \/\/return response\n        return new ApiResource(true, 'Post Created!', $post);\n    }\n\n    \/**\n     * show\n     *\n     * @param mixed $id\n     * @return void\n     *\/\n    public function show($id)\n    {\n        \/\/find post by ID\n        $post = Post::find($id);\n\n        \/\/return single post resource\n        return new ApiResource(true, 'Post Detail', $post);\n    }\n\n    \/**\n     * update\n     *\n     * @param mixed $request\n     * @param mixed $id\n     * @return void\n     *\/\n    public function update(Request $request, $id)\n    {\n        \/\/define validation rules\n        $validator = Validator::make($request-&gt;all(), [\n            'title'   =&gt; 'required',\n            'content' =&gt; 'required',\n        ]);\n\n        \/\/check if validation fails\n        if ($validator-&gt;fails()) {\n            return response()-&gt;json($validator-&gt;errors(), 422);\n        }\n\n        \/\/find post by ID\n        $post = Post::find($id);\n\n        \/\/check if image is not empty\n        if ($request-&gt;hasFile('image')) {\n            \/\/upload image\n            $image = $request-&gt;file('image');\n            $image-&gt;storeAs('public\/posts', $image-&gt;hashName());\n\n            \/\/delete old image\n            Storage::delete('public\/posts\/' . basename($post-&gt;image));\n\n            \/\/update post\n            $post-&gt;update([\n                'image'   =&gt; $image-&gt;hashName(),\n                'title'   =&gt; $request-&gt;title,\n                'content' =&gt; $request-&gt;content,\n            ]);\n        } else {\n            \/\/update post without upload image\n            $post-&gt;update([\n                'title'   =&gt; $request-&gt;title,\n                'content' =&gt; $request-&gt;content,\n            ]);\n        }\n\n        \/\/return response\n        return new ApiResource(true, 'Post Updated!', $post);\n    }\n    \n    \/**\n     * destroy\n     *\n     * @param mixed $id\n     * @return void\n     *\/\n    public function destroy($id)\n    {\n        \/\/find post by ID\n        $post = Post::find($id);\n\n        \/\/delete image\n        Storage::delete('public\/posts\/'.basename($post-&gt;image));\n\n        \/\/delete post\n        $post-&gt;delete();\n\n        \/\/return response\n        return new ApiResource(true, 'Post Deleted!', null);\n    }\n}\" style=\"color:#272822;display:none;background-color:#F8F8F2\" aria-label=\"Copy\" data-copied-text=\"Copied!\" data-has-text-button=\"textSimple\" data-inside-header-type=\"simpleString\" aria-live=\"polite\" class=\"code-block-pro-copy-button\"><span class=\"cbp-btn-text\">Copy<\/span><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F92672\">&lt;?<\/span><span style=\"color: #AE81FF\">php<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">namespace<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E; text-decoration: underline\">App\\Http\\Controllers\\Api<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">use<\/span><span style=\"color: #F8F8F2\"> App\\Http\\Controllers\\<\/span><span style=\"color: #66D9EF; font-style: italic\">Controller<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">use<\/span><span style=\"color: #F8F8F2\"> App\\Http\\Resources\\<\/span><span style=\"color: #66D9EF; font-style: italic\">ApiResource<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">use<\/span><span style=\"color: #F8F8F2\"> App\\Models\\<\/span><span style=\"color: #66D9EF; font-style: italic\">Post<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">use<\/span><span style=\"color: #F8F8F2\"> Illuminate\\Http\\<\/span><span style=\"color: #66D9EF; font-style: italic\">Request<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">use<\/span><span style=\"color: #F8F8F2\"> Illuminate\\Support\\Facades\\<\/span><span style=\"color: #66D9EF; font-style: italic\">Storage<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">use<\/span><span style=\"color: #F8F8F2\"> Illuminate\\Support\\Facades\\<\/span><span style=\"color: #66D9EF; font-style: italic\">Validator<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF; font-style: italic\">class<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E; text-decoration: underline\">PostController<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">extends<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E; font-style: italic; text-decoration: underline\">Controller<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     * index<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     *<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     * <\/span><span style=\"color: #F92672\">@return<\/span><span style=\"color: #88846F\"> <\/span><span style=\"color: #F92672\">void<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">public<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">function<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">index<\/span><span style=\"color: #F8F8F2\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #88846F\">\/\/get latest posts<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        $posts <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">Post<\/span><span style=\"color: #F92672\">::<\/span><span style=\"color: #A6E22E\">latest<\/span><span style=\"color: #F8F8F2\">()<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #A6E22E\">paginate<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #AE81FF\">10<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #88846F\">\/\/return response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #F92672\">return<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">ApiResource<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #AE81FF\">true<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E6DB74\">&#39;All Posts&#39;<\/span><span style=\"color: #F8F8F2\">, $posts);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     * store<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     *<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     * <\/span><span style=\"color: #F92672\">@param<\/span><span style=\"color: #88846F\"> <\/span><span style=\"color: #F92672\">mixed<\/span><span style=\"color: #88846F\"> $request<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     * <\/span><span style=\"color: #F92672\">@return<\/span><span style=\"color: #88846F\"> <\/span><span style=\"color: #F92672\">void<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">public<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">function<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">store<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #66D9EF; font-style: italic\">Request<\/span><span style=\"color: #F8F8F2\"> $request)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #88846F\">\/\/define validation rules<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        $validator <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">Validator<\/span><span style=\"color: #F92672\">::<\/span><span style=\"color: #A6E22E\">make<\/span><span style=\"color: #F8F8F2\">($request<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #A6E22E\">all<\/span><span style=\"color: #F8F8F2\">(), [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #E6DB74\">&#39;image&#39;<\/span><span style=\"color: #F8F8F2\">   <\/span><span style=\"color: #F92672\">=&gt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;required|image|mimes:webp,jpeg,png,jpg|max:2048&#39;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #E6DB74\">&#39;title&#39;<\/span><span style=\"color: #F8F8F2\">   <\/span><span style=\"color: #F92672\">=&gt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;required&#39;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #E6DB74\">&#39;content&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=&gt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;required&#39;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        ]);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #88846F\">\/\/check if validation fails<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> ($validator<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #A6E22E\">fails<\/span><span style=\"color: #F8F8F2\">()) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #88846F\">\/\/return error response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #F92672\">return<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">response<\/span><span style=\"color: #F8F8F2\">()<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #A6E22E\">json<\/span><span style=\"color: #F8F8F2\">($validator<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #A6E22E\">errors<\/span><span style=\"color: #F8F8F2\">(), <\/span><span style=\"color: #AE81FF\">422<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #88846F\">\/\/upload image<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        $image <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> $request<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #A6E22E\">file<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&#39;image&#39;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        $image<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #A6E22E\">storeAs<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&#39;public\/posts&#39;<\/span><span style=\"color: #F8F8F2\">, $image<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #A6E22E\">hashName<\/span><span style=\"color: #F8F8F2\">());<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #88846F\">\/\/create new post<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        $post <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">Post<\/span><span style=\"color: #F92672\">::<\/span><span style=\"color: #A6E22E\">create<\/span><span style=\"color: #F8F8F2\">([<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #E6DB74\">&#39;image&#39;<\/span><span style=\"color: #F8F8F2\">   <\/span><span style=\"color: #F92672\">=&gt;<\/span><span style=\"color: #F8F8F2\"> $image<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #A6E22E\">hashName<\/span><span style=\"color: #F8F8F2\">(),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #E6DB74\">&#39;title&#39;<\/span><span style=\"color: #F8F8F2\">   <\/span><span style=\"color: #F92672\">=&gt;<\/span><span style=\"color: #F8F8F2\"> $request<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #F8F8F2\">title,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #E6DB74\">&#39;content&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=&gt;<\/span><span style=\"color: #F8F8F2\"> $request<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #F8F8F2\">content,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        ]);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #88846F\">\/\/return response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #F92672\">return<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">ApiResource<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #AE81FF\">true<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E6DB74\">&#39;Post Created!&#39;<\/span><span style=\"color: #F8F8F2\">, $post);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     * show<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     *<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     * <\/span><span style=\"color: #F92672\">@param<\/span><span style=\"color: #88846F\"> <\/span><span style=\"color: #F92672\">mixed<\/span><span style=\"color: #88846F\"> $id<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     * <\/span><span style=\"color: #F92672\">@return<\/span><span style=\"color: #88846F\"> <\/span><span style=\"color: #F92672\">void<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">public<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">function<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">show<\/span><span style=\"color: #F8F8F2\">($id)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #88846F\">\/\/find post by ID<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        $post <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">Post<\/span><span style=\"color: #F92672\">::<\/span><span style=\"color: #A6E22E\">find<\/span><span style=\"color: #F8F8F2\">($id);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #88846F\">\/\/return single post resource<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #F92672\">return<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">ApiResource<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #AE81FF\">true<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E6DB74\">&#39;Post Detail&#39;<\/span><span style=\"color: #F8F8F2\">, $post);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     * update<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     *<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     * <\/span><span style=\"color: #F92672\">@param<\/span><span style=\"color: #88846F\"> <\/span><span style=\"color: #F92672\">mixed<\/span><span style=\"color: #88846F\"> $request<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     * <\/span><span style=\"color: #F92672\">@param<\/span><span style=\"color: #88846F\"> <\/span><span style=\"color: #F92672\">mixed<\/span><span style=\"color: #88846F\"> $id<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     * <\/span><span style=\"color: #F92672\">@return<\/span><span style=\"color: #88846F\"> <\/span><span style=\"color: #F92672\">void<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">public<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">function<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">update<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #66D9EF; font-style: italic\">Request<\/span><span style=\"color: #F8F8F2\"> $request, $id)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #88846F\">\/\/define validation rules<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        $validator <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">Validator<\/span><span style=\"color: #F92672\">::<\/span><span style=\"color: #A6E22E\">make<\/span><span style=\"color: #F8F8F2\">($request<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #A6E22E\">all<\/span><span style=\"color: #F8F8F2\">(), [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #E6DB74\">&#39;title&#39;<\/span><span style=\"color: #F8F8F2\">   <\/span><span style=\"color: #F92672\">=&gt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;required&#39;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #E6DB74\">&#39;content&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=&gt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;required&#39;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        ]);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #88846F\">\/\/check if validation fails<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> ($validator<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #A6E22E\">fails<\/span><span style=\"color: #F8F8F2\">()) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #F92672\">return<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">response<\/span><span style=\"color: #F8F8F2\">()<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #A6E22E\">json<\/span><span style=\"color: #F8F8F2\">($validator<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #A6E22E\">errors<\/span><span style=\"color: #F8F8F2\">(), <\/span><span style=\"color: #AE81FF\">422<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #88846F\">\/\/find post by ID<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        $post <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">Post<\/span><span style=\"color: #F92672\">::<\/span><span style=\"color: #A6E22E\">find<\/span><span style=\"color: #F8F8F2\">($id);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #88846F\">\/\/check if image is not empty<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> ($request<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #A6E22E\">hasFile<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&#39;image&#39;<\/span><span style=\"color: #F8F8F2\">)) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #88846F\">\/\/upload image<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            $image <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> $request<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #A6E22E\">file<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&#39;image&#39;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            $image<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #A6E22E\">storeAs<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&#39;public\/posts&#39;<\/span><span style=\"color: #F8F8F2\">, $image<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #A6E22E\">hashName<\/span><span style=\"color: #F8F8F2\">());<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #88846F\">\/\/delete old image<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #66D9EF; font-style: italic\">Storage<\/span><span style=\"color: #F92672\">::<\/span><span style=\"color: #A6E22E\">delete<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&#39;public\/posts\/&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">.<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF\">basename<\/span><span style=\"color: #F8F8F2\">($post<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #F8F8F2\">image));<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #88846F\">\/\/update post<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            $post<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #A6E22E\">update<\/span><span style=\"color: #F8F8F2\">([<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #E6DB74\">&#39;image&#39;<\/span><span style=\"color: #F8F8F2\">   <\/span><span style=\"color: #F92672\">=&gt;<\/span><span style=\"color: #F8F8F2\"> $image<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #A6E22E\">hashName<\/span><span style=\"color: #F8F8F2\">(),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #E6DB74\">&#39;title&#39;<\/span><span style=\"color: #F8F8F2\">   <\/span><span style=\"color: #F92672\">=&gt;<\/span><span style=\"color: #F8F8F2\"> $request<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #F8F8F2\">title,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #E6DB74\">&#39;content&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=&gt;<\/span><span style=\"color: #F8F8F2\"> $request<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #F8F8F2\">content,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            ]);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        } <\/span><span style=\"color: #F92672\">else<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #88846F\">\/\/update post without upload image<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            $post<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #A6E22E\">update<\/span><span style=\"color: #F8F8F2\">([<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #E6DB74\">&#39;title&#39;<\/span><span style=\"color: #F8F8F2\">   <\/span><span style=\"color: #F92672\">=&gt;<\/span><span style=\"color: #F8F8F2\"> $request<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #F8F8F2\">title,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #E6DB74\">&#39;content&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=&gt;<\/span><span style=\"color: #F8F8F2\"> $request<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #F8F8F2\">content,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            ]);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #88846F\">\/\/return response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #F92672\">return<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">ApiResource<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #AE81FF\">true<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E6DB74\">&#39;Post Updated!&#39;<\/span><span style=\"color: #F8F8F2\">, $post);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     * destroy<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     *<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     * <\/span><span style=\"color: #F92672\">@param<\/span><span style=\"color: #88846F\"> <\/span><span style=\"color: #F92672\">mixed<\/span><span style=\"color: #88846F\"> $id<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     * <\/span><span style=\"color: #F92672\">@return<\/span><span style=\"color: #88846F\"> <\/span><span style=\"color: #F92672\">void<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">     *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">public<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">function<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">destroy<\/span><span style=\"color: #F8F8F2\">($id)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #88846F\">\/\/find post by ID<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        $post <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">Post<\/span><span style=\"color: #F92672\">::<\/span><span style=\"color: #A6E22E\">find<\/span><span style=\"color: #F8F8F2\">($id);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #88846F\">\/\/delete image<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #66D9EF; font-style: italic\">Storage<\/span><span style=\"color: #F92672\">::<\/span><span style=\"color: #A6E22E\">delete<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&#39;public\/posts\/&#39;<\/span><span style=\"color: #F92672\">.<\/span><span style=\"color: #66D9EF\">basename<\/span><span style=\"color: #F8F8F2\">($post<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #F8F8F2\">image));<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #88846F\">\/\/delete post<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        $post<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #A6E22E\">delete<\/span><span style=\"color: #F8F8F2\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #88846F\">\/\/return response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #F92672\">return<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">ApiResource<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #AE81FF\">true<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E6DB74\">&#39;Post Deleted!&#39;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #AE81FF\">null<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Membuat Route Rest API<\/h2>\n\n\n\n<p>Pada Laravel 11 route <code>api <\/code>sudah tidak tersedia secara default saat membuat projek baru. Oleh karena itu kita harus menginstallnya terlebih dahulu. Silahkan jalankan perintah berikut ini di dalam terminal\/CMD di dalam project Laravel-nya.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1\">terminal\/CMD<\/span><span role=\"button\" tabindex=\"0\" data-code=\"php artisan install:api\" style=\"color:#272822;display:none;background-color:#F8F8F2\" aria-label=\"Copy\" data-copied-text=\"Copied!\" data-has-text-button=\"textSimple\" data-inside-header-type=\"simpleString\" aria-live=\"polite\" class=\"code-block-pro-copy-button\"><span class=\"cbp-btn-text\">Copy<\/span><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F8F8F2\">php artisan install:api<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Sekarang route Untuk Rest API sudah tersedia di dalam folder routes\/api.php. Silahkan membuka file tersebut dan mengubahnya menjadi seperti berikut:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers cbp-highlight-hover\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(253, 253, 237, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1\">routes\/api.php<\/span><span role=\"button\" tabindex=\"0\" data-code=\"&lt;?php\n\nuse App\\Http\\Controllers\\Api\\PostController;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Route;\n\nRoute::get('\/user', function (Request $request) {\n    return $request-&gt;user();\n})-&gt;middleware('auth:sanctum');\n\n\/\/posts\nRoute::apiResource('\/posts', PostController::class);\n\" style=\"color:#272822;display:none;background-color:#F8F8F2\" aria-label=\"Copy\" data-copied-text=\"Copied!\" data-has-text-button=\"textSimple\" data-inside-header-type=\"simpleString\" aria-live=\"polite\" class=\"code-block-pro-copy-button\"><span class=\"cbp-btn-text\">Copy<\/span><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F92672\">&lt;?<\/span><span style=\"color: #AE81FF\">php<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #F92672\">use<\/span><span style=\"color: #F8F8F2\"> App\\Http\\Controllers\\Api\\<\/span><span style=\"color: #66D9EF; font-style: italic\">PostController<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">use<\/span><span style=\"color: #F8F8F2\"> Illuminate\\Http\\<\/span><span style=\"color: #66D9EF; font-style: italic\">Request<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">use<\/span><span style=\"color: #F8F8F2\"> Illuminate\\Support\\Facades\\<\/span><span style=\"color: #66D9EF; font-style: italic\">Route<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF; font-style: italic\">Route<\/span><span style=\"color: #F92672\">::<\/span><span style=\"color: #A6E22E\">get<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&#39;\/user&#39;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #66D9EF; font-style: italic\">function<\/span><span style=\"color: #F8F8F2\"> (<\/span><span style=\"color: #66D9EF; font-style: italic\">Request<\/span><span style=\"color: #F8F8F2\"> $request) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">return<\/span><span style=\"color: #F8F8F2\"> $request<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #A6E22E\">user<\/span><span style=\"color: #F8F8F2\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">})<\/span><span style=\"color: #F92672\">-&gt;<\/span><span style=\"color: #A6E22E\">middleware<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&#39;auth:sanctum&#39;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #88846F\">\/\/posts<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #66D9EF; font-style: italic\">Route<\/span><span style=\"color: #F92672\">::<\/span><span style=\"color: #A6E22E\">apiResource<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&#39;\/posts&#39;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #66D9EF; font-style: italic\">PostController<\/span><span style=\"color: #F92672\">::class<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Pada kode di atas, kita menambahkan <em>route <\/em>baru dengan jenis apiResource dan memiliki path <code>\/posts<\/code> yang mengarah kepada <strong>PostController<\/strong>. Untuk memastikan route tersebut berhasil ditambahkan, jalankan perintah berikut ini di dalam terminal\/CMD.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1\">terminal\/CMD<\/span><span role=\"button\" tabindex=\"0\" data-code=\"php artisan route:list\" style=\"color:#272822;display:none;background-color:#F8F8F2\" aria-label=\"Copy\" data-copied-text=\"Copied!\" data-has-text-button=\"textSimple\" data-inside-header-type=\"simpleString\" aria-live=\"polite\" class=\"code-block-pro-copy-button\"><span class=\"cbp-btn-text\">Copy<\/span><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F8F8F2\">php artisan route:list<\/span><\/span><\/code><\/pre><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"880\" height=\"514\" src=\"https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api-php-artisan-route-list.webp\" alt=\"\" class=\"wp-image-46\" srcset=\"https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api-php-artisan-route-list.webp 880w, https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api-php-artisan-route-list-300x175.webp 300w, https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api-php-artisan-route-list-768x449.webp 768w\" sizes=\"auto, (max-width: 880px) 100vw, 880px\" \/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">Uji Coba Rest API<\/h2>\n\n\n\n<p>Dalam pengujian ini, kita akan menggunakan <a href=\"https:\/\/www.postman.com\/downloads\/\" target=\"_blank\" rel=\"noreferrer noopener\">Postman<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Insert Post<\/strong><\/h3>\n\n\n\n<p>Sekarang buka aplikasi Postman, kemudian masukkan URL berikut ini <code>http:\/\/localhost:8000\/api\/posts<\/code> dan method-nya silahkan pilih <strong>POST<\/strong>. Kemudian masuk ke tab body, lalu pilih form data dan masukkan data sebagai berikut:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>KEY<\/td><td>TYPE<\/td><td>VALUE<\/td><\/tr><tr><td>title<\/td><td>text<\/td><td>judul post 1<\/td><\/tr><tr><td>image<\/td><td>file<\/td><td>pilih gambar dari PC<\/td><\/tr><tr><td>content<\/td><td>text<\/td><td>ini adalah content dari post pertama<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Klik tombol Send. Jika berhasil maka akan menampilkan hasil seperti gambar di bawah ini. Silahkan menambahkan post beberapa kali untuk menyimpan lebih banyak data ke dalam database.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"858\" height=\"661\" src=\"https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api-insert-post.webp\" alt=\"\" class=\"wp-image-49\" srcset=\"https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api-insert-post.webp 858w, https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api-insert-post-300x231.webp 300w, https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api-insert-post-768x592.webp 768w\" sizes=\"auto, (max-width: 858px) 100vw, 858px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Menampilkan Post<\/strong><\/h3>\n\n\n\n<p>Pada postman, silahkan mengganti method nya menjadi <strong>GET<\/strong>. Jika tidak ada error, maka akan menampilkan data Post terbaru sebagai berikut:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers cbp-highlight-hover\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(253, 253, 237, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F8F8F2\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;status&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #AE81FF\">true<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;message&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;All Posts&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;data&quot;<\/span><span style=\"color: #F8F8F2\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;current_page&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;data&quot;<\/span><span style=\"color: #F8F8F2\">: [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;id&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #AE81FF\">4<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;title&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;judul post 4&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;image&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;http:\/\/localhost:8000\/storage\/posts\/sB4pLt3pcVPZ5rcSR6SaHzbr0NDXCvlVynRWrKuv.webp&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;content&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;Ini adalah content dari post keempat&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;created_at&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;2024-04-02T04:37:37.000000Z&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;updated_at&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;2024-04-02T04:37:37.000000Z&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;id&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #AE81FF\">3<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;title&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;judul post 3&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;image&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;http:\/\/localhost:8000\/storage\/posts\/538muPLLP19GgNWPgUkkPtEeVeWe3q4ot3GksoVI.webp&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;content&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;Ini adalah content dari post ketiga&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;created_at&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;2024-04-02T04:37:28.000000Z&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;updated_at&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;2024-04-02T04:37:28.000000Z&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;id&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #AE81FF\">2<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;title&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;judul post 2&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;image&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;http:\/\/localhost:8000\/storage\/posts\/sW7mZKhHWeriE5O5v1APX9GCr61dLsAc2LBTFK1E.webp&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;content&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;Ini adalah content dari post kedua&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;created_at&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;2024-04-02T04:37:21.000000Z&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;updated_at&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;2024-04-02T04:37:21.000000Z&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;id&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;title&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;judul post 1&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;image&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;http:\/\/localhost:8000\/storage\/posts\/dWmZugz5b1gSIhzeoU4BGGDVXCRqJTYkdSPyeyrE.webp&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;content&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;Ini adalah content dari post pertama&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;created_at&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;2024-04-02T04:24:07.000000Z&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;updated_at&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;2024-04-02T04:24:07.000000Z&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        ],<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;first_page_url&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;http:\/\/localhost:8000\/api\/posts?page=1&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;from&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;last_page&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;last_page_url&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;http:\/\/localhost:8000\/api\/posts?page=1&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;links&quot;<\/span><span style=\"color: #F8F8F2\">: [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;url&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #AE81FF\">null<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;label&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;\u00ab Previous&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;active&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #AE81FF\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;url&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;http:\/\/localhost:8000\/api\/posts?page=1&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;label&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;1&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;active&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #AE81FF\">true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;url&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #AE81FF\">null<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;label&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;Next \u00bb&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;active&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #AE81FF\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        ],<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;next_page_url&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #AE81FF\">null<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;path&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;http:\/\/localhost:8000\/api\/posts&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;per_page&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #AE81FF\">10<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;prev_page_url&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #AE81FF\">null<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;to&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #AE81FF\">4<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;total&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #AE81FF\">4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Menampilkan Detail Post<\/strong><\/h3>\n\n\n\n<p>Tambahkan ID pada akhir URL pada Postman. Sebagai contoh, saya akan menampilkan detail Post dengan ID = 3. Maka URL nya menjadi <code>http:\/\/localhost:8000\/api\/posts\/3<\/code>. Berikut hasil dari detail post.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers cbp-highlight-hover\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(253, 253, 237, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F8F8F2\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;status&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #AE81FF\">true<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;message&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;Post Detail&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;data&quot;<\/span><span style=\"color: #F8F8F2\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;id&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #AE81FF\">3<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;title&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;judul post 3&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;image&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;http:\/\/localhost:8000\/storage\/posts\/538muPLLP19GgNWPgUkkPtEeVeWe3q4ot3GksoVI.webp&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;content&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;Ini adalah content dari post ketiga&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;created_at&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;2024-04-02T04:37:28.000000Z&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;updated_at&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;2024-04-02T04:37:28.000000Z&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Mengupdate Data Post<\/h3>\n\n\n\n<p>Sebagai contoh kita akan mengupdate Post dengan ID = 2. Maka ubah URL nya menjadi: <code>http:\/\/localhost:8000\/api\/posts\/2<\/code>. Pilih Method menjadi <strong>POST<\/strong>, dan pada tab body isikan form-data sebagai berikut dan klik <strong>Send<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>KEY<\/td><td>TYPE<\/td><td>VALUE<\/td><\/tr><tr><td><code>_method<\/code><\/td><td>text<\/td><td>PUT<\/td><\/tr><tr><td><code>title<\/code><\/td><td>text<\/td><td>judul post 1<\/td><\/tr><tr><td><code>image<\/code><\/td><td>file<\/td><td>pilih gambar dari PC<\/td><\/tr><tr><td><code>content<\/code><\/td><td>text<\/td><td>ini adalah content dari post pertama<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Jika berhasil, maka akan menampilkan hasil sebagai berikut:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"866\" height=\"670\" src=\"https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api-update-post.webp\" alt=\"\" class=\"wp-image-50\" srcset=\"https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api-update-post.webp 866w, https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api-update-post-300x232.webp 300w, https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api-update-post-768x594.webp 768w\" sizes=\"auto, (max-width: 866px) 100vw, 866px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Menghapus Data Post<\/h3>\n\n\n\n<p>Silahkan mengubah URL nya menjadi: <code>http:\/\/localhost:8000\/api\/posts\/4<\/code> untuk menghapus Post dengan ID=4. Rubah method nya menjadi DELETE. Jika berhasil akan menampilkan output Sebagai Berikut:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers cbp-highlight-hover\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(253, 253, 237, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F8F8F2\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;status&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #AE81FF\">true<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;message&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #CFCFC2\">&quot;Post Deleted!&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">&quot;data&quot;<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #AE81FF\">null<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Kita telah selesai membuat Sebuah Projek Restfull API pada Larevel 11. Pada artikel selanjutnya kita akan membuat Authentikasi Pada Laravel 11 dengan menggunakan Sanctum.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pada tutorial kali ini, kita akan mempelajari tentang pembuatan RESTful API di Laravel 11, untuk pemula. Tutorial ini akan menerangkan langkah-langkah awal menginstall Laravel 11 hingga pengujian API yang telah dibuat. Selama proses pembuatan API, kita juga akan belajar cara mengupload gambar di Laravel 11. Selain itu, kita akan memanfaatkan fitur bawaan Laravel yang dikenal [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":53,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-24","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorial"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Restful API Laravel 11 - Blog Riki<\/title>\n<meta name=\"description\" content=\"Pelajari langkah-langkah membuat RESTful API di Laravel 11 untuk pemula, dari instalasi hingga pengujian API. Temukan cara mengunggah gambar dan memanfaatkan fitur bawaan Laravel, API Resources, untuk transformasi data model ke JSON.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/rikiag.com\/blog\/read\/restful-api-laravel-11\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Restful API Laravel 11 - Blog Riki\" \/>\n<meta property=\"og:description\" content=\"Pelajari langkah-langkah membuat RESTful API di Laravel 11 untuk pemula, dari instalasi hingga pengujian API. Temukan cara mengunggah gambar dan memanfaatkan fitur bawaan Laravel, API Resources, untuk transformasi data model ke JSON.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/rikiag.com\/blog\/read\/restful-api-laravel-11\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog Riki\" \/>\n<meta property=\"article:published_time\" content=\"2024-04-02T05:53:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-02T06:05:27+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1110\" \/>\n\t<meta property=\"og:image:height\" content=\"570\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"rikiag\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"rikiag\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/rikiag.com\\\/blog\\\/read\\\/restful-api-laravel-11\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rikiag.com\\\/blog\\\/read\\\/restful-api-laravel-11\\\/\"},\"author\":{\"name\":\"rikiag\",\"@id\":\"https:\\\/\\\/rikiag.com\\\/blog\\\/#\\\/schema\\\/person\\\/7b5d3bb9b4a9a4d87a3dcb1a45799979\"},\"headline\":\"Restful API Laravel 11\",\"datePublished\":\"2024-04-02T05:53:49+00:00\",\"dateModified\":\"2024-04-02T06:05:27+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/rikiag.com\\\/blog\\\/read\\\/restful-api-laravel-11\\\/\"},\"wordCount\":1106,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/rikiag.com\\\/blog\\\/#\\\/schema\\\/person\\\/7b5d3bb9b4a9a4d87a3dcb1a45799979\"},\"image\":{\"@id\":\"https:\\\/\\\/rikiag.com\\\/blog\\\/read\\\/restful-api-laravel-11\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/rikiag.com\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/04\\\/laravel-11-rest-api.webp\",\"articleSection\":[\"Tutorial\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/rikiag.com\\\/blog\\\/read\\\/restful-api-laravel-11\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/rikiag.com\\\/blog\\\/read\\\/restful-api-laravel-11\\\/\",\"url\":\"https:\\\/\\\/rikiag.com\\\/blog\\\/read\\\/restful-api-laravel-11\\\/\",\"name\":\"Restful API Laravel 11 - Blog Riki\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rikiag.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/rikiag.com\\\/blog\\\/read\\\/restful-api-laravel-11\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/rikiag.com\\\/blog\\\/read\\\/restful-api-laravel-11\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/rikiag.com\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/04\\\/laravel-11-rest-api.webp\",\"datePublished\":\"2024-04-02T05:53:49+00:00\",\"dateModified\":\"2024-04-02T06:05:27+00:00\",\"description\":\"Pelajari langkah-langkah membuat RESTful API di Laravel 11 untuk pemula, dari instalasi hingga pengujian API. Temukan cara mengunggah gambar dan memanfaatkan fitur bawaan Laravel, API Resources, untuk transformasi data model ke JSON.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/rikiag.com\\\/blog\\\/read\\\/restful-api-laravel-11\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/rikiag.com\\\/blog\\\/read\\\/restful-api-laravel-11\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/rikiag.com\\\/blog\\\/read\\\/restful-api-laravel-11\\\/#primaryimage\",\"url\":\"https:\\\/\\\/rikiag.com\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/04\\\/laravel-11-rest-api.webp\",\"contentUrl\":\"https:\\\/\\\/rikiag.com\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/04\\\/laravel-11-rest-api.webp\",\"width\":1110,\"height\":570},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/rikiag.com\\\/blog\\\/read\\\/restful-api-laravel-11\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/rikiag.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Restful API Laravel 11\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/rikiag.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/rikiag.com\\\/blog\\\/\",\"name\":\"Blog Riki\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/rikiag.com\\\/blog\\\/#\\\/schema\\\/person\\\/7b5d3bb9b4a9a4d87a3dcb1a45799979\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/rikiag.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/rikiag.com\\\/blog\\\/#\\\/schema\\\/person\\\/7b5d3bb9b4a9a4d87a3dcb1a45799979\",\"name\":\"rikiag\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/rikiag.com\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/android-chrome-512x512-1.png\",\"url\":\"https:\\\/\\\/rikiag.com\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/android-chrome-512x512-1.png\",\"contentUrl\":\"https:\\\/\\\/rikiag.com\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/android-chrome-512x512-1.png\",\"width\":512,\"height\":512,\"caption\":\"rikiag\"},\"logo\":{\"@id\":\"https:\\\/\\\/rikiag.com\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/android-chrome-512x512-1.png\"},\"sameAs\":[\"https:\\\/\\\/rikiag.com\\\/blog\"],\"url\":\"https:\\\/\\\/rikiag.com\\\/blog\\\/read\\\/author\\\/rikiag\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Restful API Laravel 11 - Blog Riki","description":"Pelajari langkah-langkah membuat RESTful API di Laravel 11 untuk pemula, dari instalasi hingga pengujian API. Temukan cara mengunggah gambar dan memanfaatkan fitur bawaan Laravel, API Resources, untuk transformasi data model ke JSON.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/rikiag.com\/blog\/read\/restful-api-laravel-11\/","og_locale":"en_US","og_type":"article","og_title":"Restful API Laravel 11 - Blog Riki","og_description":"Pelajari langkah-langkah membuat RESTful API di Laravel 11 untuk pemula, dari instalasi hingga pengujian API. Temukan cara mengunggah gambar dan memanfaatkan fitur bawaan Laravel, API Resources, untuk transformasi data model ke JSON.","og_url":"https:\/\/rikiag.com\/blog\/read\/restful-api-laravel-11\/","og_site_name":"Blog Riki","article_published_time":"2024-04-02T05:53:49+00:00","article_modified_time":"2024-04-02T06:05:27+00:00","og_image":[{"width":1110,"height":570,"url":"https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api.webp","type":"image\/webp"}],"author":"rikiag","twitter_card":"summary_large_image","twitter_misc":{"Written by":"rikiag","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/rikiag.com\/blog\/read\/restful-api-laravel-11\/#article","isPartOf":{"@id":"https:\/\/rikiag.com\/blog\/read\/restful-api-laravel-11\/"},"author":{"name":"rikiag","@id":"https:\/\/rikiag.com\/blog\/#\/schema\/person\/7b5d3bb9b4a9a4d87a3dcb1a45799979"},"headline":"Restful API Laravel 11","datePublished":"2024-04-02T05:53:49+00:00","dateModified":"2024-04-02T06:05:27+00:00","mainEntityOfPage":{"@id":"https:\/\/rikiag.com\/blog\/read\/restful-api-laravel-11\/"},"wordCount":1106,"commentCount":0,"publisher":{"@id":"https:\/\/rikiag.com\/blog\/#\/schema\/person\/7b5d3bb9b4a9a4d87a3dcb1a45799979"},"image":{"@id":"https:\/\/rikiag.com\/blog\/read\/restful-api-laravel-11\/#primaryimage"},"thumbnailUrl":"https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api.webp","articleSection":["Tutorial"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/rikiag.com\/blog\/read\/restful-api-laravel-11\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/rikiag.com\/blog\/read\/restful-api-laravel-11\/","url":"https:\/\/rikiag.com\/blog\/read\/restful-api-laravel-11\/","name":"Restful API Laravel 11 - Blog Riki","isPartOf":{"@id":"https:\/\/rikiag.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/rikiag.com\/blog\/read\/restful-api-laravel-11\/#primaryimage"},"image":{"@id":"https:\/\/rikiag.com\/blog\/read\/restful-api-laravel-11\/#primaryimage"},"thumbnailUrl":"https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api.webp","datePublished":"2024-04-02T05:53:49+00:00","dateModified":"2024-04-02T06:05:27+00:00","description":"Pelajari langkah-langkah membuat RESTful API di Laravel 11 untuk pemula, dari instalasi hingga pengujian API. Temukan cara mengunggah gambar dan memanfaatkan fitur bawaan Laravel, API Resources, untuk transformasi data model ke JSON.","breadcrumb":{"@id":"https:\/\/rikiag.com\/blog\/read\/restful-api-laravel-11\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/rikiag.com\/blog\/read\/restful-api-laravel-11\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/rikiag.com\/blog\/read\/restful-api-laravel-11\/#primaryimage","url":"https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api.webp","contentUrl":"https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/04\/laravel-11-rest-api.webp","width":1110,"height":570},{"@type":"BreadcrumbList","@id":"https:\/\/rikiag.com\/blog\/read\/restful-api-laravel-11\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/rikiag.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Restful API Laravel 11"}]},{"@type":"WebSite","@id":"https:\/\/rikiag.com\/blog\/#website","url":"https:\/\/rikiag.com\/blog\/","name":"Blog Riki","description":"","publisher":{"@id":"https:\/\/rikiag.com\/blog\/#\/schema\/person\/7b5d3bb9b4a9a4d87a3dcb1a45799979"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/rikiag.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/rikiag.com\/blog\/#\/schema\/person\/7b5d3bb9b4a9a4d87a3dcb1a45799979","name":"rikiag","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/03\/android-chrome-512x512-1.png","url":"https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/03\/android-chrome-512x512-1.png","contentUrl":"https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/03\/android-chrome-512x512-1.png","width":512,"height":512,"caption":"rikiag"},"logo":{"@id":"https:\/\/rikiag.com\/blog\/wp-content\/uploads\/2024\/03\/android-chrome-512x512-1.png"},"sameAs":["https:\/\/rikiag.com\/blog"],"url":"https:\/\/rikiag.com\/blog\/read\/author\/rikiag\/"}]}},"_links":{"self":[{"href":"https:\/\/rikiag.com\/blog\/wp-json\/wp\/v2\/posts\/24","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rikiag.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rikiag.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rikiag.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rikiag.com\/blog\/wp-json\/wp\/v2\/comments?post=24"}],"version-history":[{"count":21,"href":"https:\/\/rikiag.com\/blog\/wp-json\/wp\/v2\/posts\/24\/revisions"}],"predecessor-version":[{"id":418,"href":"https:\/\/rikiag.com\/blog\/wp-json\/wp\/v2\/posts\/24\/revisions\/418"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rikiag.com\/blog\/wp-json\/wp\/v2\/media\/53"}],"wp:attachment":[{"href":"https:\/\/rikiag.com\/blog\/wp-json\/wp\/v2\/media?parent=24"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rikiag.com\/blog\/wp-json\/wp\/v2\/categories?post=24"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rikiag.com\/blog\/wp-json\/wp\/v2\/tags?post=24"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}