<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: zinh8803</title>
    <description>The latest articles on DEV Community by zinh8803 (@zinh8803).</description>
    <link>https://dev.to/zinh8803</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3952521%2Fcb7fc74f-397f-450a-94af-4be5d3f0ce42.jpeg</url>
      <title>DEV Community: zinh8803</title>
      <link>https://dev.to/zinh8803</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zinh8803"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>zinh8803</dc:creator>
      <pubDate>Mon, 02 Nov 2026 08:50:24 +0000</pubDate>
      <link>https://dev.to/zinh8803/-59g4</link>
      <guid>https://dev.to/zinh8803/-59g4</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/zinh8803/building-a-production-ready-laravel-11-backend-starter-kit-jwt-realtime-websockets-payment-4oon" class="crayons-story__hidden-navigation-link"&gt;How I Saved 40+ Hours Building a Production-Ready Laravel 11 E-Commerce REST API&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/zinh8803" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3952521%2Fcb7fc74f-397f-450a-94af-4be5d3f0ce42.jpeg" alt="zinh8803 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/zinh8803" class="crayons-story__secondary fw-medium m:hidden"&gt;
              zinh8803
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                zinh8803
                
                
              
              &lt;div id="story-author-preview-content-4961811" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/zinh8803" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3952521%2Fcb7fc74f-397f-450a-94af-4be5d3f0ce42.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;zinh8803&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/zinh8803/building-a-production-ready-laravel-11-backend-starter-kit-jwt-realtime-websockets-payment-4oon" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Nov 2&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/zinh8803/building-a-production-ready-laravel-11-backend-starter-kit-jwt-realtime-websockets-payment-4oon" id="article-link-4961811"&gt;
          How I Saved 40+ Hours Building a Production-Ready Laravel 11 E-Commerce REST API
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/showdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;showdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/laravel"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;laravel&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/api"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;api&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/zinh8803/building-a-production-ready-laravel-11-backend-starter-kit-jwt-realtime-websockets-payment-4oon" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/zinh8803/building-a-production-ready-laravel-11-backend-starter-kit-jwt-realtime-websockets-payment-4oon#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
          
          &lt;div class="only-sidebar-menu-item trusted-visible-block print-hidden align-center"&gt;
                
                    
                
          &lt;/div&gt;

        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>How I Saved 40+ Hours Building a Production-Ready Laravel 11 E-Commerce REST API</title>
      <dc:creator>zinh8803</dc:creator>
      <pubDate>Mon, 02 Nov 2026 08:48:31 +0000</pubDate>
      <link>https://dev.to/zinh8803/building-a-production-ready-laravel-11-backend-starter-kit-jwt-realtime-websockets-payment-4oon</link>
      <guid>https://dev.to/zinh8803/building-a-production-ready-laravel-11-backend-starter-kit-jwt-realtime-websockets-payment-4oon</guid>
      <description>&lt;p&gt;Starting a new client project or e-commerce web application often means repeating the same foundational setup: configuring authentication with access and refresh tokens, setting up rate limiting, building data repositories, integrating payment gateways, and wiring up realtime WebSockets.&lt;/p&gt;

&lt;p&gt;Before writing a single line of domain logic, developers easily spend 30 to 40 hours just on boilerplate configuration.&lt;/p&gt;

&lt;p&gt;To streamline this workflow, I engineered and tested a production-ready Laravel 11 Backend Starter Kit designed for e-commerce and composite inventory stores.&lt;/p&gt;

&lt;p&gt;Below is an overview of the architectural decisions, security practices, and workflow designs implemented in this codebase.&lt;/p&gt;

&lt;p&gt;Clean Architecture: Repository and Service Pattern&lt;/p&gt;

&lt;p&gt;While Laravel permits business logic directly inside controllers, doing so in complex e-commerce applications quickly leads to unmaintainable code.&lt;/p&gt;

&lt;p&gt;This project implements a strict separation of concerns:&lt;/p&gt;

&lt;p&gt;HTTP Request -&amp;gt; FormRequest (Validation) -&amp;gt; Controller -&amp;gt; Service Layer -&amp;gt; Repository Layer -&amp;gt; Eloquent Model&lt;/p&gt;

&lt;p&gt;Controllers: Handle HTTP transport, invoke service methods, and return structured JSON responses.&lt;/p&gt;

&lt;p&gt;Services (app/Services/): Contain business rules, composite inventory calculations, payment signatures, and job dispatching.&lt;/p&gt;

&lt;p&gt;Repositories (app/Repositories/): Abstract database interactions through interfaces (ProductRepositoryInterface, OrderRepositoryInterface), registered via RepositoryServiceProvider.&lt;/p&gt;

&lt;p&gt;This structure allows swapping storage engines and writing isolated unit tests with ease.&lt;/p&gt;

&lt;p&gt;Authentication and Role-Based Access Control (RBAC)&lt;/p&gt;

&lt;p&gt;Modern APIs serve both single-page applications (SPAs) and native mobile clients simultaneously.&lt;/p&gt;

&lt;p&gt;Dual-Mode JWT Authentication:&lt;br&gt;
The authentication middleware supports two delivery mechanisms:&lt;/p&gt;

&lt;p&gt;Bearer Tokens (Authorization: Bearer ) for mobile clients and tools like Postman or Bruno.&lt;/p&gt;

&lt;p&gt;HttpOnly Cookies for browser clients to prevent XSS-based token theft.&lt;/p&gt;

&lt;p&gt;Role-Based Access Control:&lt;br&gt;
The RBAC middleware restricts access based on user roles:&lt;/p&gt;

&lt;p&gt;admin: Full control over employee management, inventory configurations, and user accounts.&lt;/p&gt;

&lt;p&gt;employee: Access to order fulfillment, stock imports, and reports.&lt;/p&gt;

&lt;p&gt;user: Standard customer capabilities.&lt;/p&gt;

&lt;p&gt;Recipe-Based Dynamic Inventory Management&lt;/p&gt;

&lt;p&gt;Traditional e-commerce platforms often track stock using a simple quantity column on the product table. However, composite stores craft finished goods from raw components.&lt;/p&gt;

&lt;p&gt;Example: A Luxury Rose Bouquet (Size M) requires:&lt;/p&gt;

&lt;p&gt;10x Red Roses&lt;/p&gt;

&lt;p&gt;5x Baby's Breath&lt;/p&gt;

&lt;p&gt;1x Packaging Material&lt;/p&gt;

&lt;p&gt;The inventory service calculates real-time craftable stock by querying raw material shipments. When an order is created, raw material stock is deducted inside an atomic database transaction.&lt;/p&gt;

&lt;p&gt;Automated Daily Stock Importer:&lt;br&gt;
Through Laravel's scheduler (php artisan schedule:work), the console command import-receipt:auto-create processes configured daily stock arrivals at specified hours and broadcasts alerts to staff.&lt;/p&gt;

&lt;p&gt;Payment Processing and Webhook Verification&lt;/p&gt;

&lt;p&gt;Payment processing requires cryptographic verification to prevent spoofed transactions.&lt;/p&gt;

&lt;p&gt;The starter kit provides end-to-end flows for payment gateways with signature validation:&lt;/p&gt;

&lt;p&gt;Checkout Session: Generates signed checkout URLs using HMAC-SHA512.&lt;/p&gt;

&lt;p&gt;Webhook / IPN Verification: Sorts incoming parameters, recomputes the expected signature, and uses hash_equals() to prevent timing attacks. Updates order status to PAID only upon valid signature verification and returns 400 Bad Request if the payload is forged or tampered with.&lt;/p&gt;

&lt;p&gt;Realtime WebSockets with Pusher&lt;/p&gt;

&lt;p&gt;The backend connects to Pusher Channels for immediate UI synchronization:&lt;/p&gt;

&lt;p&gt;admin-orders channel: Triggers instant notifications when a customer completes an order.&lt;/p&gt;

&lt;p&gt;admin-auto-imports channel: Alerts staff when the scheduled import command executes.&lt;/p&gt;

&lt;p&gt;private-chat.{userId} channel: Facilitates private customer support conversations.&lt;/p&gt;

&lt;p&gt;All event broadcasts and transactional emails are queued (php artisan queue:work) to ensure API response latency stays under 50ms.&lt;/p&gt;

&lt;p&gt;Security Hardening and Quality Assurance&lt;/p&gt;

&lt;p&gt;The codebase includes an automated test suite covering 19 end-to-end scenarios:&lt;/p&gt;

&lt;p&gt;Rate Limiting: The login endpoint is protected with throttle:login (10 requests/minute). Repeated failures immediately trigger HTTP 429 Too Many Requests.&lt;/p&gt;

&lt;p&gt;SQL Injection and XSS Protection: Prepared statements prevent SQL injection attacks, while custom middleware removes script tags from payloads and adds security headers (X-Content-Type-Options: nosniff, X-Frame-Options: DENY, X-XSS-Protection: 1; mode=block).&lt;/p&gt;

&lt;p&gt;File Upload Validation: Provides Cloudinary integration with local disk fallback. File uploads are strictly validated for MIME types (PNG, JPG, WEBP, PDF) and size (under 2MB).&lt;/p&gt;

&lt;p&gt;Getting the Starter Kit&lt;/p&gt;

&lt;p&gt;This project is packaged as a ready-to-deploy boilerplate.&lt;/p&gt;

&lt;p&gt;Included Components:&lt;/p&gt;

&lt;p&gt;Full Laravel 11.x source code (PSR-4 compliant)&lt;/p&gt;

&lt;p&gt;50+ Database Migrations and Seeders (pre-configured Admin and Demo users)&lt;/p&gt;

&lt;p&gt;Ready-to-import Postman / Bruno Collection (postman_collection.json)&lt;/p&gt;

&lt;p&gt;Interactive Swagger OpenAPI Documentation (/api/documentation)&lt;/p&gt;

&lt;p&gt;Complete setup documentation in English and Vietnamese&lt;/p&gt;

&lt;p&gt;Multi-container Docker Compose configuration (app, queue, schedule)&lt;/p&gt;

&lt;p&gt;Product Link on Gumroad:&lt;br&gt;
&lt;a href="https://vinhcraft17.gumroad.com/l/laravel-ecommerce-starter-kit" rel="noopener noreferrer"&gt;https://vinhcraft17.gumroad.com/l/laravel-ecommerce-starter-kit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have questions regarding the architecture or implementation details, feel free to leave a comment below.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>api</category>
      <category>webdev</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I Built My Own Blogging Platform Using Vue + Yii2</title>
      <dc:creator>zinh8803</dc:creator>
      <pubDate>Tue, 26 May 2026 11:56:26 +0000</pubDate>
      <link>https://dev.to/zinh8803/i-built-my-own-blogging-platform-using-vue-yii2-1k00</link>
      <guid>https://dev.to/zinh8803/i-built-my-own-blogging-platform-using-vue-yii2-1k00</guid>
      <description>&lt;p&gt;Hi everyone &lt;/p&gt;

&lt;p&gt;Over the past few weeks, I’ve been building a personal blogging platform from scratch using Vue + Yii2 REST API as a way to improve my backend and frontend development skills.&lt;/p&gt;

&lt;p&gt;This is still an active project, and I’d really love to get feedback from other developers about the UI/UX, performance, features, and overall experience.&lt;/p&gt;

&lt;p&gt;Tech Stack&lt;/p&gt;

&lt;p&gt;Frontend&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vue 3&lt;/li&gt;
&lt;li&gt;Vite&lt;/li&gt;
&lt;li&gt;Vue Router&lt;/li&gt;
&lt;li&gt;Axios&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Backend&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Yii2 REST API&lt;/li&gt;
&lt;li&gt;JWT Authentication&lt;/li&gt;
&lt;li&gt;RBAC&lt;/li&gt;
&lt;li&gt;MySQL&lt;/li&gt;
&lt;li&gt;Queue / Mail support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Deployment&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VPS + Nginx&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Current Features&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User authentication&lt;/li&gt;
&lt;li&gt;Create &amp;amp; manage blog posts&lt;/li&gt;
&lt;li&gt;SEO meta support&lt;/li&gt;
&lt;li&gt;Responsive UI&lt;/li&gt;
&lt;li&gt;CMS dashboard&lt;/li&gt;
&lt;li&gt;Image upload&lt;/li&gt;
&lt;li&gt;Slug generation&lt;/li&gt;
&lt;li&gt;Category &amp;amp; tag system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why I Built This&lt;/p&gt;

&lt;p&gt;I wanted to practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;building scalable REST APIs&lt;/li&gt;
&lt;li&gt;CMS architecture&lt;/li&gt;
&lt;li&gt;authentication flow&lt;/li&gt;
&lt;li&gt;deployment workflow&lt;/li&gt;
&lt;li&gt;SEO optimization&lt;/li&gt;
&lt;li&gt;frontend/backend separation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of only following tutorials, I decided to build a real project that people can actually use and test.&lt;/p&gt;

&lt;p&gt;I Need Your Feedback&lt;/p&gt;

&lt;p&gt;I’d really appreciate it if you could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;test the website&lt;/li&gt;
&lt;li&gt;report bugs&lt;/li&gt;
&lt;li&gt;give UI/UX suggestions&lt;/li&gt;
&lt;li&gt;share performance feedback&lt;/li&gt;
&lt;li&gt;suggest features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even small feedback helps a lot &lt;br&gt;
Demo:&lt;br&gt;
&lt;a href="https://blogcuavinh.id.vn/" rel="noopener noreferrer"&gt;https://blogcuavinh.id.vn/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>php</category>
      <category>vue</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
