Build A Laravel App With TDD
It's time to take the techniques we learned in Laravel From Scratch, and put them to good use building your first real-world application. Together, we'll leverage TDD to create Birdboard: a minimal Basecamp-like project management app.
This series will give us a wide range of opportunities to pull up our sleeves and test our Laravel chops. As always, we start from scratch.
Series episodes
Meet Birdboard
2m 31sLet's begin by reviewing the application that we plan to build. We'll then finish up by installing...
Let's Begin With a Test
12m 48sMy hope is to demonstrate, as much as possible, my actual workflow when writing my own applications....
Testing Request Validation
5m 32sWe haven't yet written any request validation logic. As before, let's use a TDD approach for specifying...
Model Tests
7m 33sWe must next ensure that a user can visit any project page. Though we should start with...
A Project Requires An Owner
11m 17sIt's true that we can now create and persist projects to the database, but they aren't currently...
Scoping Projects
11m 39sIn this episode, we'll continue tweaking which projects are displayed to the user. We'll also begin implementing...
The Create Project View
6m 38sWe already have the necessary logic to persist new projects, however, we haven't yet created the "create...
Prepping the Frontend
8m 19sBefore I begin writing CSS, we first need to set the stage. We'll begin by pulling in...
Go Go Gadget Tailwind
16m 39sIn this episode, we'll leverage Tailwind to begin constructing the Birdboard UI.
Grid Spacing and Card Tweaks
16m 56sLet's continue working on the CSS for the projects dashboard. This will give us an opportunity to...
Styling the Project Page
12m 20sBefore we jump back to PHP, let's write one more lesson's worth of CSS. Specifically, we'll get...
A Project Can Have Tasks
15m 24sWe've added a section to our project page for tasks, but that functionality doesn't yet exist. It...
Task UI Updates
9m 11sThe next step is to update your project page UI to allow for displaying and adding new...
Task UI Updates: Part 2
18m 31sIn this episode, we'll wrap every task within a form so that we may easily update its...
Touch It
5m 5sI'd like to sort all projects in our dashboard according to those that have been most recently...
Notes and Policies
18m 4sNext up, we need to make the "General Notes" section of the project page dynamic. As always,...
Improve Test Arrangements With Factory Classes
16m 35sLet's take a moment to improve the structure of our tests. Have you noticed that, time and...
Reduce Form Duplication
14m 6sIn this lesson, we'll add a form to update an existing project. But in the process, we'll...
Sometimes Validation With Form Requests
12m 40sWe'll begin this episode by addressing a small regression that was introduced in the previous episode: we...
Project Activity Feeds
13m 39sLet's move on to our next feature: every project generates an activity feed. View the source code...
Project Activity Feeds: Part 2
13m 53sLet's continue working on the project activity feature. We should additionally record activity when a task is...
Project Activity Feeds: Part 3
5m 57sBefore moving on to the larger activity feed refactor, let's first make a few small tweaks to...
Project Activity Feeds: Cleanup
12m 8sWe have just a few loose ends to wrap up, before finally viewing the project's activity feed...
Rendering Activity With Polymorphism
10m 35sIt's time to render a project's activity feed on the page. This will give us an opportunity...
The Subject of the Activity
12mNow that we're successfully displaying a project's activity feed on the page, I'd like to provide more...
Recording Model Changes
15m 49sOur next job is to track which attributes have changed when a model is updated. This will...
Get Into The Refactor Flow
21m 47sIn this episode, we'll refactor all "activity" functionality to a reusable trait. As you'll see, we'll quickly...
Tweaking the Activity Card
13m 51sLet's work on tweaking the output of the activity card in this lesson. I'd like it to...
Authorized Users Can Delete Projects
7m 57sWe have an easy one this episode: users who have the proper permissions may delete or archive...
Layered Tests and Invitations
12m 43sAs we move on to inviting users to projects, this will give us a nice opportunity to...
Beware False Positives
14m 8sIn this episode, as we work to allow users to see all projects they've been invited to...
Gravatars and Helper Functions
7m 26sOur project page doesn't yet display all members who have access to it. Let's use Gravatar to...
Inviting Users as a Feature Test
15m 11sIn this episode, we'll write a few new feature tests to confirm the conditions under which a...
Validation Errors For Multiple Forms
13m 57sOnce you add multiple forms to a page, you'll quickly find that you can no longer depend...
Invited Users May Not Delete Projects
6m 3sIt looks like we have a small hiccup. At the moment, any invited user has permission to...
Easy Tailwind Themes Using CSS Variables
14m 6sWe have a relatively nice light theme at the moment. But what if we wanted to offer...
Completed Themes Review
2m 15sBehind the scenes, I've finished up our two themes. Before moving on to building the theme switcher,...
Build a Theme Switcher
15m 7sNow that we have multiple UI themes available to us, the next step is to construct a...
The New Project Modal
12m 20sBecause we're approaching the end of this series, let's dedicate a few episodes to reviewing some JavaScript-specific...
The New Project Modal: Behavior
17m 51sNow that the basic styling for the "New Project" modal is complete, we can move on to...
The New Project Modal: Tasks
4m 45sThere's one final step to complete: our controller doesn't yet allow tasks to be created alongside the...
Object-Oriented JavaScript
20m 44sIf we take another look at our NewProjectModal file, you'll notice that most of the JavaScript deals...
Make a Dropdown Vue Component
23m 27sLet's wrap things up by creating a reusable dropdown Vue component from scratch. View the source code...
Wrap it Up
1m 37sA series like this could go on for hundreds of hours, but, at some point, we have...




