{"title":"ollieread.com - Laravel & PHP Expert","link":[{"@attributes":{"href":"https:\/\/ollieread.com"}},{"@attributes":{"href":"https:\/\/ollieread.com\/atom.xml","rel":"self","type":"application\/atom+xml"}}],"id":"https:\/\/ollieread.com","updated":"2026-07-02T15:49:59+00:00","author":{"name":"Ollie Read","uri":"https:\/\/ollieread.com"},"entry":[{"title":"You Probably Don't Need a Database Per Tenant","link":{"@attributes":{"href":"https:\/\/ollieread.com\/articles\/you-probably-dont-need-a-database-per-tenant"}},"id":"https:\/\/ollieread.com\/articles\/you-probably-dont-need-a-database-per-tenant","updated":"2026-06-27T00:00:00+00:00","published":"2026-06-27T00:00:00+00:00","summary":"There are many different ways to handle data separation and isolation when it comes to multitenancy, each with their own trade-offs. There's also a very common misconception that to achieve multitenancy, each tenant must have its own database. Not only is that not true, it's also often not the best approach."},{"title":"TheGamePanel: A Modern Alternative to Pterodactyl","link":{"@attributes":{"href":"https:\/\/ollieread.com\/articles\/thegamepanel-a-modern-alternative-to-pterodactyl"}},"id":"https:\/\/ollieread.com\/articles\/thegamepanel-a-modern-alternative-to-pterodactyl","updated":"2026-05-20T00:00:00+00:00","published":"2026-05-20T00:00:00+00:00","summary":"After years of working with existing game server panels, I'm building my own. The Game Panel is a modern alternative to Pterodactyl and Pelican, built from the ground up on a purpose-built PHP framework with a modular architecture designed for hosts and server owners alike."},{"title":"Composer Run Dev and Laravel Sail","link":{"@attributes":{"href":"https:\/\/ollieread.com\/articles\/composer-run-dev-and-laravel-sail"}},"id":"https:\/\/ollieread.com\/articles\/composer-run-dev-and-laravel-sail","updated":"2026-03-24T00:00:00+00:00","published":"2026-03-24T00:00:00+00:00","summary":"If, like me, you're a user of Laravel Sail for some of your Laravel projects, you'll have probably noticed that the \ndefault 'composer run dev' command that ships with Laravel, just won't work for you. Well, I've got a solution for \nyou!\n"},{"title":"Laravel's Route \"Model\" Binding","link":{"@attributes":{"href":"https:\/\/ollieread.com\/articles\/laravels-route-model-binding"}},"id":"https:\/\/ollieread.com\/articles\/laravels-route-model-binding","updated":"2025-12-03T00:00:00+00:00","published":"2025-12-03T00:00:00+00:00","summary":"A source-driven walkthrough of how Laravel resolves route parameters into model instances, covering the UrlRoutable interface and implicit binding customization."},{"title":"The Hidden Parts of Laravel","link":{"@attributes":{"href":"https:\/\/ollieread.com\/series\/the-hidden-parts-of-laravel"}},"id":"https:\/\/ollieread.com\/series\/the-hidden-parts-of-laravel","updated":"2025-12-03T00:00:00+00:00","published":"2025-12-03T00:00:00+00:00","summary":"Laravel's documentation is excellent, but it doesn't cover everything. Tucked away in the framework's source code are features that are either briefly mentioned or entirely undocumented. This series explores those hidden capabilities, how they work, and how you can use them in your own projects.\n"},{"title":"Manual Service Resolution in Laravel","link":{"@attributes":{"href":"https:\/\/ollieread.com\/articles\/manual-service-resolution-in-laravel"}},"id":"https:\/\/ollieread.com\/articles\/manual-service-resolution-in-laravel","updated":"2025-11-26T00:00:00+00:00","published":"2025-11-26T00:00:00+00:00","summary":"An examination of the various methods for manually resolving services from Laravel's service container, with recommendations on which to use."},{"title":"Laravel Middleware Priority","link":{"@attributes":{"href":"https:\/\/ollieread.com\/articles\/laravel-middleware-priority"}},"id":"https:\/\/ollieread.com\/articles\/laravel-middleware-priority","updated":"2025-11-19T00:00:00+00:00","published":"2025-11-19T00:00:00+00:00","summary":"An exploration of Laravel's undocumented middleware priority feature that controls execution order when multiple middleware pieces apply to a route."},{"title":"Decorating Services in Laravel","link":{"@attributes":{"href":"https:\/\/ollieread.com\/articles\/decorating-services-in-laravel"}},"id":"https:\/\/ollieread.com\/articles\/decorating-services-in-laravel","updated":"2025-11-11T00:00:00+00:00","published":"2025-11-11T00:00:00+00:00","summary":"How to use Laravel's undocumented extend method to add functionality to existing services without modifying their code."},{"title":"Introducing the Request-derived Context Pattern","link":{"@attributes":{"href":"https:\/\/ollieread.com\/articles\/introducing-the-request-derived-context-pattern"}},"id":"https:\/\/ollieread.com\/articles\/introducing-the-request-derived-context-pattern","updated":"2025-06-29T00:00:00+00:00","published":"2025-06-29T00:00:00+00:00","summary":"Defining the Request-derived Context Pattern, an architectural approach for extracting and managing contextual  information from HTTP requests.\n"},{"title":"Managing the Memory Usage of the Laravel Eloquent Identity Map","link":{"@attributes":{"href":"https:\/\/ollieread.com\/articles\/managing-the-memory-usage-of-the-laravel-eloquent-identity-map"}},"id":"https:\/\/ollieread.com\/articles\/managing-the-memory-usage-of-the-laravel-eloquent-identity-map","updated":"2025-06-10T00:00:00+00:00","published":"2025-06-10T00:00:00+00:00","summary":"Addressing memory management challenges when using a Laravel Eloquent identity map, particularly in scenarios involving large model hydration or Laravel Octane environments."},{"title":"Building An Eloquent Identity Map","link":{"@attributes":{"href":"https:\/\/ollieread.com\/series\/building-an-eloquent-identity-map"}},"id":"https:\/\/ollieread.com\/series\/building-an-eloquent-identity-map","updated":"2025-06-10T00:00:00+00:00","published":"2025-06-10T00:00:00+00:00","summary":"A two-part series walking through the implementation of an identity map for Laravel Eloquent. The first article  introduces the pattern, explains what it achieves, and builds a minimal implementation using a custom base model  class. The second article follows up on the memory implications of that implementation, covering how to manage and  prevent memory leaks, particularly in long-lived processes such as those powered by Laravel Octane.\n"},{"title":"Preventing Duplicate Model Instances in Eloquent","link":{"@attributes":{"href":"https:\/\/ollieread.com\/articles\/a-minimal-identity-map-for-laravel-eloquent"}},"id":"https:\/\/ollieread.com\/articles\/a-minimal-identity-map-for-laravel-eloquent","updated":"2025-05-21T00:00:00+00:00","published":"2025-05-21T00:00:00+00:00","summary":"Update a model in one place, and the change doesn't show in another? Eloquent creates duplicate instances of the same row; an identity map stops it."},{"title":"How to Hide Route Parameters from Controllers in Laravel","link":{"@attributes":{"href":"https:\/\/ollieread.com\/articles\/how-to-hide-route-parameters-from-controllers-in-laravel"}},"id":"https:\/\/ollieread.com\/articles\/how-to-hide-route-parameters-from-controllers-in-laravel","updated":"2025-05-05T00:00:00+00:00","published":"2025-05-05T00:00:00+00:00","summary":"How to use Laravel's forgetParameter() method to remove route parameters from the controller's scope after they've been processed."},{"title":"Avoiding Eager Loading When Registering Laravel Drivers","link":{"@attributes":{"href":"https:\/\/ollieread.com\/articles\/avoiding-eager-loading-when-registering-laravel-drivers"}},"id":"https:\/\/ollieread.com\/articles\/avoiding-eager-loading-when-registering-laravel-drivers","updated":"2025-05-05T00:00:00+00:00","published":"2025-05-05T00:00:00+00:00","summary":"How to defer driver registration in Laravel to avoid eager loading features on every request."},{"title":"Website revamp, new content and upcoming projects","link":{"@attributes":{"href":"https:\/\/ollieread.com\/articles\/website-revamp-new-content-and-upcoming-projects"}},"id":"https:\/\/ollieread.com\/articles\/website-revamp-new-content-and-upcoming-projects","updated":"2025-05-05T00:00:00+00:00","published":"2025-05-05T00:00:00+00:00","summary":"Announcing the blog relaunch, initial articles, and upcoming educational products."}]}