
Clone the end-of-course Drupal code from the Learning Drupal as a framework repository, then install dependencies and set up a local site to explore the custom entity offers.
Learn to create dynamic menu links in Drupal 8-10 using menu plugins, including authenticated-only links, dynamic counts of offers, and caching considerations for performance.
Learn to enhance layout in a Drupal module by loading a global CSS with a second library via page attachments and adding body classes for the offer detail view.
Create a code-only bid entity in Drupal by defining a content entity module with owner and offer references, a bit amount, and revision support, powered by the Drupal Entity API.
Add server-side validation in Drupal to enforce the current highest bid on an offer by querying highest bids, loading offer data, and validating the submitted bid in the bidding form.
Extend entity teasers with dynamic variables in get price amount to reflect the offer’s highest bid, minimum price, and promo batch status.
Explore the entity validation API in Drupal to enforce constraints on saving entities, using an all fields required constraint and validator to prevent empty values from being saved.
Master rendering dynamic data with Drupal render arrays and tables in a block, using the request stack to show the current offer's bidding table via the renderer service.
Add a delete form for the bit entity and a delete link from the offer detail; use a core Ajax dialog to stay on the page and enforce owner-only deletion.
Learn to update a Drupal view with an ajax callback to delete, insert, or update records without refreshing the page, using ajax responses and view refresh triggers.
Explore the Drupal caching API to implement complex caching for entities and blocks using cache tags, cache contexts, and max age for precise invalidation.
Learn how Drupal dynamic cache operates on fuse listings and offer views, including entity-level invalidation, hits and misses, and time-based caching strategies to optimize performance.
Cache a custom bidding table block on a Drupal entity page per page using cache tags and contexts, and invalidate caches when new bids are added or the offer updates.
Invalidate a referenced offer entity's cache when saving or deleting a bit by adding post save and post delete logic and using Drupal core cache invalidation.
Learn how to cache menu items with a custom cache tag, using per-user cache context and targeted invalidation on offer entity save and delete.
Learn to implement Drupal middleware to create an HTTP filter that redirects users after login, using the middleware API, Symfony's HTTP kernel, and a stack-based login redirect service.
Customize the user registration in Drupal using a route subscriber to replace the core register form with a custom registration form, validating email, username, and password, and log in.
Wraps up a Drupal 8–10 advanced module development course with code explorations, updates toward Drupal ten, and notes on user profiles, view modes, redirects to edit, and event subscribers.
[Please read the table of contents first! Also the prerequisites are important]
In this hands-on course, an offer software where users are able to create offers and place bids will be created. The course builds further on the Udemy course "Drupal 8 & 9 module development: start with custom entities" but can be taken individually as well. Please read the table of contents to know what to expect!
Start Code and end code available, PDF with text per chapter
This is the best resource for custom module development with Drupal 8, 9, or 10.
Advanced topics like custom entities, entity forms, access control, events, caching, workflows, and many more are discussed while building actual software platform
After the course, you’ll be able to build robust and scalable software solutions of many kinds.
Stef Van Looveren has more than 10 years of expertise with Drupal.
I’ve been around in the drupal ecosystem for ten years and have supported in many ways: code contributing, blogging, sharing solutions on DrupalAnswers, and attending conferences. With this course, I share almost all of the knowledge I’ve built up so far since using Drupal 8 and 9.
My message is: "It struck me that there are so few good learning paths for drupal. With this course, I try to fill the gap. I gave it my best and I hope you will enjoy it!"