<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"><channel><title>christalks.dev latest posts</title><description>I am a full stack Laravel developer based 20 minutes outside of London, UK, with a passion for crafting custom software and exceptional user experiences since 2009. This blog details my continuous learning, journey, challenges, and solutions.</description><language>en-gb</language><link>https://christalks.dev/feed.rss</link><atom:link xmlns:atom="http://www.w3.org/2005/Atom" href="https://christalks.dev/feed.rss" rel="self"/><item><title>Fastrack your API integrations with the connector pattern</title><link>https://christalks.dev/post/fastrack-your-api-integrations-with-the-connector-pattern-3104af04</link><pubDate>Wed, 04 Feb 26 09:49:31 +0000</pubDate><description>Integrating with external APIs is a common task for a developer, but it can quickly become a hard to maintain mess! I’ve often found myself repeating the same boilerplate code across different projects—manually setting up headers, handling authentication, and formatting responses for every single endpoint.</description><guid>https://christalks.dev/post/item-3104af04</guid><enclosure url="https://christalks.dev/post/fastrack-your-api-integrations-with-the-connector-pattern-3104af04.jpg" type="image/jpeg"/></item><item><title>Seamless Password Migration: Shifting users from WordPress to Laravel</title><link>https://christalks.dev/post/seamless-password-migration-shifting-users-from-wordpress-to-laravel-132f22dd</link><pubDate>Thu, 29 Jan 26 12:44:58 +0000</pubDate><description>One of the biggest hurdles in migrating a legacy site is the users database. You want to move to Laravel, but you don't want to force every single user to reset their password the moment you go live. Here's how you can achieve this when migrating from WordPress!</description><guid>https://christalks.dev/post/item-132f22dd</guid><enclosure url="https://christalks.dev/post/seamless-password-migration-shifting-users-from-wordpress-to-laravel-132f22dd.jpg" type="image/jpeg"/></item><item><title>Creating a deployer ServiceAccount for your Kubernetes deployment</title><link>https://christalks.dev/post/creating-a-deployer-serviceaccount-for-your-kubernetes-deployment-e20bf4f7</link><pubDate>Fri, 21 Nov 25 11:32:57 +0000</pubDate><description>Kubernetes can be confusing and creating service accounts for deployment is no exception. In this quick guide, I show you how to create an authenticated service account for deploying to Kubernetes!</description><guid>https://christalks.dev/post/item-e20bf4f7</guid><enclosure url="https://christalks.dev/post/creating-a-deployer-serviceaccount-for-your-kubernetes-deployment-e20bf4f7.jpg" type="image/jpeg"/></item><item><title>Secure Your Webhooks in Laravel: Preventing Data Spoofing</title><link>https://christalks.dev/post/secure-your-webhooks-in-laravel-preventing-data-spoofing-fe25a70e</link><pubDate>Fri, 18 Apr 25 07:50:48 +0000</pubDate><description>Learn how to implement robust authentication using pre-shared keys and HMAC signatures to protect your webhook endpoints.</description><guid>https://christalks.dev/post/item-fe25a70e</guid><enclosure url="https://christalks.dev/post/secure-your-webhooks-in-laravel-preventing-data-spoofing-fe25a70e.jpg" type="image/jpeg"/></item><item><title>Using custom icons in FilamentPHP</title><link>https://christalks.dev/post/using-custom-icons-in-filamentphp-493b6100</link><pubDate>Mon, 17 Feb 25 12:07:46 +0000</pubDate><description>Sometimes, the standard Heroicon set just isn't enough. Here's how you can quickly and easily add additional vectors to your Laravel FilamentPHP project</description><guid>https://christalks.dev/post/item-493b6100</guid><enclosure url="https://christalks.dev/post/using-custom-icons-in-filamentphp-493b6100.jpg" type="image/jpeg"/></item><item><title>Setting up locale based routing in Laravel with middleware</title><link>https://christalks.dev/post/setting-up-locale-based-routing-in-laravel-with-middleware-a278d43a</link><pubDate>Thu, 23 Jan 25 13:23:32 +0000</pubDate><description>Laravel is an excellent framework that supports multilingual functionality out of the box - but it doesn't go as far as setting up the routing for you. Here's how you can achieve it with simple routing and middleware.</description><guid>https://christalks.dev/post/item-a278d43a</guid><enclosure url="https://christalks.dev/post/setting-up-locale-based-routing-in-laravel-with-middleware-a278d43a.jpg" type="image/jpeg"/></item><item><title>Testing responsive with TailwindCSS</title><link>https://christalks.dev/post/testing-responsive-with-tailwindcss-cee113ce</link><pubDate>Wed, 08 Jan 25 10:05:44 +0000</pubDate><description>If you're working on your responsive game, this tiny tooltip trick might be of use to you!</description><guid>https://christalks.dev/post/item-cee113ce</guid><enclosure url="https://christalks.dev/post/testing-responsive-with-tailwindcss-cee113ce.jpg" type="image/jpeg"/></item><item><title>Another pattern - lets talk about state machines</title><link>https://christalks.dev/post/another-pattern-lets-talk-about-state-machines-c8160e52</link><pubDate>Mon, 18 Nov 24 09:45:31 +0000</pubDate><description>The state machine pattern isn't something you often hear about, but its critical to almost every piece of technology you experience in every day life</description><guid>https://christalks.dev/post/item-c8160e52</guid><enclosure url="https://christalks.dev/post/another-pattern-lets-talk-about-state-machines-c8160e52.jpg" type="image/jpeg"/></item><item><title>What are interfaces, otherwise known as contracts in PHP?</title><link>https://christalks.dev/post/what-are-interfaces-otherwise-known-as-contracts-in-php-356e1508</link><pubDate>Sun, 17 Nov 24 21:56:11 +0000</pubDate><description>Interfaces - often known as contracts - felt like a big leap in the early days of programming. But it's good to know - they're not that scary!</description><guid>https://christalks.dev/post/item-356e1508</guid><enclosure url="https://christalks.dev/post/what-are-interfaces-otherwise-known-as-contracts-in-php-356e1508.jpg" type="image/jpeg"/></item><item><title>Using PHP Attributes to enhance the capabilities of Enums</title><link>https://christalks.dev/post/using-php-attributes-to-enhance-the-capabilities-of-enums-87109997</link><pubDate>Fri, 06 Sep 24 08:16:27 +0000</pubDate><description>PHP Attributes are a powerful feature of PHP &gt;= 8. In this example, I provide a brief introduction to using reflection to enhance your Enums with PHP attributes</description><guid>https://christalks.dev/post/item-87109997</guid><enclosure url="https://christalks.dev/post/using-php-attributes-to-enhance-the-capabilities-of-enums-87109997.jpg" type="image/jpeg"/></item><item><title>Integrating audit logs into your FilamentPHP admin panel</title><link>https://christalks.dev/post/integrating-audit-logs-into-your-filamentphp-admin-panel-2e964ae3</link><pubDate>Wed, 21 Aug 24 15:40:15 +0000</pubDate><description>Following on from my recent introduction to  my auditing package, I'm going to show how quick and easy it is to implement an audit log viewer into FilamentPHP admin panel</description><guid>https://christalks.dev/post/item-2e964ae3</guid><enclosure url="https://christalks.dev/post/integrating-audit-logs-into-your-filamentphp-admin-panel-2e964ae3.jpg" type="image/jpeg"/></item><item><title>Keeping track of activity on your Laravel project using Laravel Simple Auditing</title><link>https://christalks.dev/post/keeping-track-of-activity-on-your-laravel-project-using-laravel-simple-auditing-deb19469</link><pubDate>Fri, 16 Aug 24 15:18:31 +0000</pubDate><description>I recently wrote a package (Simple Laravel Auditing) with the aim of making it quick and easy to add auditing in your Laravel Application</description><guid>https://christalks.dev/post/item-deb19469</guid><enclosure url="https://christalks.dev/post/keeping-track-of-activity-on-your-laravel-project-using-laravel-simple-auditing-deb19469.jpg" type="image/jpeg"/></item><item><title>Leveraging Laravel's built in driver functionality</title><link>https://christalks.dev/post/leveraging-laravels-built-in-driver-functionality-a3210023</link><pubDate>Tue, 06 Aug 24 15:18:53 +0000</pubDate><description>Laravel makes heavy use of drivers for everything from session management to caching, and there's no reason why you shouldn't use it too!</description><guid>https://christalks.dev/post/item-a3210023</guid><enclosure url="https://christalks.dev/post/leveraging-laravels-built-in-driver-functionality-a3210023.jpg" type="image/jpeg"/></item><item><title>Installing custom node versions using Node Version Manager</title><link>https://christalks.dev/post/installing-custom-node-versions-using-node-version-manager-ab89311e</link><pubDate>Thu, 18 Jul 24 09:05:04 +0000</pubDate><description>Installing node is made easy with Node Version Manager. This simple tutorial details how you can quickly and easily setup Node JS anywhere</description><guid>https://christalks.dev/post/item-ab89311e</guid><enclosure url="https://christalks.dev/post/installing-custom-node-versions-using-node-version-manager-ab89311e.jpg" type="image/jpeg"/></item><item><title>How to utilise a powerful programming pattern in Laravel - the Action Pattern</title><link>https://christalks.dev/post/how-to-utilise-a-powerful-programming-pattern-in-laravel-the-action-pattern-c5934a81</link><pubDate>Tue, 02 Jul 24 16:35:33 +0000</pubDate><description>The action pattern is a common programming pattern that allows you to abstract code into elements known as actions. It's powerful and provides many advantages.</description><guid>https://christalks.dev/post/item-c5934a81</guid><enclosure url="https://christalks.dev/post/how-to-utilise-a-powerful-programming-pattern-in-laravel-the-action-pattern-c5934a81.jpg" type="image/jpeg"/></item><item><title>Installing Kubernetes Rancher with RKE2, Helm and Cert Manager</title><link>https://christalks.dev/post/installing-kubernetes-rancher-with-rke2-helm-and-cert-manager-6e2e39c5</link><pubDate>Mon, 24 Jun 24 14:47:02 +0000</pubDate><description>A quick and dirty guide to installing Rancher, complete with SSL certificate to manage your Kubernetes clusters</description><guid>https://christalks.dev/post/item-6e2e39c5</guid><enclosure url="https://christalks.dev/post/installing-kubernetes-rancher-with-rke2-helm-and-cert-manager-6e2e39c5.jpg" type="image/jpeg"/></item><item><title>Installing and safely upgrading Meilisearch to the latest version</title><link>https://christalks.dev/post/installing-and-safely-upgrading-meilisearch-to-the-latest-version-aa4327bf</link><pubDate>Tue, 18 Jun 24 14:33:05 +0000</pubDate><description>Meilisearch is an amazing open-source search engine with an intuitive API to rival the likes of Algolia. Upgrading can be scary, so I automated it with a bash script!</description><guid>https://christalks.dev/post/item-aa4327bf</guid><enclosure url="https://christalks.dev/post/installing-and-safely-upgrading-meilisearch-to-the-latest-version-aa4327bf.jpg" type="image/jpeg"/></item><item><title>Prefixing your medias storage paths with Spatie Media Library</title><link>https://christalks.dev/post/prefixing-your-medias-storage-paths-with-spatie-media-library-c5393b69</link><pubDate>Wed, 24 Apr 24 10:17:52 +0000</pubDate><description>I use Spatie Media Library - a lot - and one really useful technique is to have the same storage system, with environment prefixes</description><guid>https://christalks.dev/post/item-c5393b69</guid><enclosure url="https://christalks.dev/post/prefixing-your-medias-storage-paths-with-spatie-media-library-c5393b69.jpg" type="image/jpeg"/></item><item><title>Adding Google reCAPTCHA to Livewire components</title><link>https://christalks.dev/post/adding-google-recaptcha-to-livewire-components-fb3ac446</link><pubDate>Wed, 17 Apr 24 09:54:09 +0000</pubDate><description>Adding ReCaptcha to your forms is a necessary step when handling public form submissions, but adding it for Livewire is a little trickier. I'll explain how I go about this process.</description><guid>https://christalks.dev/post/item-fb3ac446</guid><enclosure url="https://christalks.dev/post/adding-google-recaptcha-to-livewire-components-fb3ac446.jpg" type="image/jpeg"/></item><item><title>Running Laravel's queue worker using a cron schedule</title><link>https://christalks.dev/post/running-laravels-queue-worker-using-a-cron-schedule-696b2e2e</link><pubDate>Thu, 04 Apr 24 08:34:53 +0000</pubDate><description>Queues are a powerful tool in the Laravel framework. Inherently, they require some setup - but what about smaller projects?</description><guid>https://christalks.dev/post/item-696b2e2e</guid><enclosure url="https://christalks.dev/post/running-laravels-queue-worker-using-a-cron-schedule-696b2e2e.jpg" type="image/jpeg"/></item><item><title>Using Laravel's sleep helper to save time</title><link>https://christalks.dev/post/using-laravels-sleep-helper-to-save-time-4b88299e</link><pubDate>Tue, 02 Apr 24 12:06:12 +0000</pubDate><description>API's can be a pain - throttling is an issue you'll often encounter, particularly with large datasets. One workaround is to enforce delays between execution</description><guid>https://christalks.dev/post/item-4b88299e</guid><enclosure url="https://christalks.dev/post/using-laravels-sleep-helper-to-save-time-4b88299e.jpg" type="image/jpeg"/></item><item><title>Creating helper functions in Laravel</title><link>https://christalks.dev/post/creating-helper-functions-in-laravel-39960c68</link><pubDate>Tue, 02 Apr 24 12:01:24 +0000</pubDate><description>A quick tip for adding globally available 'helper methods' in Laravel</description><guid>https://christalks.dev/post/item-39960c68</guid><enclosure url="https://christalks.dev/post/creating-helper-functions-in-laravel-39960c68.jpg" type="image/jpeg"/></item><item><title>Using Laravel's Lottery helper to rate limit error reporting</title><link>https://christalks.dev/post/using-laravels-lottery-helper-to-rate-limit-error-reporting-b0f28291</link><pubDate>Wed, 27 Mar 24 16:41:46 +0000</pubDate><description>I thought I'd share this quick tip as I'm in the process of building a system that handles large quantities of data. And with that, comes errors!</description><guid>https://christalks.dev/post/item-b0f28291</guid><enclosure url="https://christalks.dev/post/using-laravels-lottery-helper-to-rate-limit-error-reporting-b0f28291.jpg" type="image/jpeg"/></item><item><title>Efficiently testing components with Laravel Livewire's testing utilities</title><link>https://christalks.dev/post/efficiently-testing-components-with-laravel-livewires-testing-utilities-d8990a46</link><pubDate>Tue, 26 Mar 24 10:03:51 +0000</pubDate><description>I've been writing some tests to check my new subscription form functions as expected. I show how easy it is to write tests to make assertions against a Livewire component.</description><guid>https://christalks.dev/post/item-d8990a46</guid><enclosure url="https://christalks.dev/post/efficiently-testing-components-with-laravel-livewires-testing-utilities-d8990a46.jpg" type="image/jpeg"/></item><item><title>Deploying a Laravel Application with Deployer and GitHub Actions</title><link>https://christalks.dev/post/deploying-a-laravel-application-with-deployer-and-github-actions-718ece72</link><pubDate>Mon, 25 Mar 24 16:38:58 +0000</pubDate><description>I share a surprisingly simple zero-downtime deployment technique that utilises Deployer 7 and GitHub Actions to automatically and atomically deploy Laravel applications.</description><guid>https://christalks.dev/post/item-718ece72</guid><enclosure url="https://christalks.dev/post/deploying-a-laravel-application-with-deployer-and-github-actions-718ece72.jpg" type="image/jpeg"/></item><item><title>Rebuilding my trust in testing with GitHub Actions</title><link>https://christalks.dev/post/rebuilding-my-trust-in-testing-with-github-actions-8e5a9048</link><pubDate>Sun, 24 Mar 24 21:13:40 +0000</pubDate><description>As we make the switch from BitBucket to GitHub, I've been embracing GitHub Actions for automatic test running. I'm sharing our most commonly used test configuration.</description><guid>https://christalks.dev/post/item-8e5a9048</guid><enclosure url="https://christalks.dev/post/rebuilding-my-trust-in-testing-with-github-actions-8e5a9048.jpg" type="image/jpeg"/></item><item><title>Building a blog with Laravel</title><link>https://christalks.dev/post/building-a-blog-with-laravel-1018c9b2</link><pubDate>Fri, 22 Mar 24 16:45:56 +0000</pubDate><description>Detailing my decisions and choices when making this blog I give a quick insight into the technology stack that I chose and some of the reasons why.</description><guid>https://christalks.dev/post/item-1018c9b2</guid><enclosure url="https://christalks.dev/post/building-a-blog-with-laravel-1018c9b2.jpg" type="image/jpeg"/></item></channel></rss>
