A forum is a deceptively complex thing. Sure, it's made up of threads and replies, but what else might exist as part of a forum? What about profiles, or thread subscriptions, or filtering, or real-time notifications? As it turns out, a forum is the perfect project to stretch your programming muscles. In this series, we'll work together to build one with tests from A to Z.
Let's Build A Forum with Laravel and TDD
About the Author: Laracasts
Laracasts is the dominant subscription video platform for the Laravel PHP framework, founded and run by Jeffrey Way. Active since 2013, the site has grown into a multi-thousand-video catalog covering Laravel itself, Vue.js, Tailwind CSS, testing, and the broader modern PHP ecosystem. Laracasts videos are the de-facto onboarding path most working Laravel developers have used at some point in their career.
The catalog mirrored here under this source is a small slice of what the full platform offers — included for the depth of project-based material it provides on the framework. Material from Laracasts is paid, screencast-format, and aimed at working PHP developers rather than absolute beginners.
Watch Online 102 lessons
| # | Lesson Title | Duration | Access |
|---|---|---|---|
| 1 | Initial Database Setup With Seeding Demo | 07:59 | |
| 2 | Test-Driving Threads | 09:27 | |
| 3 | A Thread Can Have Replies | 09:10 | |
| 4 | A User May Respond to Threads | 17:40 | |
| 5 | The Reply Form | 05:15 | |
| 6 | A User May Publish Threads | 06:13 | |
| 7 | Let's Make Some Testing Helpers | 05:44 | |
| 8 | The Exception Handling Conundrum | 07:55 | |
| 9 | A Thread Should Be Assigned a Channel | 14:12 | |
| 10 | How to Test Validation Errors | 10:41 | |
| 11 | Users Can Filter Threads By Channel | 13:26 | |
| 12 | Validation Errors and Old Data | 08:24 | |
| 13 | Extracting to View Composers | 03:00 | |
| 14 | A User Can Filter All Threads By Username | 07:37 | |
| 15 | A Lesson in Refactoring | 18:48 | |
| 16 | Meta Details and Pagination | 09:20 | |
| 17 | A User Can Filter Threads By Popularity | 11:51 | |
| 18 | A User Can Favorite Replies | 15:47 | |
| 19 | The Favorite Button | 07:37 | |
| 20 | From 56 Queries Down to 2 | 07:07 | |
| 21 | Global Scopes and Further Query Reduction | 08:29 | |
| 22 | A User Has a Profile | 12:32 | |
| 23 | A User Can Delete Their Threads | 14:07 | |
| 24 | Authorization With Policies | 10:29 | |
| 25 | How to Construct an Activity Feed with TDD | 16:38 | |
| 26 | How to Construct An Activity Feed with TDD: Part 2 | 16:22 | |
| 27 | Extracting Controller Queries to the Model | 07:40 | |
| 28 | The Activity Deletion Bug | 05:11 | |
| 29 | Flash Messaging With Vue | 14:00 | |
| 30 | A User's Activity Feed Should Include Favorited Replies | 06:06 | |
| 31 | Authorized Users Can Delete Replies | 07:59 | |
| 32 | A Vue Reply Component | 13:52 | |
| 33 | Ajaxifying the Delete Button | 04:22 | |
| 34 | A Vue Favorite Component | 16:28 | |
| 35 | Squashing Bugs | 08:32 | |
| 36 | A More Data-centric Approach | 21:59 | |
| 37 | A New Reply Component | 11:44 | |
| 38 | Laravel and Vue Pagination | 31:02 | |
| 39 | A User Can Filter By Unanswered Threads | 12:53 | |
| 40 | Thread Subscriptions: Part 1 | 10:53 | |
| 41 | Thread Subscriptions: Part 2 | 06:17 | |
| 42 | Thread Subscriptions: Part 3 | 15:13 | |
| 43 | Thread Subscriptions: Part 4 | 25:30 | |
| 44 | Test Refactoring | 06:16 | |
| 45 | Thread Subscriptions: Part 5 | 13:22 | |
| 46 | Refactoring for the Better or Worse? | 10:25 | |
| 47 | Notification Fakes in a Nutshell | 05:21 | |
| 48 | This Thread Has Been Updated Since You Last Read It | 15:55 | |
| 49 | Spam Detection | 11:09 | |
| 50 | Graduating Inspection Methods to Classes | 08:52 | |
| 51 | Spam Detection At All Ports | 06:57 | |
| 52 | Handling Server Exceptions with JavaScript | 10:17 | |
| 53 | Refactoring to Custom Validation | 07:21 | |
| 54 | A User May Not Reply More Than Once Per Minute | 15:11 | |
| 55 | Refactoring to Form Requests | 12:04 | |
| 56 | Mentioned Users Notifications: Part 1 | 09:29 | |
| 57 | Mentioned Users Notifications: Part 2 | 12:14 | |
| 58 | Don't Forget to Scan Your Files | 08:02 | |
| 59 | Wrap Usernames Within Anchor Tags | 07:35 | |
| 60 | Instant Username Autocompletion | 13:20 | |
| 61 | Instant Username Autocompletion: Part 2 | 13:34 | |
| 62 | Basic View Tweaks | 07:49 | |
| 63 | Testing Avatar Uploads | 13:50 | |
| 64 | Testing Avatar Uploads: Part 2 | 14:05 | |
| 65 | AJAX Image Uploads | 28:04 | |
| 66 | Trending Threads With Redis | 14:50 | |
| 67 | Isolating Knowledge | 12:15 | |
| 68 | Thread Views: Design #1 - Trait | 09:11 | |
| 69 | Thread Views: Design #2 - Extract Class | 08:24 | |
| 70 | Thread Views: Design #3 - KISS | 07:51 | |
| 71 | Users Must Confirm Their Email Address: #1 - Protection | 09:47 | |
| 72 | Users Must Confirm Their Email Address: #2 - Confirmation | 23:07 | |
| 73 | Users Must Confirm Their Email Address: #3 - Cleanup | 15:17 | |
| 74 | Email Confirmation Loose Ends | 08:03 | |
| 75 | A Thread Should Have a Unique Slug: Part 1 | 07:26 | |
| 76 | A Thread Should Have a Unique Slug: Part 2 | 11:45 | |
| 77 | We Need a Regression Test | 13:29 | |
| 78 | Mark the Best Reply: Part 1 | 14:18 | |
| 79 | Mark the Best Reply: Part 2 | 07:58 | |
| 80 | Refactoring Authorization | 06:08 | |
| 81 | Remembering a Best Reply | 10:49 | |
| 82 | Confusing Errors and Solutions | 11:08 | |
| 83 | Thread Authorization | 06:40 | |
| 84 | An Administrator May Lock Any Thread | 08:00 | |
| 85 | An Administrator May Lock Any Thread: Part 2 | 16:02 | |
| 86 | An Administrator May Lock Any Thread: Part 3 | 11:16 | |
| 87 | An Administrator May Lock Any Thread: Part 4 | 11:59 | |
| 88 | From Laravel 5.4 to Laravel 5.5 | 09:31 | |
| 89 | Recaptcha | 09:33 | |
| 90 | Recaptcha Refactoring | 12:51 | |
| 91 | A Thread Can Be Updated | 13:34 | |
| 92 | A Thread Can Be Updated: Part 2 | 12:44 | |
| 93 | A Thread Can Be Updated: Part 3 | 15:22 | |
| 94 | First Class Search: Scout Review | 09:07 | |
| 95 | First Class Search: Implementation | 18:10 | |
| 96 | First Class Search: Faceting and Ranking | 05:01 | |
| 97 | First Class Search: Instant Results | 11:51 | |
| 98 | First Class Search: Forum Integration | 11:02 | |
| 99 | WYSIWYG | 15:29 | |
| 100 | WYSIWYG: Part 2 | 12:12 | |
| 101 | Sanitizing is a Must | 19:29 | |
| 102 | Onward | 01:58 |
Get instant access to all 101 lessons in this course, plus thousands of other premium courses. One subscription, unlimited knowledge.
Learn more about subscriptionCourse content
102 lessons · 19h 30m 20sShow all 102 lessons
- 1 Initial Database Setup With Seeding 07:59
- 2 Test-Driving Threads 09:27
- 3 A Thread Can Have Replies 09:10
- 4 A User May Respond to Threads 17:40
- 5 The Reply Form 05:15
- 6 A User May Publish Threads 06:13
- 7 Let's Make Some Testing Helpers 05:44
- 8 The Exception Handling Conundrum 07:55
- 9 A Thread Should Be Assigned a Channel 14:12
- 10 How to Test Validation Errors 10:41
- 11 Users Can Filter Threads By Channel 13:26
- 12 Validation Errors and Old Data 08:24
- 13 Extracting to View Composers 03:00
- 14 A User Can Filter All Threads By Username 07:37
- 15 A Lesson in Refactoring 18:48
- 16 Meta Details and Pagination 09:20
- 17 A User Can Filter Threads By Popularity 11:51
- 18 A User Can Favorite Replies 15:47
- 19 The Favorite Button 07:37
- 20 From 56 Queries Down to 2 07:07
- 21 Global Scopes and Further Query Reduction 08:29
- 22 A User Has a Profile 12:32
- 23 A User Can Delete Their Threads 14:07
- 24 Authorization With Policies 10:29
- 25 How to Construct an Activity Feed with TDD 16:38
- 26 How to Construct An Activity Feed with TDD: Part 2 16:22
- 27 Extracting Controller Queries to the Model 07:40
- 28 The Activity Deletion Bug 05:11
- 29 Flash Messaging With Vue 14:00
- 30 A User's Activity Feed Should Include Favorited Replies 06:06
- 31 Authorized Users Can Delete Replies 07:59
- 32 A Vue Reply Component 13:52
- 33 Ajaxifying the Delete Button 04:22
- 34 A Vue Favorite Component 16:28
- 35 Squashing Bugs 08:32
- 36 A More Data-centric Approach 21:59
- 37 A New Reply Component 11:44
- 38 Laravel and Vue Pagination 31:02
- 39 A User Can Filter By Unanswered Threads 12:53
- 40 Thread Subscriptions: Part 1 10:53
- 41 Thread Subscriptions: Part 2 06:17
- 42 Thread Subscriptions: Part 3 15:13
- 43 Thread Subscriptions: Part 4 25:30
- 44 Test Refactoring 06:16
- 45 Thread Subscriptions: Part 5 13:22
- 46 Refactoring for the Better or Worse? 10:25
- 47 Notification Fakes in a Nutshell 05:21
- 48 This Thread Has Been Updated Since You Last Read It 15:55
- 49 Spam Detection 11:09
- 50 Graduating Inspection Methods to Classes 08:52
- 51 Spam Detection At All Ports 06:57
- 52 Handling Server Exceptions with JavaScript 10:17
- 53 Refactoring to Custom Validation 07:21
- 54 A User May Not Reply More Than Once Per Minute 15:11
- 55 Refactoring to Form Requests 12:04
- 56 Mentioned Users Notifications: Part 1 09:29
- 57 Mentioned Users Notifications: Part 2 12:14
- 58 Don't Forget to Scan Your Files 08:02
- 59 Wrap Usernames Within Anchor Tags 07:35
- 60 Instant Username Autocompletion 13:20
- 61 Instant Username Autocompletion: Part 2 13:34
- 62 Basic View Tweaks 07:49
- 63 Testing Avatar Uploads 13:50
- 64 Testing Avatar Uploads: Part 2 14:05
- 65 AJAX Image Uploads 28:04
- 66 Trending Threads With Redis 14:50
- 67 Isolating Knowledge 12:15
- 68 Thread Views: Design #1 - Trait 09:11
- 69 Thread Views: Design #2 - Extract Class 08:24
- 70 Thread Views: Design #3 - KISS 07:51
- 71 Users Must Confirm Their Email Address: #1 - Protection 09:47
- 72 Users Must Confirm Their Email Address: #2 - Confirmation 23:07
- 73 Users Must Confirm Their Email Address: #3 - Cleanup 15:17
- 74 Email Confirmation Loose Ends 08:03
- 75 A Thread Should Have a Unique Slug: Part 1 07:26
- 76 A Thread Should Have a Unique Slug: Part 2 11:45
- 77 We Need a Regression Test 13:29
- 78 Mark the Best Reply: Part 1 14:18
- 79 Mark the Best Reply: Part 2 07:58
- 80 Refactoring Authorization 06:08
- 81 Remembering a Best Reply 10:49
- 82 Confusing Errors and Solutions 11:08
- 83 Thread Authorization 06:40
- 84 An Administrator May Lock Any Thread 08:00
- 85 An Administrator May Lock Any Thread: Part 2 16:02
- 86 An Administrator May Lock Any Thread: Part 3 11:16
- 87 An Administrator May Lock Any Thread: Part 4 11:59
- 88 From Laravel 5.4 to Laravel 5.5 09:31
- 89 Recaptcha 09:33
- 90 Recaptcha Refactoring 12:51
- 91 A Thread Can Be Updated 13:34
- 92 A Thread Can Be Updated: Part 2 12:44
- 93 A Thread Can Be Updated: Part 3 15:22
- 94 First Class Search: Scout Review 09:07
- 95 First Class Search: Implementation 18:10
- 96 First Class Search: Faceting and Ranking 05:01
- 97 First Class Search: Instant Results 11:51
- 98 First Class Search: Forum Integration 11:02
- 99 WYSIWYG 15:29
- 100 WYSIWYG: Part 2 12:12
- 101 Sanitizing is a Must 19:29
- 102 Onward 01:58
Related courses
-
Updated 2y agoVue.js + Laravel: CRUD with SPA
By: LaravelDailyMaster Vue.js with Laravel to build a single-page application. Learn SPA routing, components, and Axios to boost your full-stack skills.1 hour 50 minutes 29 seconds -
Updated 2y agoSAAS Adventure - Learn to Create your own SAAS
By: SaaS AdventureIn this 21-day program you will learn you how to create your very own SAAS application!8 hours 37 minutes 3 seconds -
Updated 2y agoBuild an e-commerce platform
By: CodecourseBuild a robust e-commerce platform with a Laravel API and Nuxt frontend. Products with flexible variations, proper price implementation, a full checkout experie14 hours 19 minutes 18 seconds 3 / 5