[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"site-settings":3,"site-menu":10,"category-lap-trinh":21},{"siteName":4,"siteDescription":5,"contactEmail":6,"phone":7,"githubUrl":8,"facebookUrl":9},"vdhoangson.com","Ghi chép về lập trình, hệ thống và những điều học được trên đường làm sản phẩm.","contact@vdhoangson.com","+84 387 324 112","https:\u002F\u002Fgithub.com\u002Fvdhoangson","",{"items":11},[12,15,18],{"href":13,"label":14},"\u002F","Mới nhất",{"href":16,"label":17},"\u002Fcategory\u002Fdich-vu","Dịch vụ",{"href":19,"label":20},"\u002Fabout","Về tôi",{"items":22,"total":145,"page":146,"pageSize":147},[23,70,114],{"id":24,"wordpressId":25,"title":26,"slug":27,"excerpt":28,"contentHtml":29,"status":30,"authorName":31,"seoTitle":26,"seoDescription":28,"featuredMediaId":32,"featuredMedia":33,"categories":45,"tags":51,"publishedAt":68,"createdAt":68,"updatedAt":69},"dc2b66ed-ac04-4c59-be48-d87417fd8242",16379,"Laravel Model: create() và insert() có giống nhau?","laravel-model-create-va-insert-co-giong-nhau","Trong môn phái Laravel, có hai tuyệt kỹ khiến bao lập trình giả tranh luận không ngừng: create và insert. Nghe thì tưởng đồng môn, nhưng thực ra hai chiêu này đi hai con đường nội công khác biệt, dùng sai hoàn cảnh là tự đâm vào chân mình như chơi. Hôm nay, để tránh […]","\n\u003Cp class=\"wp-block-paragraph\">Trong môn phái Laravel, có hai tuyệt kỹ khiến bao lập trình giả tranh luận không ngừng: \u003Cstrong>create\u003C\u002Fstrong> và \u003Cstrong>insert\u003C\u002Fstrong>. Nghe thì tưởng đồng môn, nhưng thực ra hai chiêu này đi hai con đường nội công khác biệt, dùng sai hoàn cảnh là tự đâm vào chân mình như chơi.\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Hôm nay, để tránh huynh đệ tẩu hỏa nhập ma, ta sẽ mở cuộn tàn thư và giải thích cho rõ ràng.\u003C\u002Fp>\n\n\n\n\u003Ch1 class=\"wp-block-heading\">\u003Cstrong>1. Giang hồ đồn rằng create và insert giống nhau?\u003C\u002Fstrong>\u003C\u002Fh1>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Câu trả lời là \u003Cmark class=\"has-inline-color\">\u003Cstrong>KHÔNG, KHÔNG, KHÔNG\u003C\u002Fstrong>\u003C\u002Fmark> có nhưng.\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Cả hai đều có thể \u003Cstrong>thêm dữ liệu vào database\u003C\u002Fstrong>, nhưng bản chất nội công hoàn toàn khác nhau.\u003C\u002Fp>\n\n\n\n\u003Ch1 class=\"wp-block-heading\">\u003Cstrong>2. Tuyệt kỹ “create”: Một chiêu nội công thâm sâu của Eloquent\u003C\u002Fstrong>\u003C\u002Fh1>\n\n\n\n\u003Cblockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n\u003Cp class=\"wp-block-paragraph\">\u003Cem>“Một chiêu xuất ra, mang theo linh khí đất trời, tự động vận hành đủ thứ bí thuật.”\u003C\u002Fem>\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">✔ Đặc điểm:\u003C\u002Fh3>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Tạo \u003Cstrong>một Eloquent Model instance\u003C\u002Fstrong>.\u003C\u002Fli>\n\n\n\n\u003Cli>Tự động chạy:\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Mass Assignment check (fillable\u002Fguarded)\u003C\u002Fli>\n\n\n\n\u003Cli>Mutators (setXxxAttribute)\u003C\u002Fli>\n\n\n\n\u003Cli>Accessors khi load lại\u003C\u002Fli>\n\n\n\n\u003Cli>Casting\u003C\u002Fli>\n\n\n\n\u003Cli>Events: creating → created\u003C\u002Fli>\n\n\n\n\u003Cli>Timestamps: created_at \u002F updated_at\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\n\n\n\u003Cli>Trả về \u003Cstrong>model đầy đủ\u003C\u002Fstrong>, dùng tiếp mượt như lụa.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Ví dụ:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>User::create([\n   'name' =&gt; 'Lệnh Hồ Xung',\n   'email' =&gt; 'xung.lenh@vdhoangson.com',\n]);\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">📌 Khi nên dùng:\u003C\u002Fh3>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Khi cần logic của model được kích hoạt.\u003C\u002Fli>\n\n\n\n\u003Cli>Khi muốn dùng tiếp model (ví dụ gửi event, xử lý quan hệ, truy cập property).\u003C\u002Fli>\n\n\n\n\u003Cli>Khi muốn code sạch, “chuẩn Eloquent”.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">🧨 Nhược điểm:\u003C\u002Fh3>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Chậm hơn \u003Cstrong>insert\u003C\u002Fstrong> vì chạy nhiều tầng nhiều lớp để thi triển nội công.\u003C\u002Fli>\n\n\n\n\u003Cli>Không phù hợp với \u003Cstrong>bulk insert số lượng lớn\u003C\u002Fstrong>.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Ch1 class=\"wp-block-heading\">\u003Cstrong>3. Tuyệt kỹ “insert”: Đao pháp nhanh, mạnh, gọn… nhưng vô tình vô nghĩa\u003C\u002Fstrong>\u003C\u002Fh1>\n\n\n\n\u003Cblockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n\u003Cp class=\"wp-block-paragraph\">\u003Cem>“Nhanh như gió, mạnh như bão, nhưng chẳng để lại chút linh lực nào.”\u003C\u002Fem>\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">✔ Đặc điểm:\u003C\u002Fh3>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Gửi SQL \u003Cstrong>trực tiếp\u003C\u002Fstrong> xuống database.\u003C\u002Fli>\n\n\n\n\u003Cli>Không tạo model instance.\u003C\u002Fli>\n\n\n\n\u003Cli>Không chạy:\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Events\u003C\u002Fli>\n\n\n\n\u003Cli>Mutators\u003C\u002Fli>\n\n\n\n\u003Cli>Casting\u003C\u002Fli>\n\n\n\n\u003Cli>Fillable\u003C\u002Fli>\n\n\n\n\u003Cli>Timestamps (nếu muốn phải tự thêm)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\n\n\n\u003Cli>Trả về \u003Cstrong>bool\u003C\u002Fstrong>, không phải model.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Ví dụ:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>DB::table('users')-&gt;insert([\n   'name' =&gt; 'Đông Phương Bất Bại',\n   'email' =&gt; 'dong.phuong@vdhoangson.com',\n   'created_at' =&gt; now(),\n]);\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">📌 Khi nên dùng:\u003C\u002Fh3>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Insert \u003Cstrong>nhiều dòng\u003C\u002Fstrong> cùng lúc (bulk insert).\u003C\u002Fli>\n\n\n\n\u003Cli>Không cần events, timestamps, mutators.\u003C\u002Fli>\n\n\n\n\u003Cli>Tối ưu tốc độ cho các tác vụ nặng.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">⚡ Ưu điểm:\u003C\u002Fh3>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Rất nhanh, nhanh hơn NYC lật mặt.\u003C\u002Fli>\n\n\n\n\u003Cli>Thích hợp cho queue, sync, seed dữ liệu lớn.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">🧨 Nhược điểm:\u003C\u002Fh3>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Không nhận model trả về.\u003C\u002Fli>\n\n\n\n\u003Cli>Không hưởng quyền lợi của Eloquent.\u003C\u002Fli>\n\n\n\n\u003Cli>Không có gì, không có gì cả.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Ch1 class=\"wp-block-heading\">🥋 \u003Cstrong>4. So găng: Create vs Insert\u003C\u002Fstrong>\u003C\u002Fh1>\n\n\n\n\u003Cfigure class=\"wp-block-table\">\u003Ctable class=\"has-fixed-layout\">\u003Cthead>\u003Ctr>\u003Cth>Tính năng\u003C\u002Fth>\u003Cth>create\u003C\u002Fth>\u003Cth>insert\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd>Tạo model instance\u003C\u002Ftd>\u003Ctd>✔\u003C\u002Ftd>\u003Ctd>❌\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Chạy events\u003C\u002Ftd>\u003Ctd>✔\u003C\u002Ftd>\u003Ctd>❌\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Chạy mutator\u002Faccessor\u003C\u002Ftd>\u003Ctd>✔\u003C\u002Ftd>\u003Ctd>❌\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Tự động timestamps\u003C\u002Ftd>\u003Ctd>✔\u003C\u002Ftd>\u003Ctd>❌\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Trả về model\u003C\u002Ftd>\u003Ctd>✔\u003C\u002Ftd>\u003Ctd>❌\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Tốc độ\u003C\u002Ftd>\u003Ctd>Chậm hơn\u003C\u002Ftd>\u003Ctd>Nhanh hơn\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Insert hàng loạt\u003C\u002Ftd>\u003Ctd>Không tối ưu\u003C\u002Ftd>\u003Ctd>Rất mạnh\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Ffigure>\n\n\n\n\u003Ch1 class=\"wp-block-heading\">\u003Cstrong>5. Kết luận bí pháp\u003C\u002Fstrong>\u003C\u002Fh1>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Muốn “đúng chuẩn Eloquent”, cần sự tinh tế → \u003Cstrong>dùng create\u003C\u002Fstrong>.\u003C\u002Fli>\n\n\n\n\u003Cli>Muốn “xuất chiêu sấm sét”, tốc độ thần sầu → \u003Cstrong>dùng insert\u003C\u002Fstrong>.\u003C\u002Fli>\n\n\n\n\u003Cli>Mỗi tuyệt kỹ có chỗ phát huy riêng; cao thủ giang hồ là người biết dùng đúng lúc, đúng chỗ, đừng nên cố chấp.\u003C\u002Fli>\n\u003C\u002Ful>\n","published","vdhoangson@gmail.com","863c9fac-4c46-43f3-8f3b-a93d3c919f05",{"id":32,"wordpressId":34,"filename":35,"storageKey":36,"sourceUrl":37,"mimeType":38,"altText":9,"caption":39,"width":40,"height":41,"createdAt":42,"updatedAt":43,"url":44},16381,"laravel-create-vs-insert.png","wordpress\u002F2025\u002F11\u002Flaravel-create-vs-insert.png","https:\u002F\u002Fvdhoangson.com\u002Fwp-content\u002Fuploads\u002F2025\u002F11\u002Flaravel-create-vs-insert.png","image\u002Fpng",null,1536,1024,"2025-11-20T08:18:01.000Z","2026-10-15T04:59:31.204Z","\u002Fuploads\u002Fwordpress\u002F2025\u002F11\u002Flaravel-create-vs-insert.png",[46],{"id":47,"wordpressId":48,"name":49,"slug":50,"parentId":39},"f6aff5ed-b85e-45e6-bbdb-08788be09d67",2,"Lập Trình","lap-trinh",[52,56,60,64],{"id":53,"wordpressId":54,"name":55,"slug":55},"35b4e0f9-6caf-49f1-a08e-c5830e6d6f6d",11,"laravel",{"id":57,"wordpressId":58,"name":59,"slug":59},"060701e9-02eb-4710-b81b-60265c4203fe",331,"eloquent",{"id":61,"wordpressId":62,"name":63,"slug":63},"c2708aab-589e-4b2b-8285-9562fe7c806c",333,"insert",{"id":65,"wordpressId":66,"name":67,"slug":67},"7ff182e7-9bb4-481e-bdde-419643e3d6a7",332,"create","2025-11-20T08:19:52.000Z","2025-11-20T08:19:54.000Z",{"id":71,"wordpressId":72,"title":73,"slug":74,"excerpt":75,"contentHtml":76,"status":30,"authorName":31,"seoTitle":73,"seoDescription":75,"featuredMediaId":77,"featuredMedia":78,"categories":86,"tags":88,"publishedAt":112,"createdAt":112,"updatedAt":113},"5c54b58d-b689-47c3-bcce-51cc1b7983f2",16363,"Cuộc đại chiến giữa hai môn phái: Session Auth vs JWT Auth","cuoc-dai-chien-giua-hai-mon-phai-session-auth-vs-jwt-auth","I. Bôn tẩu giang hồ Từ thuở giang hồ còn sơ khai, các ứng dụng web cổ điển sử dụng Session Auth — một môn phái lâu đời, đơn giản, hiệu quả.Nhưng rồi, khi thế giới SPA (Single Page Application) và API trỗi dậy, một môn phái mới xuất hiện: JWT Auth — gọn gàng, […]","\n\u003Ch2 class=\"wp-block-heading\">I. Bôn tẩu giang hồ\u003C\u002Fh2>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Từ thuở giang hồ còn sơ khai, các ứng dụng web cổ điển sử dụng \u003Cstrong>Session Auth\u003C\u002Fstrong> — một môn phái lâu đời, đơn giản, hiệu quả.\u003Cbr \u002F>Nhưng rồi, khi thế giới SPA (Single Page Application) và API trỗi dậy, một môn phái mới xuất hiện: \u003Cstrong>JWT Auth\u003C\u002Fstrong> — gọn gàng, tự do, hành tẩu khắp thiên hạ không cần server nhớ mặt.\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Hai phái tuy khác đường, nhưng đều hướng tới một mục tiêu: \u003Cstrong>xác thực danh tính người dùng\u003C\u002Fstrong>.\u003Cbr \u002F>Vậy ai là cao thủ đệ nhất thiên hạ? Hãy cùng ta luận một hồi!\u003C\u002Fp>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">II. \u003Cstrong>Tuyệt kỷ của từng môn phái\u003C\u002Fstrong>\u003C\u002Fh2>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">Phái Session Auth – “Truyền thống chính tông”\u003C\u002Fh3>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">\u003Cstrong>Nguyên lý:\u003C\u002Fstrong>\u003Cbr \u002F>Khi người dùng đăng nhập, server tạo một “session” lưu trong bộ nhớ hoặc database.\u003Cbr \u002F>Một “token bí mật” (session ID) được gửi về trình duyệt, lưu trong \u003Cstrong>cookie\u003C\u002Fstrong>.\u003Cbr \u002F>Từ đó, mỗi lần người dùng gửi request, cookie ấy giúp server nhận ra họ.\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">\u003Cstrong>Vũ khí bí truyền:\u003C\u002Fstrong>\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>\u003Ccode>php artisan make:auth\u003C\u002Fcode> – thần công tự động hoá.\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Ccode>Illuminate\\Session\u003C\u002Fcode> – nội công thâm hậu.\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Ccode>csrf_token()\u003C\u002Fcode> – hộ thân pháp tránh bị tấn công CSRF.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">Phái JWT Auth – “Hiệp khách giang hồ tự do”\u003C\u002Fh3>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">\u003Cstrong>Nguyên lý:\u003C\u002Fstrong>\u003Cbr \u002F>Khi người dùng đăng nhập, server trả về một \u003Cstrong>JWT (JSON Web Token)\u003C\u002Fstrong> – chứa thông tin mã hoá (payload).\u003Cbr \u002F>Token này đi theo mọi request (thường nằm trong header \u003Ccode>Authorization: Bearer &lt;token&gt;\u003C\u002Fcode>).\u003Cbr \u002F>Server không cần lưu gì cả – chỉ cần \u003Cstrong>xác minh chữ ký\u003C\u002Fstrong> là biết thật giả.\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">\u003Cstrong>Vũ khí bí truyền:\u003C\u002Fstrong>\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>\u003Ccode>tymon\u002Fjwt-auth\u003C\u002Fcode> – bí kíp phổ biến trong Laravel.\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Ccode>firebase\u002Fphp-jwt\u003C\u002Fcode> – bảo vật do tiền nhân Google để lại.\u003C\u002Fli>\n\n\n\n\u003Cli>Header \u003Ccode>Authorization\u003C\u002Fcode> – như lệnh bài của triều đình, đi đến đâu cũng có hiệu lực.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">III. \u003Cstrong>So sánh chiêu thức\u003C\u002Fstrong>\u003C\u002Fh2>\n\n\n\n\u003Cfigure class=\"wp-block-table\">\u003Ctable class=\"has-fixed-layout\">\u003Cthead>\u003Ctr>\u003Cth>Đặc điểm\u003C\u002Fth>\u003Cth>\u003Cstrong>Session Auth\u003C\u002Fstrong>\u003C\u002Fth>\u003Cth>\u003Cstrong>JWT Auth\u003C\u002Fstrong>\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd>\u003Cstrong>Lưu trữ\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>Trên server (session store, Redis, DB…)\u003C\u002Ftd>\u003Ctd>Trên client (localStorage, cookie, memory…)\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>\u003Cstrong>Trạng thái (state)\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>Có trạng thái (stateful)\u003C\u002Ftd>\u003Ctd>Không trạng thái (stateless)\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>\u003Cstrong>Phù hợp cho\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>Web truyền thống (Blade, Livewire…)\u003C\u002Ftd>\u003Ctd>SPA, Mobile app, API đa nền tảng\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>\u003Cstrong>Tốc độ\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>Cần truy xuất session mỗi lần\u003C\u002Ftd>\u003Ctd>Nhanh hơn vì không truy DB\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>\u003Cstrong>Bảo mật\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>Tốt với cookie + HTTPS\u003C\u002Ftd>\u003Ctd>Dễ lộ token nếu không cẩn thận\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>\u003Cstrong>Gia hạn phiên (refresh)\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>Tự động qua cookie\u003C\u002Ftd>\u003Ctd>Cần cơ chế refresh token thủ công\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>\u003Cstrong>Logout\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>Dễ – chỉ xoá session\u003C\u002Ftd>\u003Ctd>Phức tạp – phải vô hiệu hóa token\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>\u003Cstrong>Triển khai\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>Dễ, Laravel hỗ trợ sẵn\u003C\u002Ftd>\u003Ctd>Cần setup thêm package và cấu hình\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>\u003Cstrong>Kiểm soát người dùng online\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>Dễ (dựa vào session table)\u003C\u002Ftd>\u003Ctd>Khó hơn – token không lưu trạng thái\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Ffigure>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">IV. \u003Cstrong>Khi nào nên dùng?\u003C\u002Fstrong>\u003C\u002Fh2>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">\u003Cstrong>Session Auth – Dành cho đệ tử nội môn\u003C\u002Fstrong>\u003C\u002Fh3>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Dùng khi:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Ứng dụng chủ yếu là \u003Cstrong>web truyền thống\u003C\u002Fstrong> (Laravel Blade, Inertia, Livewire).\u003C\u002Fli>\n\n\n\n\u003Cli>Hệ thống cần quản lý phiên đăng nhập chặt chẽ, ví dụ \u003Cstrong>admin panel, cổng nội bộ\u003C\u002Fstrong>.\u003C\u002Fli>\n\n\n\n\u003Cli>Muốn tận dụng bảo mật cookie và CSRF protection sẵn có của Laravel.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cblockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n\u003Cp class=\"wp-block-paragraph\">🧙 “Muốn an định giang sơn, cứ trung thành với Session Auth.”\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">\u003Cstrong>JWT Auth – Dành cho hiệp khách phiêu bạt\u003C\u002Fstrong>\u003C\u002Fh3>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Dùng khi:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Xây dựng \u003Cstrong>API\u003C\u002Fstrong> cho mobile, SPA, microservices.\u003C\u002Fli>\n\n\n\n\u003Cli>Cần xác thực \u003Cstrong>không phụ thuộc server\u003C\u002Fstrong>.\u003C\u002Fli>\n\n\n\n\u003Cli>Muốn người dùng đăng nhập 1 lần – dùng mọi nơi (SSO, đa nền tảng).\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cblockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n\u003Cp class=\"wp-block-paragraph\">🥷 “Đi khắp thiên hạ, mang theo JWT là đủ — chỉ cần chữ ký hợp lệ.”\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">V. \u003Cstrong>Tổng kết giang hồ\u003C\u002Fstrong>\u003C\u002Fh2>\n\n\n\n\u003Cfigure class=\"wp-block-table\">\u003Ctable class=\"has-fixed-layout\">\u003Cthead>\u003Ctr>\u003Cth>Tình huống\u003C\u002Fth>\u003Cth>Môn phái khuyên dùng\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd>Web nội bộ, quản lý user, admin\u003C\u002Ftd>\u003Ctd>Session Auth\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Ứng dụng mobile, React\u002FVue SPA\u003C\u002Ftd>\u003Ctd>JWT Auth\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>API kết nối nhiều dịch vụ\u003C\u002Ftd>\u003Ctd>JWT Auth\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Muốn bảo mật cookie và CSRF sẵn có\u003C\u002Ftd>\u003Ctd>Session Auth\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Ffigure>\n","2e00d396-6843-4625-87a1-560bb59ede80",{"id":77,"wordpressId":79,"filename":80,"storageKey":81,"sourceUrl":82,"mimeType":38,"altText":83,"caption":39,"width":40,"height":41,"createdAt":84,"updatedAt":43,"url":85},16368,"session-auth-vs-jwt-auth.png","wordpress\u002F2025\u002F11\u002Fsession-auth-vs-jwt-auth.png","https:\u002F\u002Fvdhoangson.com\u002Fwp-content\u002Fuploads\u002F2025\u002F11\u002Fsession-auth-vs-jwt-auth.png","session-auth-vs-jwt-auth","2025-11-08T08:34:10.000Z","\u002Fuploads\u002Fwordpress\u002F2025\u002F11\u002Fsession-auth-vs-jwt-auth.png",[87],{"id":47,"wordpressId":48,"name":49,"slug":50,"parentId":39},[89,94,99,103,108],{"id":90,"wordpressId":91,"name":92,"slug":93},"f5078e23-3620-49f8-9a73-9d1581ff52a9",323,"xác thực","xac-thuc",{"id":95,"wordpressId":96,"name":97,"slug":98},"2c66d2ac-1302-420b-b539-9650f8c32355",321,"session auth","session-auth",{"id":100,"wordpressId":101,"name":102,"slug":102},"fd1e9a51-9b19-4f4b-9ce9-11c160986ba3",325,"cookie",{"id":104,"wordpressId":105,"name":106,"slug":107},"236197c7-fa55-4d64-ba54-add3201ffcbb",322,"jwt auth","jwt-auth",{"id":109,"wordpressId":110,"name":111,"slug":111},"8b36a009-aacd-4d34-8bec-9aab90d3593a",324,"session","2025-11-08T08:37:12.000Z","2025-11-08T08:37:14.000Z",{"id":115,"wordpressId":116,"title":117,"slug":118,"excerpt":119,"contentHtml":120,"status":30,"authorName":31,"seoTitle":117,"seoDescription":119,"featuredMediaId":121,"featuredMedia":122,"categories":131,"tags":133,"publishedAt":143,"createdAt":143,"updatedAt":144},"0e29fb3a-dd03-4693-8283-0ab68e483c2e",164,"Laravel: Chạy Job bất đồng bộ hay đồng bộ?","laravel-chay-job-bat-dong-bo-hay-dong-bo","Khi làm việc với Laravel Queue, chắc hẳn bạn đã từng gặp hai phương thức quen thuộc: Nghe thì na ná nhau, nhưng thực ra cách hoạt động lại khác biệt hoàn toàn. Hiểu đúng sự khác nhau sẽ giúp bạn tối ưu hiệu năng và tránh bug ngớ ngẩn khi xử lý job. 1. […]","\n\u003Cp class=\"wp-block-paragraph\">Khi làm việc với \u003Cstrong>Laravel Queue\u003C\u002Fstrong>, chắc hẳn bạn đã từng gặp hai phương thức quen thuộc:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>\u003Ccode>dispatch()\u003C\u002Fcode>\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Ccode>dispatch_sync()\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Nghe thì na ná nhau, nhưng thực ra cách hoạt động lại khác biệt hoàn toàn. Hiểu đúng sự khác nhau sẽ giúp bạn \u003Cstrong>tối ưu hiệu năng\u003C\u002Fstrong> và \u003Cstrong>tránh bug ngớ ngẩn\u003C\u002Fstrong> khi xử lý job.\u003C\u002Fp>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">1. \u003Ccode>dispatch()\u003C\u002Fcode>: Gửi Job vào hàng đợi\u003C\u002Fh2>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">\u003Ccode>dispatch()\u003C\u002Fcode> dùng để đưa Job vào hàng đợi (queue). Worker sẽ xử lý nó sau, theo cơ chế bất đồng bộ.\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Ví dụ:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>SendWelcomeEmail::dispatch($user);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Khi chạy code trên:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Job \u003Ccode>SendWelcomeEmail\u003C\u002Fcode> \u003Cstrong>không chạy ngay\u003C\u002Fstrong>.\u003C\u002Fli>\n\n\n\n\u003Cli>Nó sẽ được lưu vào queue (Redis, Database, SQS, RabbitMQ…).\u003C\u002Fli>\n\n\n\n\u003Cli>Worker (chạy bằng lệnh \u003Ccode>php artisan queue:work\u003C\u002Fcode>) sẽ pick nó lên và xử lý.\u003C\u002Fli>\n\n\n\n\u003Cli>Request hiện tại \u003Cstrong>không bị chặn\u003C\u002Fstrong>, trả về ngay cho user → nhanh và mượt.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">👉 Thích hợp cho:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Gửi email, SMS.\u003C\u002Fli>\n\n\n\n\u003Cli>Xử lý file, video, ảnh.\u003C\u002Fli>\n\n\n\n\u003Cli>Đồng bộ dữ liệu với service khác.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">2. \u003Ccode>dispatch_sync()\u003C\u002Fcode>: Chạy ngay lập tức\u003C\u002Fh2>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Ngược lại, \u003Ccode>dispatch_sync()\u003C\u002Fcode> sẽ bỏ qua queue và chạy Job \u003Cstrong>ngay trong tiến trình hiện tại\u003C\u002Fstrong>.\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Ví dụ:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>WriteAuditLog::dispatchSync($user);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Khi chạy code trên:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Job \u003Ccode>WriteAuditLog\u003C\u002Fcode> \u003Cstrong>thực thi ngay\u003C\u002Fstrong>.\u003C\u002Fli>\n\n\n\n\u003Cli>Không cần worker, không cần queue.\u003C\u002Fli>\n\n\n\n\u003Cli>Request sẽ \u003Cstrong>chờ job chạy xong\u003C\u002Fstrong> mới tiếp tục.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">👉 Thích hợp cho:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Ghi log quan trọng.\u003C\u002Fli>\n\n\n\n\u003Cli>Tính toán cần kết quả ngay.\u003C\u002Fli>\n\n\n\n\u003Cli>Các tác vụ nhỏ, không tốn nhiều thời gian.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">3. Khi nào dùng cái nào?\u003C\u002Fh2>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>\u003Cstrong>Dùng \u003Ccode>dispatch()\u003C\u002Fcode>\u003C\u002Fstrong> khi:\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Tác vụ nặng.\u003C\u002Fli>\n\n\n\n\u003Cli>Không cần kết quả ngay.\u003C\u002Fli>\n\n\n\n\u003Cli>Bạn muốn tăng tốc request trả về cho user.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>Dùng \u003Ccode>dispatch_sync()\u003C\u002Fcode>\u003C\u002Fstrong> khi:\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Tác vụ nhỏ, cần chạy ngay.\u003C\u002Fli>\n\n\n\n\u003Cli>Muốn đảm bảo chạy xong trước khi qua bước tiếp theo.\u003C\u002Fli>\n\n\n\n\u003Cli>Không muốn phụ thuộc vào queue worker.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">4. Lưu ý\u003C\u002Fh2>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Trước Laravel 8 có \u003Ccode>dispatchNow()\u003C\u002Fcode>, nhưng đã bị thay thế bởi \u003Ccode>dispatchSync()\u003C\u002Fcode>.\u003C\u002Fli>\n\n\n\n\u003Cli>Nếu bạn dùng \u003Ccode>dispatch()\u003C\u002Fcode> mà không bật queue worker, job sẽ \u003Cstrong>không bao giờ chạy\u003C\u002Fstrong> → bug silent rất khó chịu.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">5. Kết luận\u003C\u002Fh2>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>\u003Ccode>dispatch()\u003C\u002Fcode> = chạy bất đồng bộ (qua queue).\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Ccode>dispatch_sync()\u003C\u002Fcode> = chạy đồng bộ, ngay lập tức.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">👉 Hãy nhớ:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>\u003Cstrong>Nặng → dispatch.\u003C\u002Fstrong>\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>Nhẹ &amp; cần ngay → dispatch_sync.\u003C\u002Fstrong>\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Đơn giản vậy thôi, nhưng áp dụng đúng thì hệ thống Laravel của bạn vừa \u003Cstrong>nhanh hơn\u003C\u002Fstrong>, vừa \u003Cstrong>ổn định hơn\u003C\u002Fstrong>.\u003C\u002Fp>\n","f19724a6-8553-4d5c-930e-58b1fcf1b2ab",{"id":121,"wordpressId":123,"filename":124,"storageKey":125,"sourceUrl":126,"mimeType":38,"altText":9,"caption":39,"width":127,"height":128,"createdAt":129,"updatedAt":43,"url":130},16256,"laravel.png","wordpress\u002F2025\u002F07\u002Flaravel.png","https:\u002F\u002Fvdhoangson.com\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002Flaravel.png",1930,1090,"2025-09-26T08:50:47.000Z","\u002Fuploads\u002Fwordpress\u002F2025\u002F07\u002Flaravel.png",[132],{"id":47,"wordpressId":48,"name":49,"slug":50,"parentId":39},[134,138,142],{"id":135,"wordpressId":136,"name":137,"slug":137},"92d3cf4d-2362-4b7d-a6d2-3aa29dca8ad0",308,"dispatch",{"id":139,"wordpressId":140,"name":141,"slug":141},"68c0949f-f079-493b-9f66-9bbdbf0168af",307,"queue",{"id":53,"wordpressId":54,"name":55,"slug":55},"2025-07-07T02:57:03.000Z","2025-09-26T08:52:03.000Z",3,1,12]