Navigated to New Pest, speaker bingo, and Laravel in Practice - Transcript

New Pest, speaker bingo, and Laravel in Practice

Episode Transcript

1 00:00:03,920 --> 00:00:08,780 This is the Laravel News Podcast, your one-stop podcast to find out about 2 00:00:08,780 --> 00:00:14,180 Laravel-related news, tutorials, packages, and more. Here are your hosts, Jake 3 00:00:14,180 --> 00:00:15,280 Bennett and Michael 4 00:00:15,280 --> 00:00:22,600 Dyrynda. 5 00:00:31,380 --> 00:00:38,040 Hello, friends and neighbors and loved ones. Welcome to Laravel News. This is 6 00:00:38,040 --> 00:00:42,540 -episode... -244. 7 00:00:43,500 --> 00:00:48,420 244, folks. It has been, uh, a bit of a rough start for us. Let's... I- I'm not 8 00:00:48,420 --> 00:00:53,060 gonna beat around the bush here. Okay? I was supposed to be on this call 26 minutes 9 00:00:53,060 --> 00:00:56,300 ago, and I woke up 12 minutes ago 10 00:00:57,120 --> 00:01:00,960 because... You know, I- I don't know, dude. I'm not sure if it's that time of 11 00:01:00,960 --> 00:01:03,470 year. I honestly do not know. It has been- 12 00:01:03,470 --> 00:01:04,1000 -No idea -... this week, I have been so 13 00:01:06,100 --> 00:01:10,730 tired. Yesterday, I was, like, I was in bed early 14 00:01:11,520 --> 00:01:16,860 and, like, woke up late this morning and then another... Like, just exhausted. I'm 15 00:01:16,860 --> 00:01:20,200 not sure if it's, like, the time, like, you know, changing of the seasons. I have 16 00:01:20,200 --> 00:01:24,080 no idea. My kids are feeling it too, though. Dude, I don't know. So- 17 00:01:24,080 --> 00:01:25,060 -Possibly. -Thank you. 18 00:01:25,060 --> 00:01:26,500 -I am. -Yeah. 19 00:01:26,500 --> 00:01:28,460 It was interesting listening to 20 00:01:30,000 --> 00:01:33,240 Ian Landsman on The Mostly Technical Podcast talking about, you know, 21 00:01:34,100 --> 00:01:38,940 having showers at night versus in the morning and how, because he has hay fever, 22 00:01:38,940 --> 00:01:40,760 -he showers before night to, like- -Oh 23 00:01:40,760 --> 00:01:44,060 ... make sure all of the pollen is out of the hair, so then you're not sleeping and 24 00:01:44,060 --> 00:01:47,1000 rolling around in the pollen. And it's, it's definitely getting to that time of 25 00:01:48,000 --> 00:01:52,600 year where we're, we are definitely getting the fits and starts of spring. So 26 00:01:52,600 --> 00:01:57,020 it was sunny yesterday, it rained this morning, but the sun's out today. Um, you 27 00:01:57,020 --> 00:02:00,720 know, we're losing the, the undergarments now. We're, you know, no more singlets, 28 00:02:00,720 --> 00:02:06,060 just long sleeves. It's supposed to be warm on, on the weekend. So, uh, all of 29 00:02:06,060 --> 00:02:09,880 this is fantastic, but it also means that the pollen is coming. And this- 30 00:02:09,880 --> 00:02:12,1000 -Mm-hmm, mm-hmm -... I cannot abide because- ... I'm, I, I 31 00:02:13,000 --> 00:02:18,1000 long for the days when I didn't have hay fever, and now it's quite severe. So time 32 00:02:19,000 --> 00:02:24,019 -to start loading up on antihistamines. -That's right. That's right. It is coming 33 00:02:24,020 --> 00:02:26,100 whether you want it to or not. So folks, 34 00:02:27,440 --> 00:02:32,480 welcome to the show. And, uh, I'm glad you're here. I'm glad to be here. Today is 35 00:02:32,480 --> 00:02:36,760 September 3rd, 2025. We are gonna get into it with releases, with news, with 36 00:02:36,760 --> 00:02:38,520 packages, with tutorials, 37 00:02:39,300 --> 00:02:40,160 as always. So 38 00:02:40,980 --> 00:02:46,280 let us start at the very top with releases. I'm gonna be talking about 39 00:02:46,280 --> 00:02:46,920 Laravel 40 00:02:47,680 --> 00:02:50,980 12.26. 41 00:02:51,880 --> 00:02:56,860 Soon as I get my- ... video in the right place. There it is. Okay. Here we are, 42 00:02:56,860 --> 00:03:03,460 folks. Laravel 12.26 released the week of August 26th, which has a withHeartbeat 43 00:03:03,460 --> 00:03:08,900 method to LazyCollections, a toPrettyJSON method to Collections, Models, and more, 44 00:03:08,900 --> 00:03:14,620 et cetera. Let's start with React and Vue Starter Kits, which now include Wayfinder. 45 00:03:14,620 --> 00:03:18,720 So Joe Tenenbaum updated the Laravel React and Vue Starter Kits to include a 46 00:03:18,720 --> 00:03:24,459 Laravel Wayfinder. What is Wayfinder, you might ask? Wayfinder provides a type-safe 47 00:03:24,460 --> 00:03:29,300 bridge between Laravel Routes and your front end. If you've ever used Ziggy 48 00:03:29,300 --> 00:03:36,220 before, uh, Wayfinder is Ziggy improved. It is Ziggy plus. Uh, it does a 49 00:03:36,220 --> 00:03:42,820 lot of amazing things. It makes the pieces of your back-end application available to 50 00:03:42,820 --> 00:03:47,310 your front end in a type-safe way. Not only Routes, but lots more. So you should 51 00:03:47,310 --> 00:03:50,440 definitely check that out. And it totally makes sense that it would now be included 52 00:03:50,440 --> 00:03:54,1000 in the Vue Starter Kits and React Starter Kits because that's where it's going to be 53 00:03:55,000 --> 00:03:59,220 most powerfully used. Right? So there you have it added to the Starter Kits. 54 00:03:59,220 --> 00:04:04,160 withHeartbeat method has been added to LazyCollections. Joseph Silver contributed 55 00:04:04,160 --> 00:04:07,480 the new withHeartBeat method to LazyCollections, which allows you to run a 56 00:04:07,480 --> 00:04:13,160 callback at regular intervals while the collection is being lazily enumerated. So 57 00:04:13,160 --> 00:04:18,120 his primary use case that he shared in the pull request is stated as such. In 58 00:04:18,120 --> 00:04:22,740 long-running tasks, such as bass- batch processing por- reports, you may need to 59 00:04:22,740 --> 00:04:26,200 hold a lock to prevent concurrent execution. However, if the code 60 00:04:26,200 --> 00:04:30,1000 unexpectedly fails to release the lock if you don't want it to persist indefinitely. 61 00:04:31,000 --> 00:04:33,880 So a common strategy is to acquire a short-lived lock, and then you 62 00:04:33,880 --> 00:04:38,380 periodically extend it while the task is still running. So an example is ac- 63 00:04:38,380 --> 00:04:42,120 requiring the lock for five minutes, then re-acquiring it every four minutes, 64 00:04:42,120 --> 00:04:46,170 assuming that a report never takes a full minute to generate. So instead of saying, 65 00:04:46,170 --> 00:04:48,520 "I'm going to lock that program indefinitely 66 00:04:49,140 --> 00:04:55,560 and then my, uh, I will unlock it once my task is done running." Like, you can think 67 00:04:55,560 --> 00:04:59,599 that, uh, when you do commands that are in the background, Laravel will do this 68 00:04:59,600 --> 00:05:03,360 actually. It will take a mutex, and it will store that mutex in the cache, and it 69 00:05:03,360 --> 00:05:05,120 will check itself to see 70 00:05:05,720 --> 00:05:09,160 if that command has finished yet. And if it hasn't, it won't allow it to overlap. 71 00:05:09,160 --> 00:05:12,620 Right? There might be some reason why you'd wanna do a lock like that. Well, in 72 00:05:12,620 --> 00:05:15,920 this case, instead of setting it for forever, just say, "Nope. We're just gonna 73 00:05:15,920 --> 00:05:18,700 leave... Have it for five minutes. We'll release it after that. And then every four 74 00:05:18,700 --> 00:05:21,620 minutes, we'll make sure that we reacquire that lock." So yeah, really 75 00:05:21,620 --> 00:05:25,060 interesting. The documentation's been updating to include this, uh, in dup- 76 00:05:25,060 --> 00:05:28,700 sorry. Has been updated to include this section about that new withHeartBeat 77 00:05:28,700 --> 00:05:32,240 method, but that's an interesting one there. Thank you, Joseph Silver. 78 00:05:32,240 --> 00:05:36,860 PrettyJSON method. Wendell Adriel contributed a toPrettyJSON method. What 79 00:05:36,860 --> 00:05:42,600 this does is it will, um, it will be implemented in all the places where the 80 00:05:42,600 --> 00:05:47,940 toJSON method exists. So for example, collections, models, JSON resources, 81 00:05:47,940 --> 00:05:53,332 paginators, et cetera. Uh, an example...From full request 56697 using 82 00:05:53,332 --> 00:05:57,072 collections where it previously would've had collection error to JSON, you can now 83 00:05:57,072 --> 00:06:02,592 say to pretty JSON. So, um, you know, we're all used to seeing the, the nasty 84 00:06:02,592 --> 00:06:06,272 output and then you copy and paste it over into Sublime and you say, "Set the syntax 85 00:06:06,272 --> 00:06:07,482 -to JSON," and pretty- -Full map 86 00:06:07,482 --> 00:06:08,732 -... you know, print sort of deal. -Mm-hmm. 87 00:06:08,732 --> 00:06:12,412 You don't have to do that anymore. It will just do it. You can do to pretty JSON. 88 00:06:12,412 --> 00:06:16,732 It'll give you a nicely formatted output there, uh, that is now available. Folks, 89 00:06:16,732 --> 00:06:21,932 that is the diff there for f- uh, version 12.26. Of course, you can see the full set 90 00:06:21,932 --> 00:06:27,072 of release notes on GitHub, if you care to. That's a good one. All right, dude. 91 00:06:27,072 --> 00:06:33,232 -Over to you. -Laravel 12.27 introduced things such as 92 00:06:33,232 --> 00:06:38,092 support for the SQS FIFO queue message group IDs, uh, which unlocked the ability 93 00:06:38,092 --> 00:06:43,912 to utilize Amazon's Fair Queue feature in SQS. Uh, we'll talk about that and more 94 00:06:43,912 --> 00:06:49,272 now. Nior Mohammed Zaki, one of the Laravel core team, contributed support for 95 00:06:49,272 --> 00:06:54,572 FIFO queue message group IDs. As mentioned, this enables Laravel SQS queue 96 00:06:54,572 --> 00:06:59,512 driver to utilize Amazon's Fair Queue feature. The Laravel documentation has 97 00:06:59,512 --> 00:07:04,012 been updated in kind with details on this and fair queues, and you can see the 98 00:07:04,012 --> 00:07:10,552 Amazon SQS documentation for more about them as well. Casey Dwyer contributed the 99 00:07:10,552 --> 00:07:15,012 ability to prepend the count when using the string plural method. So, often we've 100 00:07:15,012 --> 00:07:18,871 done this thing where we wanted to say, like, number and then the string plural 101 00:07:18,871 --> 00:07:22,532 and then, you know, then we pass the count again and we do the thing. Now you can 102 00:07:22,532 --> 00:07:27,512 pass a third argument to the string plural method, which is a Boolean flag 103 00:07:27,512 --> 00:07:31,671 defaulting to false to preserve backwards compatibility, which will automatically do 104 00:07:31,671 --> 00:07:36,972 this for you so you don't need to do the concatenation dance there. So thank you, 105 00:07:36,972 --> 00:07:43,171 Casey Dwyer, for that one. Uh, Jake just spoke about the pretty JSON functionality 106 00:07:43,171 --> 00:07:49,332 that was added in Laravel 12.26. Lucas Michaud contributed the ability to pass 107 00:07:49,332 --> 00:07:53,652 additional parameters to the pretty JSON method, giving developers more control 108 00:07:53,652 --> 00:07:58,192 over encoding when using this method. Uh, so this is a unary 109 00:07:59,092 --> 00:08:03,712 type that you can pass through with a bunch of PHP-defined options that allow 110 00:08:03,712 --> 00:08:07,912 you to manipulate what that pretty JSON looks like. Obviously by default it is to 111 00:08:07,912 --> 00:08:11,912 format it, but you can also pass, uh, parameters to do things like, uh, 112 00:08:11,912 --> 00:08:17,392 unescaped Unicode characters and so on. So thank you to Lucas for that. And last up 113 00:08:17,392 --> 00:08:21,611 in our notes here, Jesper Nordset contributed support for enum values in 114 00:08:21,611 --> 00:08:26,552 collection countBy and groupBy methods by converting them to strings or ints as 115 00:08:26,552 --> 00:08:31,272 array keys. So we've seen backed enums throughout the framework, uh, everywhere, 116 00:08:31,272 --> 00:08:34,152 so this allows you to do countBy key and then pass 117 00:08:35,092 --> 00:08:41,052 enums directly into those, um, arrays as values and it will handle the casting to 118 00:08:41,052 --> 00:08:46,291 n- numeric values for you when you call something like all, for example. But also 119 00:08:46,291 --> 00:08:50,352 giving the ability to implicitly count without having to pass a, a closure and, 120 00:08:50,352 --> 00:08:52,232 and handling that for yourself manually. 121 00:08:52,912 --> 00:08:55,622 That's all we have for releases this week. 122 00:08:57,172 --> 00:09:03,052 All right, folks. Um, this is not a Laravel release, but it is a release 123 00:09:03,052 --> 00:09:06,531 nonetheless. And we are so excited about it, we actually have it listed twice in 124 00:09:06,531 --> 00:09:12,932 our show notes, which is that Pest 4 has now been officially released. So this is 125 00:09:12,932 --> 00:09:16,312 going to allow you to get started if you... Let's, let's back up. In case 126 00:09:16,312 --> 00:09:22,412 you've been living under a rock for the last couple years, Pest is a 127 00:09:22,892 --> 00:09:24,122 new and improved 128 00:09:24,812 --> 00:09:30,712 version of PHPUnit. Can I say that? I think so. It's built on top of PHPUnit. 129 00:09:30,712 --> 00:09:35,992 Pest 4 is in fact built on top of PHPUnit 12. Um, it's a superset of that, right? So 130 00:09:35,992 --> 00:09:41,992 it runs on PHPUnit but it allows for this beautiful syntax. Um, it takes care of a 131 00:09:41,992 --> 00:09:46,712 lot of the things. It's, it's actually not, um, Laravel specific, right? It's not 132 00:09:46,712 --> 00:09:51,252 locked to Laravel, it's, it's available for use in, uh, other testing 133 00:09:51,252 --> 00:09:54,212 environments. Anything where you would use PHPUnit you could use Pest. Really, 134 00:09:54,212 --> 00:09:57,732 really good stuff. Was, what, what's different about Pest 4 that we care about? 135 00:09:57,732 --> 00:10:03,291 Let's talk about that. So, the big thing about Pest 4 is browser testing. So this 136 00:10:03,291 --> 00:10:07,310 is, um, the brand new feature that's unlocked allowing you to run tests in your 137 00:10:07,312 --> 00:10:08,812 browser using 138 00:10:09,731 --> 00:10:14,612 not the old one. Uh, what was the old one? I'm trying to remember. It's like, you 139 00:10:14,612 --> 00:10:18,572 know, we use Chromeless, uh, browser. What was it? 140 00:10:18,572 --> 00:10:20,791 Yeah, it was browser... Eh, not browser. Dusk. 141 00:10:20,791 --> 00:10:22,791 -Headless, headless Chrome browser. -The headless... Yeah, it was- 142 00:10:22,791 --> 00:10:23,402 -Yeah, it was Dusk- -It was- 143 00:10:23,402 --> 00:10:26,152 ... but I'm trying to remember what the, uh... There was, like, Selenium, which was 144 00:10:26,152 --> 00:10:27,472 -the old school one. -Chromium, wasn't it? 145 00:10:27,472 --> 00:10:28,932 -Right? Yep. Yeah. -Is this what you're looking for? 146 00:10:28,932 --> 00:10:32,291 So there was like Selenium, which was old, old. And then you would use, like, 147 00:10:32,291 --> 00:10:35,852 Chromium, right, version. Like this headless browser Chromium sort of deal. 148 00:10:35,852 --> 00:10:40,592 -Mm-hmm. -This uses Playwright. So Playwright is a 149 00:10:40,592 --> 00:10:45,291 new version of, uh... We- we've talked about it on the show before, right? But it 150 00:10:45,291 --> 00:10:47,791 basically is a new and improved version of 151 00:10:48,752 --> 00:10:49,051 the old 152 00:10:49,752 --> 00:10:53,531 headless Chrome browser. I, again, I'm, I'm oversimplifying here, right? There's a 153 00:10:53,531 --> 00:10:57,652 lot of amazing benefits that we've talked about for why Playwright is, uh, a great 154 00:10:57,652 --> 00:11:03,031 choice moving forward. Um, but Nuno has done the hard work of wrapping up all 155 00:11:03,031 --> 00:11:08,702 those APIs and building them into Pest so that you can continue to use your new PHP, 156 00:11:08,702 --> 00:11:13,372 uh, your new favorite PHP testing framework, Pest, um, with Playwright. So 157 00:11:13,372 --> 00:11:16,912 really, really cool stuff here. So let's talk about what that is. End-to-end 158 00:11:16,912 --> 00:11:21,771 browser testing. You also have visual testing, so you can get visual diffs. 159 00:11:21,771 --> 00:11:26,192 Device testing, so you can say on iPhone it should look like this, on desktop it 160 00:11:26,192 --> 00:11:31,531 should look like this. Uh, code coverage with browser and unit tests. You can also 161 00:11:31,531 --> 00:11:36,972 launch a tinker session mid-test, which is really, really cool. Um, you can have 162 00:11:36,972 --> 00:11:43,932 test sharding, so, like, across your, um, CI actions. So you 163 00:11:43,932 --> 00:11:46,072 have this idea that you can run 164 00:11:46,872 --> 00:11:51,051 things in parallel, right? Um, you could always do that with PHPUnit or with 165 00:11:51,051 --> 00:11:58,040 Pest.... really difficult to accomplish browser tests. Um, but Pest will help with 166 00:11:58,040 --> 00:12:03,160 that and will allow you to run more than two instances in parallel by doing 167 00:12:03,160 --> 00:12:07,400 sharding, which basically means it will take your test suite, it will break it up 168 00:12:07,400 --> 00:12:11,600 into however many groups of things you want to run, and then you can run those 169 00:12:11,600 --> 00:12:15,659 all at the same time across different actions. So previously, because with 170 00:12:15,660 --> 00:12:18,720 GitHub Actions, you only have two processors at max that you could use for 171 00:12:18,720 --> 00:12:22,500 their test runners, you could only run two instances of parallel at a time, right? 172 00:12:22,700 --> 00:12:25,1000 With sharding, you can say, "I wanna run eight," and it'll spin up four different 173 00:12:26,000 --> 00:12:30,220 GitHub Action runners, and will allow you to run all of those at the same time. 174 00:12:30,220 --> 00:12:33,380 Really, really cool stuff, uh, and allows your test suites that used to take 30 175 00:12:33,380 --> 00:12:36,860 minutes down to, like, five minutes. Right? Uh, so there's a whole official 176 00:12:36,860 --> 00:12:42,540 announcement post if you were not able to catch, um, Nuno's release of Pest 4 live 177 00:12:42,540 --> 00:12:46,800 on stage at Laracon this year. We also have a link to that, so you can watch that 178 00:12:46,800 --> 00:12:51,300 on YouTube. So lots of really, really cool stuff. There is an announcement post 179 00:12:51,300 --> 00:12:54,500 that kind of goes over all the different things that I just talked about with far 180 00:12:54,500 --> 00:12:58,400 more detail. And then there's also an upgrade guide that was gonna allow you to, 181 00:12:58,400 --> 00:13:03,640 uh, go from Pest 3 applications to Pest 4 applications. And then lastly, I wanted 182 00:13:03,640 --> 00:13:10,340 to mention that Jason Mercuri, uh, Laravel Shift, has created a, a Dusk to 183 00:13:10,340 --> 00:13:15,420 Pest ta- uh, conversion, and so you can run that as well. That will attempt to 184 00:13:15,420 --> 00:13:20,600 take your Dusk tests and convert them over to your Pest v4 browser testing, uh, 185 00:13:20,600 --> 00:13:24,440 paral- uh, you know, browser testing equivalents. So good stuff on that. Lots 186 00:13:24,440 --> 00:13:28,900 of options there, lots of ways to get started, and really, really exciting, uh, 187 00:13:28,900 --> 00:13:32,680 -exciting stuff there. -Well, sure. Uh, I wanna say two things 188 00:13:32,680 --> 00:13:37,660 about sharding. Number one, the way you say it, uh, is very close to dangerous. So 189 00:13:37,660 --> 00:13:38,720 -just, uh- -Sharding 190 00:13:38,720 --> 00:13:41,330 -... just be careful there. Sharding. -How- I, I know. 191 00:13:41,330 --> 00:13:43,040 -Uh- -Like, it is a weird, it is a weird word. I 192 00:13:43,040 --> 00:13:46,460 don't know how else you would sa- shard? Is it sharding? How would you say it? 193 00:13:46,460 --> 00:13:51,140 You say shard. But, see, well, it... The D very- 194 00:13:51,140 --> 00:13:52,490 -I want, I want you to give me- -Comes close to a T 195 00:13:52,490 --> 00:13:53,540 -... the good version of it- -Sharding. 196 00:13:53,540 --> 00:13:54,410 -... and I want you to give me the bad- -Sharding 197 00:13:54,410 --> 00:13:57,620 -... version of it. -See, we, we, we... So there's, there's 198 00:13:57,620 --> 00:13:59,660 -sharding, right? But if- -Sharding. 199 00:13:59,660 --> 00:14:00,260 -The way- -Sharding. 200 00:14:00,260 --> 00:14:03,960 The way, the way you sha- sharding, the way you say sharding, it, it, it, it 201 00:14:03,960 --> 00:14:07,980 crosses into dangerous- ... inappropriate territory. So I just wanted to say that, 202 00:14:07,980 --> 00:14:10,129 -number one. -We need to have, like... We need to have, 203 00:14:10,129 --> 00:14:12,390 like... You know how, like, I say beta and you say beta? 204 00:14:12,390 --> 00:14:14,080 -Yeah. -Like, beta testers or whatever. 205 00:14:14,080 --> 00:14:15,420 -Uh-huh. -Like, we need to have an equivalent for 206 00:14:15,420 --> 00:14:20,900 this word. Is it, like, uh, I don't know. Like, how do you say it differently? I 207 00:14:20,900 --> 00:14:22,260 -don't know. -I, I don't think there's, there's an 208 00:14:22,260 --> 00:14:24,560 -answer. I just think it's, uh... Anyway. -Sharding. 209 00:14:24,560 --> 00:14:25,780 -But- -Maybe sharding. 210 00:14:25,780 --> 00:14:29,300 Sharding. So as part of, uh, some work that I'm doing at the moment, I did 211 00:14:29,300 --> 00:14:34,620 upgrade our code base from Pest3 to Pes- Pest4, which was mostly a straightforward 212 00:14:34,620 --> 00:14:39,570 transition. Obviously, Pest4 requires PHP unit version 12, which we had some- 213 00:14:39,570 --> 00:14:39,720 Okay, yep 214 00:14:40,400 --> 00:14:43,939 ... you know, interdependent issues, you know, dependency of a dependency of a 215 00:14:43,940 --> 00:14:48,159 dependency that we have forks of to, to keep alive because they technically only 216 00:14:48,160 --> 00:14:50,320 work for Laravel 6, and we're on Laravel 11. 217 00:14:51,000 --> 00:14:57,840 Um, but using the shard functionality inside of GitHub Actions took our test 218 00:14:57,840 --> 00:14:59,879 run... Like, it halved our test runtime. So it's- 219 00:14:59,880 --> 00:15:02,969 -Wow. That's incredible, yeah -... we've split our suite up into five. 220 00:15:02,969 --> 00:15:07,480 And so each shard runs for about two minutes. So our- 221 00:15:07,480 --> 00:15:10,960 -Okay -... total cumulative runtime for our test 222 00:15:10,960 --> 00:15:15,300 is about seven and a half minutes now, where it was 16 before. So it's a- 223 00:15:15,300 --> 00:15:17,020 -Wow. That's amazing -... it's a huge improvement, um- 224 00:15:17,020 --> 00:15:19,480 -Yeah -... just, just by turning that on. And 225 00:15:19,480 --> 00:15:22,660 then, obviously, we've got, you know, caching between, um, different test 226 00:15:22,660 --> 00:15:26,140 executions and things like that. But it's, uh... I, I haven't even looked- 227 00:15:26,140 --> 00:15:28,180 -That's amazing -... at the Playwright stuff yet. Uh, I 228 00:15:28,180 --> 00:15:32,700 know that our front end guys did a bit of work to convert all of the Cypress tests. 229 00:15:32,700 --> 00:15:37,900 Like, this was already underway before Pest4 was announced, so rewriting our 230 00:15:39,040 --> 00:15:43,360 Cypress test into Playwright. But now that Pest supports Playwright- 231 00:15:43,360 --> 00:15:45,820 -Yeah -... uh, on the back end, we can, we can 232 00:15:45,820 --> 00:15:49,420 now do more comprehensive end-to-end tests as well, which, which I'm really looking 233 00:15:49,420 --> 00:15:53,720 forward to. I think that will really, um, you know, for us specifically, but for the 234 00:15:53,720 --> 00:15:58,060 community at large, it's gonna make testing those things, making them robust, 235 00:15:58,060 --> 00:16:02,020 much, much more powerful across the board. 236 00:16:02,020 --> 00:16:06,520 Absolutely. Yep. Super excited. I, I can't wait to, to get in there and try it. Uh, 237 00:16:06,520 --> 00:16:10,379 we've got a couple things that we're prioritizing before we head to that, uh, 238 00:16:10,379 --> 00:16:14,100 as the next list on... or next item on the list. But we will get there. We have no 239 00:16:14,100 --> 00:16:17,080 doubt we will get there and, uh, take advantage of that. Super excited. I'll 240 00:16:17,080 --> 00:16:21,610 -keep you updated. -Mm-hmm. Yeah. Uh, the Laracon Australia 241 00:16:21,610 --> 00:16:26,220 2025 talk titles have been revealed. They're up on the website at 242 00:16:26,220 --> 00:16:31,260 laracon.au/schedule, and we have placed all of the titles up there. And so whilst 243 00:16:31,260 --> 00:16:34,1000 the speaker lineup has been announced, uh, already earlier this year, the talks 244 00:16:35,000 --> 00:16:39,080 themselves have until now been a mystery. And for an extra twist, we're not going to 245 00:16:39,080 --> 00:16:40,260 link the speakers 246 00:16:40,920 --> 00:16:44,640 with their talk titles until next month, which gives the opportunity, a chance to 247 00:16:44,640 --> 00:16:49,800 guess who's presenting what topic. And to make it fun for attendees, we're running a 248 00:16:49,800 --> 00:16:54,579 giveaway. If you can guess the correct pairings for each of the talks, you could 249 00:16:54,580 --> 00:16:59,240 win one of our very special limited edition hoodies to collect if you are 250 00:16:59,240 --> 00:17:05,540 attending in Brisbane this November. Entries close Sunday the 14th of November 251 00:17:05,540 --> 00:17:12,530 at 11:59 PM Eastern Standard Time. Uh, anyone can play this, of course, but only 252 00:17:12,530 --> 00:17:17,819 a, uh, attendee will be able to collect the prize. This year's theme is Level Up, 253 00:17:17,819 --> 00:17:21,019 and the program reflects a wide range of topics for developers looking to push 254 00:17:21,020 --> 00:17:25,319 their skills further. Tickets are still available, including a limited allocation 255 00:17:25,319 --> 00:17:29,560 of early bird tickets, which are now open to both individuals and small teams of up 256 00:17:29,560 --> 00:17:34,100 to four per, per transaction. And premium, bundle, and community sponsor tickets are 257 00:17:34,100 --> 00:17:37,880 still availble- available, along with group discounts for larger teams, which 258 00:17:37,880 --> 00:17:41,280 you can grab at laracon.au/tickets. 259 00:17:42,760 --> 00:17:48,120 Very good. Okay. So I'm gonna... Uh, I... That one, is that under news? Because I 260 00:17:48,120 --> 00:17:51,420 think it must have replaced one of the other links or something. I wanna make 261 00:17:51,420 --> 00:17:51,570 -sure- -Okay 262 00:17:51,570 --> 00:17:52,940 ... I'm in the right spot and not skipping. 263 00:17:52,940 --> 00:17:55,300 -Oh, yes. It is under news. I, uh- -Okay 264 00:17:55,300 --> 00:17:55,750 -... must have put the- -Okay. Gotta fix it 265 00:17:55,750 --> 00:17:58,080 ... wrong thing into the Notion document. I will fix now. 266 00:17:58,080 --> 00:18:02,360 Not a problem. Not a problem at all. Okay, folks. We are gonna move on to packages, 267 00:18:02,360 --> 00:18:06,952 shall we? So-Let's talk about ownership relationships between eloquent models with 268 00:18:06,952 --> 00:18:11,071 Laravel ownable. Michael, I feel like you might have had something like this back 269 00:18:11,072 --> 00:18:14,932 in the day. Did you have your own package that sort of did something like this? 270 00:18:14,932 --> 00:18:20,912 Yes, I had something similar. It was- it was much less comprehensive. Like, it was 271 00:18:20,912 --> 00:18:21,302 just 272 00:18:21,912 --> 00:18:27,012 an owned by thing, which, you know, you can realistically do using 273 00:18:27,012 --> 00:18:30,492 -Eloquence's method now. -Sure. 274 00:18:31,132 --> 00:18:31,312 Yeah. 275 00:18:32,292 --> 00:18:38,012 Sure. So, let's talk about this package. Um, Michael used to be a prolific package 276 00:18:38,012 --> 00:18:42,242 author back in the day. In fact, that is the story of how we met. Uh- 277 00:18:42,242 --> 00:18:44,772 -Mm-hmm. -Michael had an amazing nullable fields 278 00:18:44,772 --> 00:18:48,192 package, which just fit the bill for something I needed, and I was using it all 279 00:18:48,192 --> 00:18:52,412 the time. And every time I used it, I was like, "Michael, dude! This is so awesome. 280 00:18:52,412 --> 00:18:55,972 Thanks for making this." And I was like, "Hey, should we start a podcast? We should 281 00:18:55,972 --> 00:18:58,432 definitely start a podcast." "Are you going to Laracon?" I'm definitely going to 282 00:18:58,432 --> 00:19:02,022 Laracon, yeah. It's the start of a beautiful relationship, and it's been- 283 00:19:02,022 --> 00:19:02,972 -Long- -What? Like, eight years now? 284 00:19:02,972 --> 00:19:07,292 -It's 10 years. Be 10 years next year. -10 years? Dang. 10 years. Crazy, crazy. 285 00:19:07,292 --> 00:19:11,852 So, anyway, let's talk about ownership relationship packages. All right, Laravel 286 00:19:11,852 --> 00:19:16,591 Ownable package created by Abdulla Sawaliam, provides a flexible and 287 00:19:16,592 --> 00:19:20,352 straightforward way to manage ownership of any model by another model in your 288 00:19:20,352 --> 00:19:26,192 Laravel application. So, uh, a user might own, uh, another user in a 289 00:19:26,192 --> 00:19:31,212 manager-employee or manager-team member sort of relationship. Uh, you might have a 290 00:19:31,212 --> 00:19:37,792 user that owns a blog post, or a blog post that belongs to a user. Uh, key 291 00:19:37,792 --> 00:19:42,272 features of this package would be flexible ownership, meaning any model can own any 292 00:19:42,272 --> 00:19:47,412 other model. You can transfer ownership between different owners. You can also 293 00:19:47,412 --> 00:19:52,612 keep track of those ownership changes over time. Think like a ownership history log. 294 00:19:52,612 --> 00:19:57,012 You can easily retrieve the current owner of any ownable item. You can check the 295 00:19:57,012 --> 00:20:01,552 ownership status and manage multiple ownables in bulk operations. It will 296 00:20:01,552 --> 00:20:05,372 automatically clean up ownership records when models are deleted, so it'll take 297 00:20:05,372 --> 00:20:08,692 care of, like, that cascading problem there. And then it also has facade 298 00:20:08,692 --> 00:20:13,212 support, you can use the convenient owner facade for ownership operations. So, 299 00:20:13,212 --> 00:20:18,112 there's some example usages in here. Uh, it's- it's quite simple, where you are 300 00:20:18,112 --> 00:20:23,012 going to implement an owner contract. You use a trait of 'has ownables' and then you 301 00:20:23,012 --> 00:20:27,732 have a 'is ownable', uh, trait that you can use in an ownable contract for the 302 00:20:27,732 --> 00:20:31,792 other side of that relationship. So we have a user, which has a owner contract, 303 00:20:31,792 --> 00:20:35,792 and then you have a task, which is a ownable contract. So with those two things 304 00:20:35,792 --> 00:20:39,912 in place, then you can say, "User, give ownership to task." So you could say, you 305 00:20:39,912 --> 00:20:43,372 know, in very plain English, "Giving a user ownership of a task," or you can 306 00:20:43,372 --> 00:20:46,752 transfer that to another user. You can get the current user. You can remove 307 00:20:46,752 --> 00:20:50,752 ownership, just as you would assume. Uh, but it's very, very simple. The API looks 308 00:20:50,752 --> 00:20:54,632 really nice there, and you get all those things we talked about along with that, 309 00:20:54,632 --> 00:20:58,972 right? The ownership history, transfer operations, bulk operations, et cetera. So 310 00:20:58,972 --> 00:21:03,052 this is something you find yourself needing to do, uh, that would be really 311 00:21:03,052 --> 00:21:06,732 helpful for you to take a look at this package. Uh, you should definitely check 312 00:21:06,732 --> 00:21:08,832 that one out. Thanks, Yannick, for writing that up. 313 00:21:08,832 --> 00:21:09,152 Yeah. 314 00:21:10,372 --> 00:21:16,172 Larapath is a secure, fluent path builder for PHP, featuring senet- sanitization 315 00:21:16,172 --> 00:21:20,972 strategies and Laravel integrations for version 11 and above. The package's use 316 00:21:20,972 --> 00:21:25,372 case range from multi-tenant storage organization with privacy protection, file 317 00:21:25,372 --> 00:21:30,652 naming conflict resolution, and data loss prevention, among others. So this allows 318 00:21:30,652 --> 00:21:37,272 you to, using a base folder, so for example, pathbuilder::basestorage, you can 319 00:21:37,272 --> 00:21:42,472 add, uh, values using the add method. So for example, if you wanted to provide a 320 00:21:42,472 --> 00:21:47,712 path for a user at email.com, you can say that you want to use a sanitization 321 00:21:47,712 --> 00:21:52,012 strategy of hashed and then convert that to a string. And this will give you the 322 00:21:52,012 --> 00:21:57,832 path location storage/ and then the hashed value of the email address. It also 323 00:21:57,832 --> 00:22:02,312 allows you to create URL-friendly names by using slugification or converting to 324 00:22:02,312 --> 00:22:09,212 snake case, and allows you to create, uh, timestape- timestamp-based values 325 00:22:09,212 --> 00:22:14,812 for uniqueness. The package also includes a Laravel integration with a facade. Uh, 326 00:22:14,812 --> 00:22:18,452 it also includes validation and security, which automatically validates dangerous 327 00:22:18,452 --> 00:22:22,712 paths, as well as the possibility of manually checking a path. Main features 328 00:22:22,712 --> 00:22:26,992 include it being a security first package, built-in protection against directory 329 00:22:26,992 --> 00:22:30,912 traversal attacks. There is a fluent API providing clean, readable path building 330 00:22:30,912 --> 00:22:35,592 with method chaining. Sanitization strategies include hashing, slug, snake 331 00:22:35,592 --> 00:22:40,252 case, timestamp, as discussed. It is immutable in its operation, which provides 332 00:22:40,252 --> 00:22:44,812 thread-safe path building with no side effects. It uses the strategy pattern, 333 00:22:44,812 --> 00:22:48,672 meaning it has an extensible sanitization system that you can contribute to 334 00:22:48,672 --> 00:22:53,212 yourself. There is full type hits and IDE auto-completion, and a Laravel 335 00:22:53,212 --> 00:22:58,232 integration, of course, using the optional Laravel storage facade integration. You 336 00:22:58,232 --> 00:23:02,452 can get started with this package. We have links to GitHub and the documentation in 337 00:23:02,452 --> 00:23:05,612 -the show notes. -Very cool. Yeah, we actually had to do 338 00:23:05,612 --> 00:23:10,332 something like this ourselves, where we had to build this, um, sort of path 339 00:23:10,332 --> 00:23:14,811 builder out on a per tenant basis. So this is really interesting. Uh, I'll be, uh, 340 00:23:14,812 --> 00:23:18,811 I'll be digging in on this one to kind of figure out what pieces what maybe- might 341 00:23:18,812 --> 00:23:21,072 be able to pull out of this, or if this is something we can sort of replace our own 342 00:23:21,072 --> 00:23:23,892 implementation with wholesale. This looks really, really well done, so 343 00:23:24,512 --> 00:23:29,292 super cool. Uh, all right, let's talk about Smartcache. So, if you've ever had 344 00:23:29,292 --> 00:23:34,332 to cache large payloads, this might be something that you would want to look at. 345 00:23:34,332 --> 00:23:40,912 So the Smartcache package, uh, written by Ismail Azaran, is a caching optimization 346 00:23:40,912 --> 00:23:45,792 package which is designed to enhance how your application handles data caching. So 347 00:23:45,792 --> 00:23:50,252 it can intelligently manage large datasets by applying optimization techniques like 348 00:23:50,252 --> 00:23:55,192 compression and chunking and more. So think about if you had a large amount of 349 00:23:55,192 --> 00:23:59,292 data that you needed to cache. What this will do is it'll take that large data, it 350 00:23:59,292 --> 00:24:04,628 will attempt to optimize it, and then it will, after-... attempting to optimize it. 351 00:24:04,628 --> 00:24:09,018 It'll check the data size automatically, and if it needs to, what it can then do is 352 00:24:09,018 --> 00:24:13,508 it can take that data and chunk it into multiple pieces and store it in the cache 353 00:24:13,508 --> 00:24:17,628 in multiple pieces, and then it'll also store that metadata alongside of it. And 354 00:24:17,628 --> 00:24:20,808 then when you go to retrieve it, it'll look at that and say, "Do I need to 355 00:24:20,808 --> 00:24:24,208 retrieve multiple chunks? Yes, I do." Go ahead and grab all those, decompress it, 356 00:24:24,208 --> 00:24:28,748 and then present it to you on the front side. Um, so it basically just does all of 357 00:24:28,748 --> 00:24:32,448 that in the background for you. It has driver-aware optimization strategies, so 358 00:24:32,448 --> 00:24:37,008 if you have to be using Redis or File or databoy- database, it will handle 359 00:24:37,008 --> 00:24:40,628 different chunking and optimization techniques based on that driver. So you 360 00:24:40,628 --> 00:24:44,148 can look into the README to see kind of what's going on behind the scenes, but 361 00:24:44,148 --> 00:24:47,508 exactly what I described is what's happening, checking data size, compressing 362 00:24:47,508 --> 00:24:51,708 or chunking it, storing that optimization, uh, metadata for retrieval, 363 00:24:51,708 --> 00:24:57,368 and then reconstructing that on the, uh, way out. So the API is very similar, uh, 364 00:24:57,368 --> 00:25:02,368 to Laravel's cache facade. The only thing is that you use the facade smart-cache 365 00:25:02,368 --> 00:25:07,048 instead of cache.put, get, same things that you're used to using with cache. So 366 00:25:07,048 --> 00:25:10,268 definitely check this one out if that's something you're run into before. 367 00:25:10,268 --> 00:25:11,968 Yeah. 368 00:25:12,208 --> 00:25:18,988 The Laravel zxcvbn package is a validation rule that estimates password 369 00:25:18,988 --> 00:25:21,448 strength using a PHP port of Dropbox's 370 00:25:22,088 --> 00:25:28,088 zxcvbn JavaScript package. It considers using user inputs as well to determine a 371 00:25:28,088 --> 00:25:34,148 score for password guessability. You can define a zxcvbn_minscore configuration 372 00:25:34,148 --> 00:25:37,768 value in your environment value to determine when validation should fail and 373 00:25:37,768 --> 00:25:41,907 based on the scale provided by the underlying package. Uh, the default is 374 00:25:41,908 --> 00:25:45,088 three, but depending on your needs, you can configure it to match any of the 375 00:25:45,088 --> 00:25:48,628 following. I'm not gonna read through all of the values zero through four, but zero 376 00:25:48,628 --> 00:25:53,328 means the password is extremely guessable. It is a dictionary word like password or 377 00:25:53,328 --> 00:25:59,228 mother, and they will score a zero value. Uh, all the way up to four, being very 378 00:25:59,228 --> 00:26:03,038 unguessable with the estimated number of guesses in the order of 10 to the power of 379 00:26:03,038 --> 00:26:08,068 10, and provides strong protection from offline slow hash scenarios. It is 380 00:26:08,068 --> 00:26:11,228 important to remember that Laravel has excellent password rules out of the box, 381 00:26:11,228 --> 00:26:14,988 including the ability to ensure a password was not present in a previous data leak. 382 00:26:14,988 --> 00:26:18,068 You can see the documentation for more details, and we'll have links to this 383 00:26:18,068 --> 00:26:21,368 package in the show notes for you as well. 384 00:26:21,368 --> 00:26:26,168 Awesome. Let's talk about spies. So spies many times is considered, uh, something 385 00:26:26,168 --> 00:26:32,468 that you would, uh, think about in context of a testing environment, and this is not 386 00:26:32,468 --> 00:26:37,628 what we're talking about here. What we're talking about is an HTTP spy. So the 387 00:26:37,628 --> 00:26:41,608 Laravel Spy package is a lightweight package that will allow you to track and 388 00:26:41,608 --> 00:26:47,668 then log any outgoing HTTP requests in your application. So you can launch this 389 00:26:47,668 --> 00:26:51,648 with zero config, uh, so you can just install it, and it'll immediately start 390 00:26:51,648 --> 00:26:56,478 logging these requests. Uh, they could be really useful for debugging and monitoring 391 00:26:56,478 --> 00:27:01,048 any external API calls that are made from within your own application. But if you 392 00:27:01,048 --> 00:27:05,048 are a discerning developer, you might be thinking of a couple of things that that 393 00:27:05,048 --> 00:27:09,948 could cause problems with immediately, such as sensitive fields, right? If you're 394 00:27:09,948 --> 00:27:13,378 sending a request out and you have sensitive fields that are a part of that 395 00:27:13,378 --> 00:27:17,248 request, wouldn't you want to obfuscate those? And the answer is, of course you 396 00:27:17,248 --> 00:27:21,588 would. So that is where you do the configuration. So you can configure which 397 00:27:21,588 --> 00:27:25,248 URLs are included that you're interested in logging. Maybe you don't want to log 398 00:27:25,248 --> 00:27:29,988 every outgoing request. You only want to log certain URLs that are going to be put 399 00:27:29,988 --> 00:27:33,788 into the log, and you can do that. You can also ensure that sensitive fields are 400 00:27:33,788 --> 00:27:37,348 obfuscated by saying, "Here is the list of fields I would like- make- like to make 401 00:27:37,348 --> 00:27:41,548 sure are not included in the logging." Or if they are included, they're gonna be 402 00:27:41,548 --> 00:27:46,008 obfuscated so they're not usable by, um, you know, dangerous folks that might be 403 00:27:46,008 --> 00:27:50,348 looking at your database. The package uses a global middleware to accomplish this, 404 00:27:50,348 --> 00:27:53,388 and you can ensure that the requests are cleaned up in production by using the 405 00:27:53,388 --> 00:27:58,408 included spy clean artisan command. And, of course, Paul Redman, everyone's 406 00:27:58,408 --> 00:28:02,668 favorite human, is going to make sure, uh, that he recommends that you configure 407 00:28:02,668 --> 00:28:07,088 this package to remove those sensitive fields, uh, before you use this in your 408 00:28:07,088 --> 00:28:12,088 application. Really cool stuff there. Thanks, Paul, for writing that one up. 409 00:28:14,028 --> 00:28:18,608 Notable is a Laravel package that adds polymorphic note functionality to any 410 00:28:18,608 --> 00:28:22,508 eloquent model. It allows you to attach notes and comments to models with creator 411 00:28:22,508 --> 00:28:27,328 tracking, timestamps, and powerful query scopes. The package is helpful for any 412 00:28:27,328 --> 00:28:31,188 note-taking features you might need on a model or for tools like auditing logs and 413 00:28:31,188 --> 00:28:34,968 user feedback. It includes powerful query scopes, and you can easily add note 414 00:28:34,968 --> 00:28:39,608 support to a model using the hasNotables trait, which will give you the ability to 415 00:28:39,608 --> 00:28:44,308 call the addNote method when a customer adds a note. You can support agent 416 00:28:44,308 --> 00:28:50,088 responses in the context of a ticketing system or a support system. Uh, you can 417 00:28:50,088 --> 00:28:53,388 get notes with creator to get the conversation history. You get- can get 418 00:28:53,388 --> 00:28:57,608 notes from today, from this week, this month in a given range of s- of dates, and 419 00:28:57,608 --> 00:29:03,228 you can search notes for a particular message. Uh, polymorphic relationships 420 00:29:03,228 --> 00:29:07,928 allow you to attach notes to any eloquent model. Tracking of who created each note 421 00:29:07,928 --> 00:29:12,308 is also polymorphic. Automatic created at and updated timestamps are added for 422 00:29:12,308 --> 00:29:16,088 tracking of notes. There are powerful query methods for filtering notes. It is 423 00:29:16,088 --> 00:29:19,928 configurable, so you can customize table names through configuration. There is an 424 00:29:19,928 --> 00:29:24,888 easy integration using simple trace bait... trait-based... trace bait? 425 00:29:25,908 --> 00:29:26,458 -Trade-based- -Trace-based 426 00:29:26,458 --> 00:29:30,928 ... implementation, and it is ready for all of your Laravel applications from 427 00:29:30,928 --> 00:29:35,708 version 10 and above. We'll have links to that for you in the show notes. 428 00:29:36,528 --> 00:29:37,068 Very cool. 429 00:29:37,748 --> 00:29:42,248 This is, uh, interesting one. This package, I feel like I wished it existed 430 00:29:42,248 --> 00:29:48,868 way back in the day, um, and it may have, because it's actually using Bootstrap 431 00:29:48,868 --> 00:29:55,148 5 behind the scenes. Um, so if you still happen to be using Bootstrap, then this is 432 00:29:55,148 --> 00:29:59,308 great. Uh, if not, you might want to wait a little bit before using this one, 433 00:29:59,308 --> 00:30:03,768 because tails- Tailwind CSS support is coming soon. What exactly am I talking 434 00:30:03,768 --> 00:30:08,198 about?What we're talking about here is Formelo. So Formelo is a level package 435 00:30:08,198 --> 00:30:12,988 that is designed to automate the generation of forms. Instead of creating 436 00:30:12,988 --> 00:30:17,988 these forms manually with HTML, you can leverage eloquent models to define the 437 00:30:17,988 --> 00:30:21,758 structure of those forms. So you can think about, "Hey, here are the attributes that 438 00:30:21,758 --> 00:30:27,168 I have available to me for a eloquent model." All that information can then be 439 00:30:27,168 --> 00:30:32,468 used to say, "I am going to create an HTML form specifically for that eloquent 440 00:30:32,468 --> 00:30:36,468 model." Of course, that saves time, but also ensures consistency across your 441 00:30:36,468 --> 00:30:39,508 applications. So, according to the developer, Formelo was created for 442 00:30:39,508 --> 00:30:43,128 developers who need to generate forms quickly without the overhead of a complete 443 00:30:43,128 --> 00:30:48,128 admin panel but who also want a simpler, more intuitive API than complex form 444 00:30:48,128 --> 00:30:52,848 libraries. So the key features are that it has easy form definitions using Laravel 445 00:30:52,848 --> 00:30:58,267 classes. So if you can write an array, you can write a form definition. Uh, it will 446 00:30:58,268 --> 00:31:02,808 automatically render the form for you. It has support for various field types, such 447 00:31:02,808 --> 00:31:08,028 as dates, text fields, text inputs, text areas. Uh, it's got customizable widgets 448 00:31:08,028 --> 00:31:12,668 as well as mel- uh, as well as automatic error handling, and displaying and form 449 00:31:12,668 --> 00:31:16,348 validation integration, as I mentioned before. Bootstrap 5 by default, but 450 00:31:16,348 --> 00:31:21,348 Tailwind CSS is coming soon. So, the mini version of the tutorial here is that if we 451 00:31:21,348 --> 00:31:27,208 have an article, for example, you could create an article form that extends 452 00:31:27,208 --> 00:31:31,648 Formelo, and what you're gonna have there is a create method, you're going to have 453 00:31:31,648 --> 00:31:36,348 an edit method, and then you're gonna have a fields method. So, create, uh, and edit 454 00:31:36,348 --> 00:31:41,148 are going to define what type of verb it's gonna be, post or patch, uh, the 455 00:31:41,148 --> 00:31:44,408 action, the route where it's going to send that stuff, and then the fields, of 456 00:31:44,408 --> 00:31:49,048 course, is just what you would think. Here is the name of the field, here is the 457 00:31:49,048 --> 00:31:53,208 value it's gonna be coming through as, and then here is the label that you're going 458 00:31:53,208 --> 00:31:56,568 to have. If it's a select, of course, you're gonna have something like choices, 459 00:31:56,568 --> 00:32:00,088 um, et cetera. So if you already have a model, you can use an artisan command to 460 00:32:00,088 --> 00:32:04,848 generate this field for you automatically. You just artisan make formelo, and then 461 00:32:04,848 --> 00:32:09,068 pass along the model, model=article. It will go ahead and do its very best to 462 00:32:09,068 --> 00:32:12,768 guess which fields you're going to need there. It's gonna generate that form for 463 00:32:12,768 --> 00:32:17,227 you, and then you can use that by rendering the form inside your blade. 464 00:32:17,228 --> 00:32:20,808 What's that look like? Inside of your controller action, you're going to new up 465 00:32:20,808 --> 00:32:24,568 that form class that was just created for you. You're gonna pass that through to 466 00:32:24,568 --> 00:32:28,168 your front end blade. Uh, there is a little bit of work you're gonna have to do 467 00:32:28,168 --> 00:32:31,908 to set up. Uh, they're going to say, "Include Bootstrap 5 assets," make sure 468 00:32:31,908 --> 00:32:35,148 you do that. But also, you're gonna have to include the formelo styles and scripts 469 00:32:35,148 --> 00:32:38,708 using two directives that are included inside of the package. And then all you do 470 00:32:38,708 --> 00:32:40,308 is you $form 471 00:32:40,928 --> 00:32:44,828 render. So that's it. Uh, really, really simple there, and then it's gonna go ahead 472 00:32:44,828 --> 00:32:49,288 and generate the HTML that would be necessary in order for you to see those 473 00:32:49,288 --> 00:32:54,248 form values on the front end there. Um, so looks pretty interesting. I- I've not 474 00:32:54,308 --> 00:32:58,788 seen what the form looks like on a front end. I don't know how customizable that 475 00:32:58,788 --> 00:32:59,908 is, um, 476 00:33:00,968 --> 00:33:03,828 but if you're just looking for something sort of quick and, like, "Hey, we need 477 00:33:03,828 --> 00:33:07,368 just something that, that works," and- and whatever, and it's maybe internal use, 478 00:33:07,368 --> 00:33:11,508 I'm not exactly sure, may- maybe this works great for you. Uh, again, it doesn't 479 00:33:11,508 --> 00:33:14,708 have a whole lot to say about the customizability of the forms that it's 480 00:33:14,708 --> 00:33:18,948 creating. Um, maybe it does, maybe it doesn't. I'm not sure. But, um, in any 481 00:33:18,948 --> 00:33:23,148 case, seems like an interesting project. So, check that one up. Thanks, Yannick, 482 00:33:23,148 --> 00:33:23,808 for writing that one up. 483 00:33:24,588 --> 00:33:29,688 Yeah. Looking, looking at the, the GitHub, the README for it says that it is a 484 00:33:29,688 --> 00:33:33,328 comprehensive form generation and handling tool for Laravel applications that is 485 00:33:33,328 --> 00:33:35,068 inspired by Django Forms. 486 00:33:35,868 --> 00:33:39,548 Um, so it has built-in support for Bootstrap 5 and support for Ta- Tailwind 487 00:33:39,548 --> 00:33:45,628 CSS is coming soon. So, at the moment, it looks like, uh, Bootstrap Form, so maybe 488 00:33:45,628 --> 00:33:49,148 if you need it for your Laravel applications that are using Tailwind at 489 00:33:49,148 --> 00:33:54,168 the moment, hold off for the time being. But it does give you the ability to, uh, 490 00:33:54,168 --> 00:33:57,648 publish assets and things like that, so it's entirely possible that you can 491 00:33:57,648 --> 00:34:01,328 re-styler these things yourself. But, uh, keep an eye out on that, because, you 492 00:34:01,328 --> 00:34:04,888 know, we love a form builder. Makes life nice and easy. 493 00:34:04,888 --> 00:34:09,088 -Sure does. -Okay. Tutorial time. We have four 494 00:34:09,088 --> 00:34:14,787 tutorials. We have, uh, five framework reminders this week, and we spoke last 495 00:34:14,788 --> 00:34:18,238 week about the video series on, um, 496 00:34:19,548 --> 00:34:22,887 better... What- what- how did we, how did we term it? Let's have a look at the show 497 00:34:22,887 --> 00:34:26,967 notes last, last time. We was talking about, um... Oh, I just put a link to 498 00:34:26,968 --> 00:34:32,928 Twitter, which doesn't help. Um... Advanced Eloquent Mastery is the series 499 00:34:32,928 --> 00:34:38,328 that, um, Harris was building, and he has released now the first episode of that. So 500 00:34:38,328 --> 00:34:44,008 let us go through, uh, first off, the tutorials. Uh, first cab off the rank, 501 00:34:44,008 --> 00:34:48,048 adding autocomplete to your Laravel application. So if you've ever had to 502 00:34:48,048 --> 00:34:52,228 implement a search feature that has become hugely important for most applications 503 00:34:52,228 --> 00:34:57,408 these days, uh, make sure that you are valuing user experience so that users can 504 00:34:57,408 --> 00:35:01,508 search what they need to see without scrolling endlessly. In this tutorial, 505 00:35:01,508 --> 00:35:05,068 written by Abdulrazak, uh, Jamiu-Ideye, 506 00:35:06,028 --> 00:35:10,188 we will build a movie application that leverages MongoDB's Atlas Search with 507 00:35:10,188 --> 00:35:15,628 Laravel to build a rich text, uh, rich text-based search feature that allows 508 00:35:15,628 --> 00:35:19,788 users to search for movies by typing a few letters. 509 00:35:21,588 --> 00:35:23,488 Do you wanna take the rest or do you want me to just fly through them all? 510 00:35:23,488 --> 00:35:24,988 No, I'll- I'll go for the next one too. Yeah. 511 00:35:24,988 --> 00:35:25,798 -Perfect. -I'll- I'll get the next one. 512 00:35:25,798 --> 00:35:28,296 -Okay. -No problem. Um...And the next one we're 513 00:35:28,296 --> 00:35:34,555 looking at is the implementation of user confirmation dialogs in Laravel Livewire 514 00:35:34,556 --> 00:35:40,555 with the wire confirm property. So, uh, if you've ever had to do this before, you 515 00:35:40,556 --> 00:35:44,796 know, sometimes you reach for the default confirmation dialog that you get with 516 00:35:44,796 --> 00:35:49,356 JavaScript, which is very simple and works really well, but it's not super 517 00:35:49,356 --> 00:35:53,316 stylistically matching to maybe the rest of your UI, right? It just feels a little 518 00:35:53,316 --> 00:35:57,695 bit clunky sometimes. It's a native a- uh, you know, native JavaScript API, and so, 519 00:35:57,696 --> 00:36:01,936 eh, it, it's okay. But Livewire provides developers with an intuitive approach to 520 00:36:01,936 --> 00:36:06,256 implementing these confirmation dialogs with this wire confirm directive. So, uh, 521 00:36:06,256 --> 00:36:10,676 this feature addresses that common need for preventing accidental execution of the 522 00:36:10,676 --> 00:36:14,756 critical operations, like deleting things, uh, while also maintaining your 523 00:36:14,756 --> 00:36:18,976 code to be clean and declarative. So this, uh, tutorial is gonna go through how you 524 00:36:18,976 --> 00:36:23,196 can use that wire confirm directive seamlessly so that your code continues to 525 00:36:23,196 --> 00:36:28,496 stay clean and you get all the benefits of those confirmation dialogs. I will say 526 00:36:28,496 --> 00:36:34,716 that, uh, Flux has also been a godsend. We've been using, uh, Livewire Flux, and 527 00:36:34,716 --> 00:36:39,596 it has really been absolutely gorgeous and really nice to work with. So if you're 528 00:36:39,596 --> 00:36:43,756 looking, um... You know, this tutorial is excellent, for sure, but if you're looking 529 00:36:43,756 --> 00:36:48,326 for something that looks beautiful, functions really well, and is just, uh, 530 00:36:48,326 --> 00:36:51,676 really a pleasure to use straight outta the box, you should definitely check out 531 00:36:51,676 --> 00:36:55,216 Flux. A lot of hard work and effort has been put into that by Caleb and the team 532 00:36:55,216 --> 00:36:58,816 there, uh, at Livewire, so definitely check that one out, as well as this 533 00:36:58,816 --> 00:37:01,396 tutorial. Thanks, Harris Refotopoulos, for writing this one up. 534 00:37:02,236 --> 00:37:08,836 Yeah. Uh, what have I got here next? Optimizing Laravel Livewire performance 535 00:37:08,836 --> 00:37:14,036 with computed properties. Uh, so this is something that, that was, I think, in 536 00:37:14,036 --> 00:37:18,016 like, Livewire version two, it was a bit problematic, where it would always have to 537 00:37:18,016 --> 00:37:20,856 compute. If you were returning collections and things like that, it would 538 00:37:20,856 --> 00:37:26,676 have to keep doing these things all the time. Now Livewire provides you with a 539 00:37:26,676 --> 00:37:32,116 computed attribute that you can attach to your methods, and they will expose these 540 00:37:32,116 --> 00:37:37,596 things in such a way that they're not recalculated every time your component is 541 00:37:37,596 --> 00:37:41,866 re-rendered in the browser. So, uh, definitely check that out if you have ever 542 00:37:41,866 --> 00:37:45,716 run into, you know, the mysterious performance issues of your Livewire 543 00:37:45,716 --> 00:37:47,806 components before. 544 00:37:48,696 --> 00:37:53,116 Okay, last tutorial before we get into the framework reminders. This is by Samuel 545 00:37:53,116 --> 00:37:57,496 Stancil, really, really smart dude. And the title of this one is Using SQLite in 546 00:37:57,496 --> 00:38:03,116 Production with Laravel. So, SQLite is the actual default, I believe, now for 547 00:38:03,116 --> 00:38:06,836 Laravel. When you spin up a new application, it uses SQLite by default, 548 00:38:06,836 --> 00:38:10,446 and it is a really good database for many, if not most Laravel applications 549 00:38:11,116 --> 00:38:14,316 when it's well configured. And that's sort of the trick, right? We're gonna get to 550 00:38:14,316 --> 00:38:18,296 that, uh, but it can provide great performance even if your app has a lot of 551 00:38:18,296 --> 00:38:23,496 concurrent requests. But why would you use it over MySQL? When is SQLite going to be 552 00:38:23,496 --> 00:38:29,056 the best for you? Uh, what are the main benefits of SQLite? Um, et cetera, et 553 00:38:29,056 --> 00:38:33,656 cetera, and on you go. So, what do you need to be aware of when you're wanting to 554 00:38:33,656 --> 00:38:37,256 use this in production? Do you need to use something like Turso, which is like, 555 00:38:37,256 --> 00:38:41,716 hosted SQLite? So, if you've been interested in using SQLite in production 556 00:38:41,716 --> 00:38:44,696 and you want to know sort of the gotchas or the things that you need to be aware of 557 00:38:44,696 --> 00:38:48,056 before deploying this as your production database, you should definitely give a 558 00:38:48,056 --> 00:38:51,935 look through this tutorial. It's gonna talk about the different modes, uh, for 559 00:38:51,936 --> 00:38:57,726 SQLite that allow you to unlock really good potential performance, um, as well as 560 00:38:57,726 --> 00:39:02,656 like, rollback mode, data types that you can use inside of SQLite, um, 561 00:39:02,656 --> 00:39:06,536 transactions. By default, transactions don't acquire locks until you need them, 562 00:39:06,536 --> 00:39:10,616 for example, so how do you make sure that that's all set to go? Um, and, and just a 563 00:39:10,616 --> 00:39:15,076 couple other pieces that you would want, uh, if you were deploying this. So, recap. 564 00:39:15,076 --> 00:39:20,356 Using wall mode, mindful of data types, uh, use this override, uh, that he 565 00:39:20,356 --> 00:39:24,816 includes here only until PHP 8.5, but something you need to be aware of in any 566 00:39:24,816 --> 00:39:28,316 case. So, definitely check that one out if SQLite is something you've played around 567 00:39:28,316 --> 00:39:32,296 with and you'd like to deploy that to your production application. Uh, a couple 568 00:39:32,296 --> 00:39:36,306 things you're definitely gonna want to be aware of in that case. Thanks, Samuel, for 569 00:39:36,306 --> 00:39:39,376 writing that one up. And we've only got framework reminders left, my friend, so 570 00:39:39,376 --> 00:39:44,155 I'm gonna let you roll through there, and then we've got a video to cap off the end 571 00:39:44,155 --> 00:39:47,056 here. Um, and I'll let you take that one, too. 572 00:39:47,056 --> 00:39:53,556 Perfect. So, our five framework reminders this week. First up, enhanced queue job 573 00:39:53,556 --> 00:39:58,016 control with Laravel's throttlesExceptionsFailWhen method. We 574 00:39:58,016 --> 00:40:03,316 have streamlining application automation with Laravel's task sched- scheduler, 575 00:40:03,316 --> 00:40:06,656 Laravel's enhanced string validation with inverse methods, 576 00:40:07,356 --> 00:40:10,656 building cross-platform alerts with Laravel's notification framework, and 577 00:40:10,656 --> 00:40:16,016 preserving data integrity with Laravel's soft deletes for recovery and compliance. 578 00:40:16,016 --> 00:40:20,396 This is your homework for this week. It's always good to keep an eye out for 579 00:40:20,396 --> 00:40:25,216 Harris's, um, framework reminders where, you know, we will talk about things at a 580 00:40:25,216 --> 00:40:28,736 very high level, we will say, "This new feature has been introduced in this new 581 00:40:28,736 --> 00:40:34,116 release of the framework." Harris goes and spends a lot of time going through these 582 00:40:34,116 --> 00:40:38,256 kinds of things and fleshing them out, providing more content, providing, uh, 583 00:40:38,256 --> 00:40:43,056 visual aids, providing code examples and usage examples, and things like that, that 584 00:40:43,056 --> 00:40:47,556 we just don't have the capacity or the ability to do on the podcast without 585 00:40:47,556 --> 00:40:51,856 dragging each episode out to longer than it needs to be. So, definitely check those 586 00:40:51,856 --> 00:40:56,656 out. Keep your eyes peeled. It was great to catch up with and meet, uh, Harris 587 00:40:56,656 --> 00:41:01,526 face-to-face in Denver, uh, about a month ago now. So, uh, definitely check him out. 588 00:41:01,526 --> 00:41:06,996 He's a great guy and does some wonderful work. And speaking of Harris, as I said, 589 00:41:06,996 --> 00:41:12,016 he's started his, uh, new series. I believe it's been renamed now to Laravel 590 00:41:12,016 --> 00:41:17,156 in Practice. The first video, nine minutes in length give or take, talks about 591 00:41:17,796 --> 00:41:21,176 you, uh, how you can stop writing a bad controller. So, we've all written a 592 00:41:21,176 --> 00:41:24,735 controller, the one that's got, you know, 15 lines of business calculations that 593 00:41:24,736 --> 00:41:28,996 you've copied to three different places. In this latest, or this first video, he 594 00:41:28,996 --> 00:41:32,616 shows how Laravel's custom collection methods can transform these messy 595 00:41:32,616 --> 00:41:35,176 controllers into clean, reusable code 596 00:41:35,816 --> 00:41:40,136 that actually makes sense. This is a series that he's publishing on 597 00:41:40,756 --> 00:41:43,806 our YouTube channel. We have links to that for you in the show notes so you can, uh, 598 00:41:43,806 --> 00:41:50,156 like, subscribe, hit the bell, do all the things, uh, and keep your eyes out for 599 00:41:50,156 --> 00:41:51,156 that series. 600 00:41:52,516 --> 00:41:56,236 Excellent. Folks, that wraps us up, episode 244. Thanks so much for hanging 601 00:41:56,236 --> 00:42:01,636 out with us. You can find show notes for this episode at podcast.laravel-news/244. 602 00:42:01,636 --> 00:42:04,276 If you liked the show, we would really appreciate it if you'd rate it up in your 603 00:42:04,276 --> 00:42:07,196 podcatcher of choice. Five stars would be absolutely incredible. And of course, if 604 00:42:07,196 --> 00:42:10,216 you have any questions or comments, we'd love to hear from you on Twitter, on X, on 605 00:42:10,216 --> 00:42:13,336 Bluesky, all of the places, @MichaelDerenda, @JacobBennett, or 606 00:42:13,336 --> 00:42:19,236 @LaravelNews. All right, folks. Two weeks now, two weeks later, two weeks from now. 607 00:42:19,236 --> 00:42:21,696 We'll see you then. See ya. 608 00:42:21,696 --> 00:42:47,076 Bye.

Never lose your place, on any device

Create a free account to sync, back up, and get personal recommendations.