Let's Build A Forum with Laravel

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.

Start Series For Free

Share this series on:

  • 01

    Episode 1 Run Time 7:59

    Initial Database Setup With Seeding

    Let's begin by reviewing the most minimal requirements for a forum. If you think about it, we couldn't possibly construct a forum without users, threads, and replies. So let's tackle those first.

    View the source code for this lesson on GitHub.

  • 02

    Episode 2 Run Time 9:26

    Test-Driving Threads

    Now that we have our seed data in place, we can move on to our first small feature: "a user should be able to read threads." Simple enough! We'll start with a basic test, and then scaffold the necessary views to make it pass.

    View the source code for this lesson on GitHub.

  • 03

    Episode 3 Run Time 9:09

    A Thread Can Have Replies

    Now that we've added a basic feature for users to read forum threads, we can next move on to viewing all replies associated with each thread. As before, we'll start with a test to describe our desired outcome.

    View the source code for this lesson on GitHub.

  • 04

    Episode 4 Run Time 17:39

    A User May Respond to Threads

    We've implemented the necessary functionality to render a thread with all relevant replies, but we haven't yet allowed a user to type in a reply and submit it to the server. Let's get started on that now.

    View the source code for this lesson on GitHub.

  • 05

    Episode 5 Run Time 5:14

    The Reply Form

    Now that we've tested the end-point for adding a new reply, the only remaining step is to create the HTML for the form. In the process, we'll also ensure that only logged-in users are able to see it.
  • 06

    Episode 6 Run Time 6:13

    A User May Publish Threads

    So far, a user can read and reply to threads, but they don't yet have the ability to publish their own threads. Let's begin fixing that in this episode.

    View the source for this lesson on GitHub.

  • 07

    Episode 7 Run Time 5:43

    Let's Make Some Testing Helpers

    I'm a big fan of making the process of writing tests as natural as humanly possible. The harder it is to construct a test, the more likely it is that you simply...won't. With that in mind, let's extract a few helpers and snippets to assist us.

    View the source for this lesson on GitHub.

  • 08

    Episode 8 Run Time 7:54

    The Exception Handling Conundrum

    Now that our endpoint tests are returning green, we can construct the HTML form to publish a new thread. However, in the process, we'll stumble upon an odd exception handling issue that needs to be addressed. Luckily, Adam Wathan has a useful solution that we can implement.

    View the source code for this lesson on GitHub.

  • 09

    Episode 9 Run Time 14:12

    A Thread Should Be Assigned a Channel

    Right now, all threads are thrown into the same "global" namespace, so to speak. Ideally, we should assign each thread to a channel. That way, for a development forum, we may easily filter threads by PHP, or JavaScript, or Servers.

    View the source for this lesson on GitHub.

  • 10

    Episode 10 Run Time 10:41

    How to Test Validation Errors

    We haven't written any validation logic yet for our forum. This means that a user could whip up a request with all sorts of invalid data, and we'd gladly persist it to the database. Let's fix that in this episode, while writing tests to ensure that everything functions as we expect.

    View the source for this episode on GitHub.

  • 11

    Episode 11 Run Time 13:25

    Users Can Filter Threads By Channel

    Now that we've associated all threads with a channel, we can now perform the necessary UI updates to allow users to filter threads by their desired channel.

    View the source for this lesson on GitHub.

  • 12

    Episode 12 Run Time 8:24

    Validation Errors and Old Data

    In this episode, we need to do a bit of work on the "create thread" page. We'll first add a link to the navigation bar, and then move on to tweaking the form, itself. Specifically, we should provide validation error feedback, and ensure that any text that the user types into the form's various fields will be remembered if a validation error is triggered.
  • 13

    Episode 13 Run Time 3:00

    Extracting to View Composers New

    Currently, we have two different SQL queries for fetching all channels directly in our view layer. Let's fix that by extracting a dedicated view composer.
  • 14

    Episode 14 Run Time 7:37

    A User Can Filter All Threads By Username New

    It would be nice if any user could have a link that displays only the threads that they've personally created. Even beyond that, why not allow for the ability to view any forum user's threads? Let's figure out how in this episode.

    View the source code for this lesson on GitHub.

  • 15

    Episode 15 Run Time 18:47

    A Lesson in Refactoring New

    Since it seems that filtering will be an important component to our application, let's take a bit of time to perform some refactoring. Luckily, because we have a set of tests to back us up every step of the way, we can be as bold as we wish. There's no fear of breaking the app, if your tests will notify you the second you make a refactoring error.

    View the source code for this episode on GitHub.

  • 16

    Episode 16 Run Time 9:19

    Meta Details and Pagination Coming Soon

    We should add a sidebar to each thread page for various meta information, such as when the thread was published, how many replies it has, and more. Further, we've yet to add pagination to our app. What happens when a thread has over one hundred replies? Let's ensure that we put the proper pagination links in place.

    View the source code for this episode on GitHub.

  • 17

    Episode 17 Run Time 11:51

    A User Can Filter Threads By Popularity Coming Soon

    It would be nice if users had the ability to filter all threads by popularity. That way, the most active threads will bubble to the top of the stack. Let's write a test and then implement this very feature.

    View the source code for this lesson on GitHub.

  • 18

    Episode 18 Run Time 15:46

    A User Can Favorite Replies Coming Soon

    It would be useful if authenticated users could have the ability to "favorite" any reply within a thread. Let's begin implementing that functionality now, by using polymorphic relations.

    View the source code for this episode on GitHub.

*Series still in development. Check back often for updates.