
Laravel News Podcast
·E241
Faster NativePHP, PHP pipes, and AI chat kits
Episode Transcript
1
00:00:03,959 --> 00:00:08,800
This is the Laravel News Podcast, your
one-stop podcast to find out about
2
00:00:08,800 --> 00:00:14,179
Laravel-related news, tutorials, packages,
and more. Here are your hosts, Jake
3
00:00:14,179 --> 00:00:15,959
Bennett and Michael Dyrynda.
4
00:00:31,019 --> 00:00:31,840
There it is.
5
00:00:32,880 --> 00:00:37,700
For those of you who happen to be watching
online, Mr. Dyrynda is currently holding
6
00:00:37,700 --> 00:00:37,899
up
7
00:00:38,540 --> 00:00:42,459
a little elephant that is... He's got a
name. Is it Bruno?
8
00:00:43,119 --> 00:00:43,580
Bruce.
9
00:00:44,180 --> 00:00:48,979
Bruce. Bruce the Elephant. If you've never
been to Laravel Australia before,
10
00:00:49,619 --> 00:00:55,039
you may not know who Bruce is. Bruce is
the official mascot of Laravel Australia,
11
00:00:55,039 --> 00:00:58,419
and Michael has recently commissioned an
LED sign
12
00:00:59,319 --> 00:01:05,179
of said Bruce, as well as the upcoming
theme of Laracon AU this year. So, pretty
13
00:01:05,179 --> 00:01:08,960
freaking awesome. If you're not watching
on- online, you should- you should check
14
00:01:08,960 --> 00:01:11,399
it out, 'cause it looks really, really
darn cool. Michael, tell us a little bit
15
00:01:11,399 --> 00:01:12,039
about this thing.
16
00:01:13,119 --> 00:01:15,899
Yeah, I had- I had this... When we- when
we started putting the branding together
17
00:01:15,899 --> 00:01:21,059
for this year, it was... We- we landed on
this notion of Level Up, and it- and it
18
00:01:21,059 --> 00:01:25,999
came together in a really, I think, clever
way, which maybe is a- is a discussion
19
00:01:25,999 --> 00:01:28,240
-for another podcast, but...
-Okay, sure.
20
00:01:28,880 --> 00:01:34,720
When I saw the final version of this Level
Up logo, or this, uh...
21
00:01:35,359 --> 00:01:37,400
-What do they call it? This l- lock up.
-Mm-hmm.
22
00:01:37,400 --> 00:01:39,939
'Cause we've got a couple of different-
we've got a couple of different lock ups
23
00:01:39,939 --> 00:01:43,439
for the Level Up logo, but this particular
one, which is a- which is a square where
24
00:01:43,439 --> 00:01:45,260
Bruce actually jumps up the ladder
25
00:01:45,919 --> 00:01:47,359
of the- of the level.
26
00:01:48,019 --> 00:01:52,119
I thought that's- that'd look really cool
as a sign, and so I- I found a place on
27
00:01:52,119 --> 00:01:52,560
Etsy
28
00:01:53,179 --> 00:01:57,759
that manufactures these LED signs, and I
just got it in- I just got the delivery
29
00:01:57,759 --> 00:02:03,279
yesterday, so. I haven't quite figured out
how to... There's- if- if you're watching
30
00:02:03,279 --> 00:02:06,319
the video, you can see there's, like, a
piece of paper on my wall here that-
31
00:02:06,319 --> 00:02:08,119
-Mm-hmm.
-Which is the template for where I need to
32
00:02:08,899 --> 00:02:13,959
put it on the wall, but I have no idea as
yet how I'm going to mount it, how I'm
33
00:02:13,959 --> 00:02:17,459
going to wire it up. Because each- each of
the 15 pieces of the-
34
00:02:18,079 --> 00:02:22,199
of the logo are individually wired with
LEDs. I've got to figure out how to kind
35
00:02:22,199 --> 00:02:26,539
of connect it all up, uh, and- and get it
on the wall without,
36
00:02:27,239 --> 00:02:31,559
um, damaging the sign, the wall, or
burning my house down. So, wish me luck.
37
00:02:31,559 --> 00:02:36,499
If you've- if you've had any experience
in- in wiring these things up, uh, reach
38
00:02:36,499 --> 00:02:38,039
out to me. If you can help, that'd be
great.
39
00:02:38,859 --> 00:02:40,399
Absolutely. It's gonna look awesome
though. I'm confident.
40
00:02:40,399 --> 00:02:43,119
It definitely seems like a good... All
right. It's gonna look great. Like, just-
41
00:02:43,119 --> 00:02:48,139
just seeing it, just the- the one piece
there. Um, maybe I'll share it on- on
42
00:02:48,139 --> 00:02:50,499
-Twitter. But...
-Absolutely. I said if there's anybody I
43
00:02:50,499 --> 00:02:52,519
know who could do it, it would be Michael
Dorinda.
44
00:02:52,519 --> 00:02:54,619
-We'll figure it out.
-Michael can figure it out.
45
00:02:54,619 --> 00:02:56,939
It definitely feels like a weekend
project, though.
46
00:02:56,939 --> 00:03:00,039
Yes. Yeah, yeah. It's gonna take a little
bit of time. Little bit of time. Well,
47
00:03:00,039 --> 00:03:04,779
episode 241 is what we're on, folks.
Thanks for joining us. July 14th, 2025 is
48
00:03:04,779 --> 00:03:08,839
the date. We've got some releases, some
news, some packages. All sorts of good
49
00:03:08,839 --> 00:03:14,819
tutorials, and they're coming your way
right now. Here we go. Episode 241,
50
00:03:14,819 --> 00:03:21,279
Releases, Laravel version 12.20. So,
Laravel team released this, with the
51
00:03:21,279 --> 00:03:23,439
ability to fail while throttling ...
52
00:03:25,399 --> 00:03:29,539
For a context remember method, the ability
to customize the collection pluck with
53
00:03:29,539 --> 00:03:33,579
the callback, and more. So let's start
with that remember context. Ben Askew
54
00:03:33,579 --> 00:03:37,799
contributed context remember, and remember
hidden functions, which will add the
55
00:03:37,799 --> 00:03:42,999
result of the provided closure to the
context, if not already present, and
56
00:03:42,999 --> 00:03:47,139
always return the result. So before, what
you'd have to do is you'd have to check to
57
00:03:47,139 --> 00:03:50,439
see if context... And context, again, is
something we've talked about on this show
58
00:03:50,439 --> 00:03:55,719
for quite some time. Uh, but context is a
Laravel class that you can now use, that
59
00:03:55,719 --> 00:04:01,539
will maintain the context of the, uh,
request. So you can say, "Add this to the
60
00:04:01,539 --> 00:04:05,779
context," it will persist for the
lifecycle of that request. And so, what
61
00:04:05,779 --> 00:04:10,419
you used to have to do is context has, and
you check to see if a key existed, and
62
00:04:10,419 --> 00:04:14,139
then if it didn't, then you would have...
Sorry, actually, let's- let's take the...
63
00:04:14,139 --> 00:04:17,959
Let's- let's dig in a bit here. If it did
have that, then you'd have to retrieve it.
64
00:04:17,959 --> 00:04:22,919
Otherwise, you'd have to go set it and
then return it, right? And so, that's-
65
00:04:22,919 --> 00:04:26,779
that's kind of what it was. It was- it was
not friendly. And so with this, you can
66
00:04:26,779 --> 00:04:31,359
now say, "Context remember," you can pass
in the key, then you can pass in a
67
00:04:31,359 --> 00:04:37,399
closure, which will either return the
value of that key, or will set it using
68
00:04:37,399 --> 00:04:41,579
the result of that closure. So it's really
much nicer. Thanks, Ben, for writing that
69
00:04:41,579 --> 00:04:41,959
one up.
70
00:04:43,099 --> 00:04:48,319
Balboa codes contribute doesn'tStartWith
and doesn'tEndWith string methods to the
71
00:04:48,319 --> 00:04:52,959
stringable classes, which are the
opposite, of course, of startsWith and
72
00:04:52,959 --> 00:04:56,759
endsWith. You can compare the value
against another string or an array of
73
00:04:56,759 --> 00:05:01,599
strings. It does exactly what it says.
Doesn'tStartWith, doesn'tEndWith, nice and
74
00:05:01,599 --> 00:05:02,119
simple there.
75
00:05:02,919 --> 00:05:07,539
Adding the failWhen method to the
ThrottlesExceptionQueueMiddleware. Michael
76
00:05:08,979 --> 00:05:12,419
Dza Jha... Oh boy, hmm.
77
00:05:13,499 --> 00:05:19,259
-Michael Japeridze.
-Ooh, man. Japeridze. Did you paste that
78
00:05:19,259 --> 00:05:21,379
into, like, some sort of... Nope.
79
00:05:22,159 --> 00:05:24,719
That's a really good one. That's a really
good one. Congra- congratulations.
80
00:05:24,719 --> 00:05:27,819
-It's good.
-Contributed a failWhen method to the
81
00:05:27,819 --> 00:05:29,799
ThrottlesExceptionMiddleware. So
currently, this middleware
82
00:05:30,719 --> 00:05:34,759
only allows for deleting the job when a
specific exception is thrown.
83
00:05:35,379 --> 00:05:38,959
There are occasions where you would want
to mark the job as failed instead. For
84
00:05:38,959 --> 00:05:43,599
instance, in the context of a job chain,
it may be desirable to fail a job when an
85
00:05:43,599 --> 00:05:47,679
exception is thrown so that the chain
stops executing rather than deleting the
86
00:05:47,679 --> 00:05:53,159
job from the chain there. So an example is
given, you have this middleware. Throttle
87
00:05:53,159 --> 00:05:58,647
the exceptions, delete when a-... fail
when, and so you can now do either one of
88
00:05:58,647 --> 00:06:03,668
those, uh, so that's really nice. Pull
request 56180 for details if you need.
89
00:06:03,668 --> 00:06:06,687
Additionally, the q- the queue
documentation also provides more
90
00:06:06,687 --> 00:06:10,168
information on using that throttles
exception middleware, which is really
91
00:06:10,168 --> 00:06:11,287
handy for these jobs.
92
00:06:11,927 --> 00:06:18,267
Uh, Punyabul Sha contributed a new fake
method to the queue facade that allows the
93
00:06:18,267 --> 00:06:24,267
same pattern used by the event facade. So
before, you'd have to queue fake, and
94
00:06:24,267 --> 00:06:27,827
then afterward, you'd have to do some
manual cleanup that was required. Now you
95
00:06:27,827 --> 00:06:32,208
can do queue fake for, and then you can
pass in a closure there. The original
96
00:06:32,208 --> 00:06:37,068
queue is automatically restored once
that's done. So it only fakes for that
97
00:06:37,068 --> 00:06:41,467
particular instance and then, uh, allows
you to do selective job faking there. It
98
00:06:41,467 --> 00:06:44,967
also allows your critical jobs to be
queued normally while you're faking the
99
00:06:44,967 --> 00:06:48,107
others. So, really nice, uh, really nice
addition there.
100
00:06:48,907 --> 00:06:55,727
Adding JSON serializable interface to the
URI class. Uh, Diva Marelis added the
101
00:06:55,727 --> 00:07:00,707
JSON serializable interface to the URI
class to make sure that it's properly
102
00:07:00,707 --> 00:07:04,028
converted to JSON when you're serializing
that.
103
00:07:04,767 --> 00:07:10,007
We've got the fluent class being made
iterable now. So this is, uh, this is
104
00:07:10,007 --> 00:07:14,568
introducing the iter- iterable contract to
the fluent class, which addresses a small
105
00:07:14,568 --> 00:07:19,867
paper cut when using fluent with loops.
So right now, you need to call toarray in
106
00:07:19,867 --> 00:07:23,927
order to iterate over that. Now the
settings property is iterable in Laravel
107
00:07:23,927 --> 00:07:27,167
12.20, so you don't have to do that
toarray before iterating over that
108
00:07:27,167 --> 00:07:27,747
anymore.
109
00:07:28,507 --> 00:07:33,127
The collection method was added to the
config repository. So Kennedy Tedesco
110
00:07:33,127 --> 00:07:36,387
contributed a collection method to return
a collection instance from the config
111
00:07:36,387 --> 00:07:43,268
repository. So now you can say
config.dodop.collection and then pass
112
00:07:43,268 --> 00:07:45,887
in the period-separated or the,
113
00:07:46,507 --> 00:07:50,287
um... This is, this is what's used inside
of Laravel when you're needing to sort of-
114
00:07:50,287 --> 00:07:50,807
Yeah
115
00:07:50,807 --> 00:07:51,747
-... dig into-
-The dot notation
116
00:07:51,747 --> 00:07:55,447
... dot notation. Thank you. That's what I
was searching for. Previously, you would
117
00:07:55,447 --> 00:07:59,468
have to collect the config array. Now you
can just do config collection-
118
00:07:59,468 --> 00:08:01,187
-Mm-hmm
-... and it will grab out a collection for
119
00:08:01,187 --> 00:08:02,987
-you.
-Yeah, I've done that a few times. This is
120
00:08:02,987 --> 00:08:03,327
nice.
121
00:08:03,947 --> 00:08:06,508
-That's super nice.
-These, these paper cuts, these little
122
00:08:06,508 --> 00:08:10,407
things that when you see it, when someone
submits the pull request and adds it to
123
00:08:10,407 --> 00:08:13,327
-the framework, you go, "Yeah, of course."
-Of course.
124
00:08:13,327 --> 00:08:15,447
How have, how have I been living without
this? Because the amount of times that
125
00:08:15,447 --> 00:08:19,807
I've done collect config, you know, in, in
my time, it's, uh,
126
00:08:20,487 --> 00:08:23,547
just if... I don't know. If you ever
repeat these things, just submit a pull
127
00:08:23,547 --> 00:08:23,987
request.
128
00:08:24,608 --> 00:08:28,687
Well, it is great too because, like, if
you're using configs in any sort of way
129
00:08:28,687 --> 00:08:32,667
that's more than just pulling a single
value from the config, there's many, many,
130
00:08:32,667 --> 00:08:35,647
many times where you're gonna need to
pull it into some sort of collection so
131
00:08:35,647 --> 00:08:39,448
you can iterate over and work with those
values or pull a specific piece out by
132
00:08:39,448 --> 00:08:39,887
-name-
-Yeah
133
00:08:39,887 --> 00:08:43,907
... or, uh, or you know, do some sort of
operations on them rather than just
134
00:08:43,907 --> 00:08:48,127
referencing them as static values. So, um,
had to do this a couple times myself, so
135
00:08:48,127 --> 00:08:51,507
this is really nice. Adding closure
support to the collection pluck method.
136
00:08:51,507 --> 00:08:54,807
Ralph J. Smith contributed an update to
the pluck method that allows
137
00:08:54,807 --> 00:08:59,147
customizations to the keys and the values
that are being returned from that pluck.
138
00:08:59,147 --> 00:09:02,687
Sounds, uh... Does just like what it
sounds like. You get that pluck passing a
139
00:09:02,687 --> 00:09:08,087
closure, then you can return, uh, whatever
you like from that. Um, so there you have
140
00:09:08,087 --> 00:09:12,247
that. Context blade directive, Martin
Bean contributed a context blade directive
141
00:09:12,247 --> 00:09:18,047
to determine if a context value exists
inside of a blade file, of course. So
142
00:09:18,047 --> 00:09:23,087
context canonical if it is. So it's like a
conditional set up, so instead of if
143
00:09:23,087 --> 00:09:28,467
context has the word canonical, then do
this. Nope, no longer needed. You just
144
00:09:28,467 --> 00:09:34,067
specify @context in your blade file, and
if the key that you pass in there exists,
145
00:09:34,067 --> 00:09:38,847
the following portion will then render.
Really nice there. Pull request 56146. Of
146
00:09:38,847 --> 00:09:43,407
course, you can see all of the changes and
fixes inside of the release notes for
147
00:09:43,407 --> 00:09:46,487
1219 and 1220 on GitHub.
148
00:09:47,407 --> 00:09:49,847
-There you have it.
-Just a... Just on that context one, does
149
00:09:49,847 --> 00:09:51,687
that also then inject
150
00:09:52,347 --> 00:09:54,367
a value? It does. Very cool.
151
00:09:55,007 --> 00:09:56,267
-So not only does it-
-Hmm. That was nice
152
00:09:56,267 --> 00:09:58,787
... provide you that conditional check, it
will
153
00:09:59,507 --> 00:10:03,847
provide the value of that context
parameter in the value
154
00:10:04,547 --> 00:10:05,627
-variable.
-Yeah.
155
00:10:05,627 --> 00:10:11,347
So the dollar value will be whatever it is
the context get of that key. So that is,
156
00:10:11,347 --> 00:10:13,387
that is smart thinking, Martin. Like that
one.
157
00:10:14,667 --> 00:10:15,247
Very nice.
158
00:10:16,107 --> 00:10:22,887
On to the news. JetBrains PHPverse 2025
happened a few weeks ago
159
00:10:22,887 --> 00:10:28,467
to commemorate, to celebrate the 30th
anniversary or the 30th birthday of PHP,
160
00:10:28,467 --> 00:10:31,367
which brought together core contributors,
framework authors, and passionate
161
00:10:31,367 --> 00:10:35,287
community members for a one day event
packed with insightful talks. From long
162
00:10:35,287 --> 00:10:38,967
time maintainers to new faces in
internals, the event served as both a
163
00:10:38,967 --> 00:10:42,867
reflection on PHP's evolution and a
glimpse of what's coming next. It was
164
00:10:42,867 --> 00:10:48,147
streamed online and peaked at 4,000
simultaneous watchers live from all over
165
00:10:48,147 --> 00:10:52,007
the world, and now all the talks have been
published, so it's the perfect time to
166
00:10:52,007 --> 00:10:55,307
revisit the key moments and catch up with
any of the talks that you might have
167
00:10:55,307 --> 00:11:00,927
missed. So it talks about FrankenPHP,
which is now a official part of the PHP
168
00:11:00,927 --> 00:11:06,407
project. It is, uh, used as like a, a
driver, I think is the, the terminology
169
00:11:06,407 --> 00:11:08,307
for something like Laravel Octane.
170
00:11:08,947 --> 00:11:14,167
Talked about 20 years of Symfony, uh, MCP
in PHP, how AI is changing the tech
171
00:11:14,167 --> 00:11:18,707
industry. There was a Q&A with our very
own Taylor Otwell, the fu- future of PHP
172
00:11:18,707 --> 00:11:22,847
education, growing PHP for the future, and
so on. So we'll have links to all of that
173
00:11:22,847 --> 00:11:27,747
for you in the show notes. There's also
some cool PHPverse swag, and no event, of
174
00:11:27,747 --> 00:11:29,867
course, is complete without awesome swag,
and
175
00:11:30,647 --> 00:11:35,087
the JetBrains team went above and beyond.
Each attendee received a bag filled with
176
00:11:35,087 --> 00:11:40,387
PhpStormStorm shirts and hoodies, a mouse
pad, a, an elephant, uh, a PHP elephant
177
00:11:40,387 --> 00:11:44,507
Lego, and more. Uh, some of the items are
available on the swag store. I had a look
178
00:11:44,507 --> 00:11:48,027
earlier. There is T-shirts. There is a
hoodie. Um, and there are some pins and
179
00:11:48,027 --> 00:11:51,767
stickers as well, so check that out, uh,
if you wanna get involved in any of that
180
00:11:51,767 --> 00:11:54,867
stuff. So, uh, links to all that in the
show notes.
181
00:11:55,607 --> 00:11:59,187
Love the Lego PHP elephant. Pretty
exclusive stuff there.
182
00:11:59,187 --> 00:12:00,827
-Mm-hmm.
-I have a feeling there's gonna be quite a
183
00:12:00,827 --> 00:12:04,447
few people scrambling to get their hands
on that one. Really, really cool stuff.
184
00:12:04,447 --> 00:12:07,827
Thanks so much, JetBrains, for putting
that together. Uh, great, great work on
185
00:12:07,827 --> 00:12:14,752
that.All right. Laravel in 2025. So as
crazy as it sounds,
186
00:12:14,752 --> 00:12:19,231
July 2nd was the midpoint of this year,
which means we're more than halfway
187
00:12:19,231 --> 00:12:23,411
through the year. Yikes. So the team here
at Laravel News thought it'd be nice to
188
00:12:23,411 --> 00:12:28,212
recap some of the most memorable moments
so far at Laravel News. So the following
189
00:12:28,212 --> 00:12:31,632
posts that we're gonna talk about are a
mix of some of our most popular posts,
190
00:12:31,632 --> 00:12:35,831
community milestones, as well as products
and events that have happened. So let's
191
00:12:35,831 --> 00:12:40,832
start with Laravel 12. We used to have
Laracon Online, which is where we would do
192
00:12:40,832 --> 00:12:43,692
some of these bigger announcements, but
then some of these, now that we don't have
193
00:12:43,692 --> 00:12:49,271
Laracon Online, are just taking place on
Bluesky and on X, right? So Laravel 12 was
194
00:12:49,271 --> 00:12:56,031
released on February 2024, uh, of this
year. So, uh, sorry. I said 2024. February
195
00:12:56,031 --> 00:13:02,111
24th of 2025, my apologies. Um, there was
also the new starter kits that were
196
00:13:02,111 --> 00:13:06,251
launched with that, with the first-party
starter kits. The Laravel Installer also
197
00:13:06,251 --> 00:13:10,971
now supports these custom starter kits,
which is really neat. If you have not yet
198
00:13:10,971 --> 00:13:15,911
seen that or read about that, we have that
in a blog post. Uh, you should check this
199
00:13:15,911 --> 00:13:19,091
one out. The custom starter kits are
really, really powerful. It used to be,
200
00:13:19,691 --> 00:13:23,671
um, a lot more difficult to do this, but
now you can install Laravel using these
201
00:13:23,671 --> 00:13:27,671
custom starter kits. It's a great way to
get apps up and running, um, really
202
00:13:27,671 --> 00:13:33,451
quickly using your custom configuration.
Uh, Laravel 12 was also insanely easy to
203
00:13:33,451 --> 00:13:38,471
upgrade compared to previous versions of
Laravel. So it used to be that it was, you
204
00:13:38,471 --> 00:13:42,871
know, quite a few steps you'd have to
take between, uh, versions. Laravel 12 was
205
00:13:42,871 --> 00:13:46,891
by far the easiest. Now I still happened
to use Laravel Shift for all the ones that
206
00:13:46,891 --> 00:13:50,731
we moved from 11 to 12. Just a couple
little pieces and, and parts that are
207
00:13:50,731 --> 00:13:54,631
really nice to just have Laravel Shift to
take care of for you, but by and large, it
208
00:13:54,631 --> 00:13:58,911
was basically a composer.json update and
that was about it. It was really, really
209
00:13:58,911 --> 00:13:59,591
-good.
-Mm-hmm.
210
00:13:59,591 --> 00:14:04,451
It also leverages Inertia 2.0 for the Vue
and React Starter Kits. If you did have
211
00:14:04,451 --> 00:14:07,731
Nova running, you were gonna have to... I-
if it was on a older version, you were
212
00:14:07,731 --> 00:14:10,751
gonna have to upgrade that as well. So
again, that is one other thing to be aware
213
00:14:10,751 --> 00:14:12,891
of, uh, when you're, uh, shifting.
214
00:14:13,731 --> 00:14:18,191
The Laravel Shift will help take care of
for you as well. Uh, but great upgrade
215
00:14:18,191 --> 00:14:22,771
there. The path from 11 to 12 was amazing,
so great job to the Laravel team on that
216
00:14:22,771 --> 00:14:27,331
front. Laravel Cloud was also released in
February along with the Laravel 12
217
00:14:27,331 --> 00:14:31,271
release. This is, of course, a fully
managed infrastructure platform and the
218
00:14:31,271 --> 00:14:35,691
fastest way to deploy and scale your
Laravel applications. Lots of beta testers
219
00:14:35,691 --> 00:14:38,971
helped to contribute to making this what
it is today. And of course, the team has
220
00:14:38,971 --> 00:14:45,511
done an amazing job on making the UI feel
absolutely amazingly buttery smooth. I- I
221
00:14:45,511 --> 00:14:46,191
literally can't
222
00:14:47,171 --> 00:14:52,931
think of a better way to describe it. It
just feels so good to use, and so great
223
00:14:52,931 --> 00:14:56,571
job to the team on that one. Know lots and
lots of time was poured into making that
224
00:14:56,571 --> 00:14:59,531
what it is today, and if you haven't
checked it out, you definitely should.
225
00:15:00,131 --> 00:15:06,211
Native PHP Mobile version 1 launched on
May 2nd, which brings your Laravel app to
226
00:15:06,211 --> 00:15:11,191
the iOS and Android device stores. There's
been, you know, lots of years that we've
227
00:15:11,191 --> 00:15:15,531
been developing web applications that we
can launch onto the web using Laravel.
228
00:15:15,531 --> 00:15:20,951
Amazing. But you can now use that same
language and that same set of things that
229
00:15:20,951 --> 00:15:24,631
you've learned to build apps that you can
bring to the App Store and to the Google
230
00:15:24,631 --> 00:15:30,231
Play Store with Native PHP for Mobile v1.
So huge release on that front, um, and,
231
00:15:30,231 --> 00:15:35,851
uh, really excited to see what people are
building, uh, with this new, um, library.
232
00:15:35,851 --> 00:15:36,151
Okay.
233
00:15:36,771 --> 00:15:41,671
The big one here, Laravel Nightwatch, was
also released. So I, in particular, am
234
00:15:41,671 --> 00:15:45,711
more, was more excited about Nightwatch
than I was about Cloud. I've got a lotta
235
00:15:45,711 --> 00:15:48,911
stuff that I- I already have running
inside of Forge that I've been really
236
00:15:48,911 --> 00:15:52,651
happy with and have not needed necessarily
to switch to Cloud, but Nightwatch is one
237
00:15:52,651 --> 00:15:55,631
of those things that I could add to every
single one of my projects. So it's a
238
00:15:55,631 --> 00:15:58,811
first-party product with deep monitoring
and insights for all of your Laravel
239
00:15:58,811 --> 00:16:02,391
applications, no matter where you deploy
them, and, uh, you can get started by,
240
00:16:02,391 --> 00:16:08,151
like, checking out nightwatch.laravel.com.
Really, really cool. Tailwind version 4
241
00:16:08,151 --> 00:16:12,411
was released. Of course, the community has
been largely behind Tailwind for a long
242
00:16:12,411 --> 00:16:16,551
time. Adam Wathan, long-time Laravel
community member, uh, who created
243
00:16:16,551 --> 00:16:21,991
Tailwind, of course. And so on January
22nd, Tailwind version 4 was released with
244
00:16:21,991 --> 00:16:26,431
a brand new high-performance engine, CSS
First configuration, simplified
245
00:16:26,431 --> 00:16:29,451
installation and more, which we have a
release post that you can read about
246
00:16:29,451 --> 00:16:34,231
there, um, in the blog post here. Of
course, there's plenty more to come this
247
00:16:34,231 --> 00:16:38,591
year. Uh, we've got Laracon US right
around the corner from July 29th to 30th.
248
00:16:38,591 --> 00:16:43,471
Hopefully, we'll see you there. Expected,
uh, to announce some new updates to
249
00:16:43,471 --> 00:16:46,911
Laravel Forge, which I'm really excited
about. Livewire 4 was also mentioned to be
250
00:16:46,911 --> 00:16:51,651
released, uh, hopefully at Laracon US
2025 live from the stage. We've got
251
00:16:51,651 --> 00:16:56,531
Laravel Live Denmark coming up in August.
We've got, uh, Laracon AU, of course,
252
00:16:56,531 --> 00:17:00,471
November 13th to the 14th. Uh, an
opportunity to learn and share and connect
253
00:17:00,471 --> 00:17:03,571
with like-minded people, level up your
skills, knowledge, and Laravel
254
00:17:03,571 --> 00:17:07,471
applications. You can still grab tickets
for that. And then, of course, November
255
00:17:07,471 --> 00:17:12,391
20th of 2025 is when PHP 8.5 launches, so
we're gonna talk about that a little bit
256
00:17:12,391 --> 00:17:16,731
more in the show as well. That is our
first half of the year. Looking forward to
257
00:17:16,731 --> 00:17:18,431
the rest of the year. It's gonna be a
good one.
258
00:17:19,351 --> 00:17:23,371
Yeah. Lots, uh... A lot of big stuff
happened in the, in the front half of this
259
00:17:23,371 --> 00:17:24,831
year, so it's gonna be interesting to see
260
00:17:25,491 --> 00:17:28,471
what the, uh, Laravel team in particular
has been cooking up,
261
00:17:29,311 --> 00:17:33,831
uh, in that time on top of... Obviously,
they're much bigger now, so they have the
262
00:17:33,831 --> 00:17:38,871
capacity to do a lot more things. Um, and,
and as you say, Nightwatch and Cloud
263
00:17:38,871 --> 00:17:42,551
launching in the, in the first half of
this year, not, not small things by any
264
00:17:42,551 --> 00:17:46,971
stretch. So to have the capacity to do
that, to launch that, to maintain that,
265
00:17:46,971 --> 00:17:51,391
and, you know, to look to the future as
well. Taylor's got a two-hour keynote this
266
00:17:51,391 --> 00:17:53,311
-year on the first day, so-
-Yeah. Yeah. It's gonna be crazy.
267
00:17:53,311 --> 00:17:57,811
Uh, looking forward to that. On- on that,
the, the schedule for Laracon US is up now
268
00:17:57,811 --> 00:18:01,391
as well, so if you hadn't seen that, uh,
if you didn't see the email or if you
269
00:18:01,391 --> 00:18:05,411
haven't seen online, check that out. Uh,
there's a lot of cool stuff, interesting
270
00:18:05,411 --> 00:18:12,371
talks on the horizon for that.Another one
that I really enjoyed and immediately, uh,
271
00:18:12,371 --> 00:18:17,371
upgraded was the ability to run Laravel
Pint faster in parallel mode. So it was
272
00:18:17,371 --> 00:18:22,432
recently updated with a new --parallel
flag that makes Pint run 40 times faster
273
00:18:22,432 --> 00:18:27,032
and will fully leverage the parallel
capabilities of phpcs-fixer. You can use
274
00:18:27,032 --> 00:18:32,631
it using /vendor/bin/pint --parallel. The
flag is marked as e- experimental and is
275
00:18:32,631 --> 00:18:36,272
potentially unstable, but to access this
flag, all you need to do is update to the
276
00:18:36,272 --> 00:18:41,971
latest version of Laravel Pint, uh, at
least version 1.23.0.
277
00:18:42,671 --> 00:18:46,571
Along with the --parallel flag, this also
allows extending a Pint configuration from
278
00:18:46,571 --> 00:18:49,971
another file. This is useful if you have
an organization Pint config you share
279
00:18:49,971 --> 00:18:54,511
across projects, however, want to tweak a
few settings on a per project basis.
280
00:18:55,331 --> 00:18:55,631
Um,
281
00:18:56,731 --> 00:19:01,171
yeah. Big- big fan that being able to run
and leverage multiple processes,
282
00:19:01,171 --> 00:19:05,411
especially in things like CI to try and
get those processes to run quicker, you
283
00:19:05,411 --> 00:19:10,011
wanna get feedback in those cycles as
quick as possible, so shout out to Nuno
284
00:19:10,011 --> 00:19:12,231
and the Pint team for that one.
285
00:19:14,031 --> 00:19:19,972
Awesome. Uh, speaking of NativePHP, which
we just mentioned about the first half of
286
00:19:19,972 --> 00:19:25,412
2025, uh, since they launched NativePHP
for mobile in May, they've been building
287
00:19:25,412 --> 00:19:31,371
fast and quiet, running, uh, and refining
the core, creating better tooling,
288
00:19:31,371 --> 00:19:37,972
expanding what was possible with it. So
version 1.1 drops July 14th, which is
289
00:19:37,972 --> 00:19:42,172
today, the date of this recording, and it
isn't just like a collection of fixes.
290
00:19:42,172 --> 00:19:46,492
It's really a foundation upgrade to make
these apps easier to build, faster to
291
00:19:46,492 --> 00:19:49,791
ship, and ready for real production work.
So let's talk about a couple of the things
292
00:19:49,791 --> 00:19:53,171
that have been brought to 1.1. First is
modular
293
00:19:53,791 --> 00:19:58,492
native APIs. Here's what we mean by that.
Previous to this, everything was sort of
294
00:19:58,492 --> 00:20:03,011
stuffed under this system class. We had
system, uh, you know, double parens, and
295
00:20:03,011 --> 00:20:07,012
then you could get to all these mod-
these, uh, native APIs, like biometrics or
296
00:20:07,012 --> 00:20:11,091
camera, dialogues, geolocations, things
like that. No longer do you have to do
297
00:20:11,091 --> 00:20:16,071
that. They all have their own dedicated
facades, so you have biometrics under its
298
00:20:16,071 --> 00:20:20,691
own namespace. Camera, dialogue,
geolocation, haptics, push notifications,
299
00:20:20,691 --> 00:20:25,351
secure storage, and then system. So each
one is designed by itself to be
300
00:20:25,351 --> 00:20:30,191
predictable, documented, and then easy to
expand. So this sets the tone for all
301
00:20:30,191 --> 00:20:34,851
future native features, pulling them into
their own facades so they can be really
302
00:20:34,851 --> 00:20:39,491
focused and testable rather than having
them all crammed under one spot. There
303
00:20:39,491 --> 00:20:45,031
also are a couple new features, secure
storage, geolocation, and gallery picker.
304
00:20:45,031 --> 00:20:49,751
So these are new native capabilities that
you have access to. Secure storage allows
305
00:20:49,751 --> 00:20:53,791
you to store tokens, secrets, and
credentials using that device's native
306
00:20:53,791 --> 00:20:58,151
keychain or keystore, which is incredibly
powerful. Of course, geolocation is a big
307
00:20:58,151 --> 00:21:02,091
one if you ever need accurate location
data, so you can now ask for that in the
308
00:21:02,091 --> 00:21:05,091
permissions support. It's cross-platform
supported, which is excellent,
309
00:21:05,831 --> 00:21:11,171
and then gallery picker is when you allow
users to select media that they want your
310
00:21:11,171 --> 00:21:15,871
app to be able to access. If you've ever
used an application with modern, uh,
311
00:21:15,871 --> 00:21:20,411
privacy focus, you know that it needs to
gain permission to not... You know, it
312
00:21:20,411 --> 00:21:23,971
used to be, "Do you give us access to all
your photos?" And you had to say yes or
313
00:21:23,971 --> 00:21:27,291
no, and now you can be more selective in
which things you want to share. This
314
00:21:27,291 --> 00:21:31,691
gallery picker is essentially that. So
they're now fully integrated into Laravel,
315
00:21:31,691 --> 00:21:35,871
no plugins, no separate workfl- flows,
just these really powerful APIs that you
316
00:21:35,871 --> 00:21:36,591
already understand.
317
00:21:37,351 --> 00:21:42,731
ENV handling was also something that was
annoying. Previously, in Android, if you
318
00:21:42,731 --> 00:21:47,451
ever changed the ENV values, you had to
run PHP artisan native_installforce. This
319
00:21:47,451 --> 00:21:52,091
was a destructive step, so it wiped your
entire project and required you to rerun
320
00:21:52,091 --> 00:21:56,611
that native run. You don't have to do that
anymore. They've now moved all that logic
321
00:21:56,611 --> 00:22:00,911
into native_run。 So when you update that
ENV, it changes the whole thing without
322
00:22:00,911 --> 00:22:05,571
deleting anything. Uh, so fewer surprises,
no wasted time. Uh, same as what it was
323
00:22:05,571 --> 00:22:10,331
in iOS, that's now the same in Android
now. Okay, couple of things that sound
324
00:22:10,331 --> 00:22:13,731
less exciting, but they're actually
allowing you to do some really cool stuff.
325
00:22:13,731 --> 00:22:20,611
Full CLI flag support. So version 1.1
introduces this ability to allow you
326
00:22:20,611 --> 00:22:25,811
to pass those flags to that native_run
function, unlocking true automation. What
327
00:22:25,811 --> 00:22:29,771
do we mean by that? You can now run these
native PHP actions, uh, sorry, these
328
00:22:29,771 --> 00:22:34,131
native PHPs, uh, functions in GitHub
Actions in your deploy scripts or in your
329
00:22:34,131 --> 00:22:38,691
staging pipelines so that you don't have
to have prompts or manual steps built in
330
00:22:38,691 --> 00:22:42,531
there. You just pass the flags, and it
sort of does it silently for you. Really,
331
00:22:42,531 --> 00:22:43,031
really nice.
332
00:22:43,671 --> 00:22:50,371
Also, a undersold feature here, smaller,
faster binaries. So in Android, they went
333
00:22:50,371 --> 00:22:55,331
into their PHP build, and they cut it in
half, essentially, from 16 megs down to 8
334
00:22:55,331 --> 00:23:01,671
megs. Um, in Android with ICU, from 44
megs down to 35 megs, and in iOS, they cut
335
00:23:01,671 --> 00:23:06,791
it in half as well, 55 megabytes down to
22 megabytes. So faster downloads, lighter
336
00:23:06,791 --> 00:23:10,871
binaries, li- lighter bundles, and better
performance. Uh, so really, really good
337
00:23:10,871 --> 00:23:16,051
stuff there. Um, there are a couple other
items, uh, including rewritten
338
00:23:16,051 --> 00:23:20,251
documentation, uh, real testing
infrastructure with unit tests and
339
00:23:20,251 --> 00:23:25,611
end-to-end tests. Uh, there is a Kitchen
Sink app that's now live on the Play f-
340
00:23:25,611 --> 00:23:28,931
Play Store, so you can take a look at some
of these features that we just talked
341
00:23:28,931 --> 00:23:32,311
about, secure storage, geolocation,
gallery picture- picker, uh, that you
342
00:23:32,311 --> 00:23:36,451
could download and kinda check that out on
your device to see how that feels, and
343
00:23:36,451 --> 00:23:41,311
then, uh, you can, uh, take a look at the
merch store that they've also launched,
344
00:23:41,311 --> 00:23:43,711
which is shop.nativephp.com.
345
00:23:44,391 --> 00:23:49,231
Whoo, bunch of stuff there, all available
to you as of the time of this recording.
346
00:23:49,231 --> 00:23:53,011
If you're using that, you should
definitely upgrade. Uh, it's a good one.
347
00:23:53,011 --> 00:23:56,751
Thanks so much to Shane Rosenthal and the
team over there for writing this one up.
348
00:23:58,951 --> 00:24:04,903
Next up, the Laravel Claude A-... code
setup repo is a one command setup for
349
00:24:04,903 --> 00:24:10,004
AI-powered Laravel development with Claude
code and MCP servers. It will help you to
350
00:24:10,004 --> 00:24:14,163
automatically configure all MC- MCP
servers for the ultimate AI-powered
351
00:24:14,163 --> 00:24:18,983
Laravel development experience with Figma
integration. The Figma integration
352
00:24:18,983 --> 00:24:22,343
features seems like they could be very
powerful, helping you automatically create
353
00:24:22,343 --> 00:24:25,864
views, extract design system, build
components, and more.
354
00:24:26,504 --> 00:24:30,043
Uh, main features include global MCP
servers that are shared across all of your
355
00:24:30,043 --> 00:24:33,684
projects, GitHub integration that
accesses all your repositories to manage
356
00:24:33,684 --> 00:24:38,263
PRs with automatic token configuration, a
memory system to remember decisions across
357
00:24:38,263 --> 00:24:43,663
projects, Context 7, which is the latest
Laravel ph- which provides the latest
358
00:24:43,663 --> 00:24:47,883
Laravel and PHP documentation access.
There is web fetch for accessing external
359
00:24:47,883 --> 00:24:52,583
APIs and resources, Figma integration to
provide design-to-code workflows with
360
00:24:52,583 --> 00:24:56,504
automatic design token extraction,
automatic design token extraction ,
361
00:24:56,504 --> 00:25:00,823
providing colors, typography, and spacing
for Tailwind CSS, and a Laravel debug bar
362
00:25:00,823 --> 00:25:05,543
providing real-time debugging if
installed, and more. Uh, it's pretty
363
00:25:05,543 --> 00:25:09,143
simple to get up and running. There is a
curl command that you can run through
364
00:25:09,143 --> 00:25:12,303
Bash, um, and then, uh, get everything up
and running.
365
00:25:13,083 --> 00:25:16,703
You can get started with the package by
reading the readme and the docs folder,
366
00:25:16,703 --> 00:25:19,163
which we'll have links to for you in the
show notes.
367
00:25:20,303 --> 00:25:23,723
Well, hey, folks. We talked about a little
bit earlier that PHP 8.5 is getting
368
00:25:23,723 --> 00:25:27,303
released in November 20th of this year, so
the next couple items that we have here
369
00:25:27,303 --> 00:25:32,643
are all related to Laravel, sorry, not
Laravel, PHP 8.5. So, this first one is
370
00:25:32,643 --> 00:25:36,443
written up by Paul Redmond, everyone's
favorite human, really good, and he talks
371
00:25:36,443 --> 00:25:39,603
about, he- he goes into quite a bit of
depth on this. I'm just gonna skim the
372
00:25:39,603 --> 00:25:42,783
surface on this one, and if you want to
read the additional details of it, please
373
00:25:42,783 --> 00:25:45,143
feel free to go and read it. But the- the
374
00:25:46,183 --> 00:25:51,063
headline is this, array_first_ and
array_last_ functions are being made
375
00:25:51,723 --> 00:25:55,203
a reality inside of PHP 8.5. So,
376
00:25:56,183 --> 00:26:01,463
this has had user land implementations and
polyfills by Symfony, by Laravel, by
377
00:26:01,463 --> 00:26:05,943
other things, uh, throughout, you know,
forever, right? These- these
378
00:26:06,943 --> 00:26:11,643
complement some things that were already
pulled in in PHP 7.3, which were
379
00:26:11,643 --> 00:26:13,963
array_key_first_ and array_key_last.
380
00:26:15,203 --> 00:26:19,063
But again, without going into too much
depth as far as how it works and how these
381
00:26:19,063 --> 00:26:23,103
polyfill works, just know that
array_first_ and array_last_ will now be
382
00:26:23,103 --> 00:26:27,883
available to you natively inside of PHP
8.5 in November.
383
00:26:29,203 --> 00:26:29,903
-Perfect.
-There we go.
384
00:26:31,043 --> 00:26:36,263
The pipe operator is also coming to PHP
8.5 when it will be released on November
385
00:26:36,263 --> 00:26:39,883
20th. The operator is an exciting prospect
for PHP developers wanting to chain
386
00:26:39,883 --> 00:26:44,243
multiple callables together, passing a
value through them from left to right in a
387
00:26:44,243 --> 00:26:44,943
native way.
388
00:26:45,743 --> 00:26:46,783
The pipe operator
389
00:26:47,403 --> 00:26:51,363
accepts a single parameter callable on the
right and passes the left side value to
390
00:26:51,363 --> 00:26:55,783
it, evaluating to the callable's result.
Now, if that doesn't make much sense to
391
00:26:55,783 --> 00:27:00,983
you, any time you have used Laravel's
collections and chained on a filter and
392
00:27:00,983 --> 00:27:06,703
then a map and then a first- or whatever,
this is a similar concept but supported
393
00:27:06,703 --> 00:27:11,403
natively within PHP. So you can get a long
way to do things like
394
00:27:12,083 --> 00:27:17,243
running a string through HTML entities and
then string split and then mapping to
395
00:27:17,243 --> 00:27:22,463
uppercase things and then filter the
values, all using native PHP functions.
396
00:27:22,463 --> 00:27:26,823
Um, the p- performance benefits would-
would be the main thing to do this, having
397
00:27:26,823 --> 00:27:31,403
this functionality native. I wonder if
any of the Laravel connection stuff, uh,
398
00:27:31,403 --> 00:27:35,443
collection stuff can be adapted to maybe
leverage this functionality under the
399
00:27:35,443 --> 00:27:39,563
hood/behind the scenes. Uh, but it does
mean that there will be situations where
400
00:27:39,563 --> 00:27:45,263
you can sort of map and filter and reduce
using the native pipe functionality in
401
00:27:45,263 --> 00:27:48,903
situations where nec- you don't
necessarily have to reach for the
402
00:27:48,903 --> 00:27:50,403
collection functionality. So,
403
00:27:51,043 --> 00:27:56,663
uh, definitely check that out. Uh, it will
be released as part of PHP 8.5 in
404
00:27:56,663 --> 00:27:57,123
November.
405
00:27:58,003 --> 00:28:00,483
That is incredible, honestly. I- I just...
406
00:28:01,523 --> 00:28:04,483
It feels like these things used to only
be...
407
00:28:05,143 --> 00:28:07,903
They only existed in some
408
00:28:08,523 --> 00:28:13,963
parallel universe where PHP was willing to
accept these sorts of things. And I feel
409
00:28:13,963 --> 00:28:14,363
-like-
-Mm-hmm
410
00:28:14,363 --> 00:28:19,263
... in the last couple releases, like, the
dam has broken and all of these amazing
411
00:28:19,263 --> 00:28:24,203
new features are flooding in, and it just
feels like it is such a wonderful time to
412
00:28:24,203 --> 00:28:26,443
-be a PHP developer, doesn't it? I mean-
-Yeah
413
00:28:26,443 --> 00:28:31,003
... there's just so many cool features
that we get. And not only that, but we
414
00:28:31,003 --> 00:28:33,723
have the community keeping us updated,
'cause that was some of the other parts of
415
00:28:33,723 --> 00:28:36,963
it too, is I feel like it used to be that
Laravel... Oh sorry, not Laravel. PHP
416
00:28:36,963 --> 00:28:38,663
-releases would kind of come and go-
-Mm-hmm
417
00:28:38,663 --> 00:28:41,783
... and nobody was really any the wiser as
far as what the new features were. They
418
00:28:41,783 --> 00:28:44,443
had, maybe there were some break/fix
things stuff in there, but there was none
419
00:28:44,443 --> 00:28:49,163
of these new sort of banner features that
were coming out that people wanted to
420
00:28:49,163 --> 00:28:53,723
upgrade to get. And this is one of those
big ones, the pipe operator. That's so
421
00:28:53,723 --> 00:28:57,463
cool. Now, the syntax is really
interesting. I think it looks good, it's
422
00:28:57,463 --> 00:28:59,423
-just gonna be weird to get used to.
-Mm-hmm.
423
00:28:59,423 --> 00:29:02,063
It's sort of... You know what I mean? I'll
have to kind of go back and go, "What-"
424
00:29:02,063 --> 00:29:06,143
-It's very uncharacteristic for PHP.
-Yeah. Yeah, exactly. Like, what was that
425
00:29:06,143 --> 00:29:08,043
-operator again? Pipe arrow?
-Yeah.
426
00:29:08,043 --> 00:29:08,643
-Okay.
-Yeah.
427
00:29:08,643 --> 00:29:11,383
Like that's just... You know, it's
interesting. I- I think it's a good one,
428
00:29:11,383 --> 00:29:12,323
-right? It's-
-Yeah.
429
00:29:12,323 --> 00:29:13,983
-You know?
-I think it's borrowed from, like,-
430
00:29:13,983 --> 00:29:15,603
-I think it's got to come with this-
-.Dot Net or something like that.
431
00:29:15,603 --> 00:29:17,623
-Okay.
-Or- or C Sharp. So it's... Yeah, it's,
432
00:29:17,623 --> 00:29:19,843
there's- there's an established... And a
lot of the stuff that
433
00:29:20,943 --> 00:29:23,023
PHP has been adding in recent times
434
00:29:23,743 --> 00:29:25,103
does have
435
00:29:26,163 --> 00:29:30,123
a history in other languages. And so it's-
it's easier to kind of
436
00:29:31,043 --> 00:29:34,803
have something familiar for people that
move between languages, perhaps, when you
437
00:29:34,803 --> 00:29:37,763
look at what's already out there before
implementing. I think the- the- the big
438
00:29:37,763 --> 00:29:38,523
thing is, well,
439
00:29:39,143 --> 00:29:44,203
not so much, you know, not wanting to do
things or not bringing things in because
440
00:29:44,203 --> 00:29:47,483
Symfony had it or because P- uh, Laravel
had it, or whatever else. I think the-
441
00:29:47,483 --> 00:29:48,943
the- the main reason
442
00:29:49,563 --> 00:29:53,723
is because the PHP Foundation exists now.
That there is people that are actually
443
00:29:53,723 --> 00:29:59,063
paid to develop and support PHP the
language, and they're doing this in a full
444
00:29:59,063 --> 00:30:04,856
time capacity. That there is now active
community support...... to, you know,
445
00:30:04,856 --> 00:30:08,975
enable people to work on this, not just in
their free time, not, you know, whenever
446
00:30:08,975 --> 00:30:13,275
they're, they're a- able to, but to do it
in a full-time capacity. And that, I
447
00:30:13,275 --> 00:30:19,415
think, has s- you know, moved a lot
forward in terms of the ability for PHP to
448
00:30:19,415 --> 00:30:26,195
manage releases, to communicate releases,
to, to do more exciting things more often
449
00:30:26,195 --> 00:30:30,695
and more regularly than, you know, what
we had before. So shout out to everyone
450
00:30:30,695 --> 00:30:31,975
that is involved in that.
451
00:30:32,875 --> 00:30:37,555
Absolutely. Well, uh, along with all of
this, you might be asking yourself too,
452
00:30:37,555 --> 00:30:42,116
like, "How can I get started just testing
out PHP 8.5? What's the easiest way for me
453
00:30:42,116 --> 00:30:44,395
to do that?" Well, we're gonna talk about
that a little bit here, but we're also
454
00:30:44,395 --> 00:30:48,155
gonna talk about another feature that 8.5
introduces, which is a diff option
455
00:30:48,895 --> 00:30:51,116
for the PHP INI flag. So
456
00:30:51,835 --> 00:30:58,655
PHP-- INI previously would show you, hey,
here are the values, um, that are loaded,
457
00:30:58,655 --> 00:31:03,635
uh, as well as maybe showing you here's
the path that you're loading it from. Um,
458
00:31:03,635 --> 00:31:09,295
but this, uh, there's a couple cool new
things here, um, that are, are going to be
459
00:31:09,295 --> 00:31:11,555
available to us starting in 8.5. So
460
00:31:12,275 --> 00:31:17,075
you can use this diff, uh, to show you the
INI values that are different from the
461
00:31:17,075 --> 00:31:23,235
built-in default values. So if you do
PHP-- INI=diff and it says, "Here are all
462
00:31:23,235 --> 00:31:29,595
the loaded values that were made to be
different based on INI files that you were
463
00:31:29,595 --> 00:31:34,095
loading in." And sometimes that's not
always easy to identify either. Where are
464
00:31:34,095 --> 00:31:39,535
my loading these INI files from? Am I
loading multiple INI files? And so, uh,
465
00:31:39,535 --> 00:31:44,575
Paul Redmond talks about how you can go
through and get a little taste of this as
466
00:31:44,575 --> 00:31:50,335
well as, uh, mess around a bit with being
able to see not only what ones are
467
00:31:50,335 --> 00:31:55,115
different, but where am I loading them in
from? And so he talks about specifically
468
00:31:55,115 --> 00:31:59,055
here using Docker. Now, Docker is one of
those things some people don't really like
469
00:31:59,055 --> 00:32:02,655
to get involved with it, and me being one
of those, raise your hand. Um, but he
470
00:32:02,655 --> 00:32:08,195
talks about how you can use Docker in
order to be able to set up a new PHP 8.5
471
00:32:08,195 --> 00:32:12,795
demo. And then he shows, here's how we can
see what the INI values are before, and
472
00:32:12,795 --> 00:32:16,115
then here's how we can see what it looks
like after we load these, uh, INIs. And
473
00:32:16,115 --> 00:32:20,375
then we can also see here are any loaded
configuration files, which is gonna point
474
00:32:20,375 --> 00:32:24,655
you to all the INIs that got loaded in
order to produce that difference between
475
00:32:24,655 --> 00:32:29,035
what the default values are and what your
new values are. So if this is something
476
00:32:29,035 --> 00:32:32,755
you'd like to play with before 8.5 was
released, this is a great tutorial to go
477
00:32:32,755 --> 00:32:33,055
through.
478
00:32:33,835 --> 00:32:35,375
It's not a long one. We're talking about,
479
00:32:36,215 --> 00:32:41,235
uh, 10-minute read here, right? From
actually getting it, started reading it,
480
00:32:41,235 --> 00:32:45,675
to actually getting through the end of it
with a, a, a Docker 8.5 install. So should
481
00:32:45,675 --> 00:32:48,095
be a good one. If that's something you'd
like to play with, definitely check that
482
00:32:48,095 --> 00:32:48,455
one out.
483
00:32:49,975 --> 00:32:56,475
The last PHP 8.5 feature we have to talk
about today is fatal error backtraces. In
484
00:32:56,475 --> 00:33:01,115
PHP 8.5, a new fatal error backtraces
setting can control whether a backtrace is
485
00:33:01,115 --> 00:33:06,555
shown for fatal errors. Fatal errors
without backtraces in today's stable PHP
486
00:33:06,555 --> 00:33:11,115
versions, for example, 8.4, might include
parse errors for syntax errors, duplicate
487
00:33:11,115 --> 00:33:15,415
functions or classes, infinite loops, and,
uh, max execution time and so on.
488
00:33:17,235 --> 00:33:22,435
So if you run code in PHP 8.4, you'll get,
uh, if you try to declare a class
489
00:33:22,435 --> 00:33:25,835
multiple times, for example, you'll get a
fatal error that says, "Cannot declare
490
00:33:25,835 --> 00:33:29,895
class B because the name is already in
use." And it will just tell you where that
491
00:33:29,895 --> 00:33:35,095
error happened. Starting in PHP 8.5,
you'll get more helpful information that
492
00:33:35,095 --> 00:33:39,855
led to the fatal error. Clearly, this is
derive, uh, this is a, a contrived
493
00:33:39,855 --> 00:33:42,035
example, but it will tell you where
494
00:33:42,795 --> 00:33:46,395
the duplication happened. It'll give you,
uh, it'll tell you, this was previously
495
00:33:46,395 --> 00:33:50,375
declared somewhere else, rather than just
saying that it has already been declared.
496
00:33:50,375 --> 00:33:55,835
So, uh, the ini setting default value is
to show fatal error backtraces, meaning it
497
00:33:55,835 --> 00:33:59,055
is enabled by default. But if for some
reason you wanna turn it off, you can set
498
00:33:59,055 --> 00:34:04,235
that setting to 0 and you'll get back the
current state of affairs. Uh, we have
499
00:34:04,235 --> 00:34:08,535
links to this and all of the PHP 8.5
updates in the show notes for you.
500
00:34:09,415 --> 00:34:14,775
Okay. Moving on to packages. So this first
one, I was confused when I read it for
501
00:34:14,775 --> 00:34:18,075
the first time because it says Volt in the
title.
502
00:34:18,075 --> 00:34:20,815
-Mm-hmm.
-Laravel performance testing with volt test
503
00:34:20,815 --> 00:34:26,175
PHP. Now if you were naive like me and
you think, oh, Laravel Volt, which was
504
00:34:26,175 --> 00:34:32,135
introduced at, I think, like, Laracon 2023
US, I think, is where it was at? Um...
505
00:34:32,135 --> 00:34:33,535
-It's been around a while. Yeah.
-Somebody talked about this, right? Which
506
00:34:33,535 --> 00:34:37,475
is, like, um, these, like, LiveWire
components and, like, single, single file
507
00:34:37,475 --> 00:34:40,855
component things. Not what we're talking
about. No need to really continue down
508
00:34:40,855 --> 00:34:46,635
that path. This is talking about volt test
PHP, which, uh, if I'm reading its, in
509
00:34:46,635 --> 00:34:51,615
its own title of what it claims to do, it
empowers developers to write and execute
510
00:34:51,615 --> 00:34:57,695
performance, load, and stress tests for
their applications directly inside of PHP.
511
00:34:57,695 --> 00:35:02,815
So what the Laravel performance testing
package does is this allows you to
512
00:35:03,935 --> 00:35:10,515
use the volt test PHP SDK to create these
load tests for your Laravel applications,
513
00:35:10,515 --> 00:35:14,495
uh, which some of the niceties that it
sort of folds in here is things like route
514
00:35:14,495 --> 00:35:21,215
discovery, CSRF handling, reporting, and
more. So using the Laravel package, uh,
515
00:35:21,215 --> 00:35:24,515
that we're talking about here, you can
quickly get up to speed using that volt
516
00:35:24,515 --> 00:35:29,015
test, generating test files easily, and
starting to stress test your Laravel app
517
00:35:29,015 --> 00:35:33,195
if that is in fact something you need to
do. The API looks really nice. You
518
00:35:33,195 --> 00:35:38,355
basically set up a scenario and you set up
different steps that you'd like to test,
519
00:35:38,355 --> 00:35:43,235
and then you can, uh, build it all out s-
very... In, in a fluent interface, uh,
520
00:35:43,235 --> 00:35:47,684
very similar to how you'd build out... uh,
what you would do when inside of a PHP
521
00:35:47,684 --> 00:35:51,964
unit sort of request life cycle. Here are
the things I want you to do, and then you
522
00:35:51,964 --> 00:35:56,583
can go through, filter it out only to
particular, uh, tests that you want to
523
00:35:56,583 --> 00:36:01,623
run, and then do your stress test there
with PHP Artisan Volt Test and run that
524
00:36:01,623 --> 00:36:07,043
there. So it's easily, uh, configurable,
automatic route discovery, comprehensive
525
00:36:07,043 --> 00:36:12,443
reporting, URL load testing. It comes with
artisan commands, configurable, uh,
526
00:36:12,443 --> 00:36:18,324
through flexible config options, and then
it also has things like CSV data sources,
527
00:36:18,324 --> 00:36:21,024
which you might think is, like, "W- why
would I need to do that for?" Well, if
528
00:36:21,024 --> 00:36:24,763
you're wanting to load a bunch of
different data into these stress tests,
529
00:36:24,763 --> 00:36:29,123
it's gonna require a large amount of it to
kind of run through for realistic
530
00:36:29,123 --> 00:36:32,263
performance testing. And so, a lot of
times you're going to load that in through
531
00:36:32,263 --> 00:36:37,283
some sort of CSV data source. It supports
that. So you can check this one out in
532
00:36:37,283 --> 00:36:38,004
the show notes.
533
00:36:40,043 --> 00:36:45,743
Intelligent parsing and formatting of
names in PHP apps. Uh, if you have ever
534
00:36:45,743 --> 00:36:51,243
done anything that deals with a customer,
you know, like a CRM type thing or
535
00:36:51,243 --> 00:36:54,643
anywhere where you're displaying names of
people, where it can be arbitrarily
536
00:36:54,643 --> 00:36:59,764
entered into forms, Name of Person is a
PHP package inspired by Basecamp's Name of
537
00:36:59,764 --> 00:37:03,403
Person Ruby Gem, which gives you
intelligent parsing and multiple
538
00:37:03,403 --> 00:37:04,584
formatting options.
539
00:37:05,344 --> 00:37:09,243
If you handle, uh, sorry, handle person
names in your PHP applications with
540
00:37:09,243 --> 00:37:13,143
elegant formatting options, transform
names between multiple presentation
541
00:37:13,143 --> 00:37:17,664
formats, the package provides a clean type
safe way to parse, store, manipulate, and
542
00:37:17,664 --> 00:37:22,303
display person names consistently across
your application. So you can directly
543
00:37:22,303 --> 00:37:26,864
instantiate a person name with a first and
last name as separate parameters, or you
544
00:37:26,864 --> 00:37:32,524
can use static constructors for, uh, you
know, person name from full, and then you
545
00:37:32,524 --> 00:37:37,364
can, from the parsed object, return the
first and the last name. It handles single
546
00:37:37,364 --> 00:37:39,463
names as well. So if you had, say,
"prince,"
547
00:37:40,103 --> 00:37:45,923
uh, you would get null back for the last
name. The package also has Laravel support
548
00:37:45,923 --> 00:37:49,243
for cars that you can use with your
models, and the car support string based
549
00:37:49,243 --> 00:37:53,263
cars configurations, as well as a fluent
method and JSON serialization.
550
00:37:54,243 --> 00:37:57,443
Multiple format options are available.
There are nine different ways to display
551
00:37:57,443 --> 00:38:01,483
names. There is full, familiar,
abbreviated, initials, sorted, possessive,
552
00:38:01,483 --> 00:38:05,403
and mentionable. There is smart parsing
to intelligently handle full name strings
553
00:38:05,403 --> 00:38:08,223
and edge cases. There is full
international name support with proper
554
00:38:08,223 --> 00:38:12,803
multi-byte handling. Core functionality
means it works in any PHP project, and a
555
00:38:12,803 --> 00:38:17,963
specific viral integration provides native
eloquent casting for seamless database
556
00:38:17,963 --> 00:38:22,923
integration. So he talks about, um, you
know, familiar and initials and, uh,
557
00:38:22,923 --> 00:38:29,263
possessive formatting options. So if you
had, um, Eric L. Barnes, as he likes to
558
00:38:29,263 --> 00:38:32,863
sh- pla- place his name around the
internet. If you said that was his name,
559
00:38:32,863 --> 00:38:38,683
then familiar would be Eric B., um, you
know, with a, with a sh- Initial for the
560
00:38:38,683 --> 00:38:43,523
surname. Uh, initials, you could say name
initials to get E-L-B, to get the initials
561
00:38:43,523 --> 00:38:48,223
of all of the names. Possessive for the
first name, so Eric's, Eric apostrophe S,
562
00:38:48,223 --> 00:38:51,683
and so on and so forth. Uh, this is
useful, you know, if you're
563
00:38:52,343 --> 00:38:54,703
sending emails to people, you might wanna
address them in a-
564
00:38:54,703 --> 00:38:56,983
-Hmm. Good point
-... e- with a possessive. You might want
565
00:38:56,983 --> 00:39:02,483
to, um, generate avatars if they haven't
uploaded an image with, with the initials
566
00:39:02,483 --> 00:39:06,823
for their name and so on and so forth. So
definitely check this one out. Uh,
567
00:39:06,823 --> 00:39:07,343
something that
568
00:39:08,023 --> 00:39:12,183
we do in a number of different places, I'm
sure there are many of you listening who
569
00:39:12,183 --> 00:39:16,483
have implemented these in various
different ways. Um, I know a favorite of
570
00:39:16,483 --> 00:39:20,583
mine to get the first and last name is to
do, like, string of before space, and
571
00:39:20,583 --> 00:39:21,463
-that's the first name-
-Yeah
572
00:39:21,463 --> 00:39:26,823
... and string, string of after, you know,
that space means it's the last name. And
573
00:39:26,823 --> 00:39:30,463
you can get caught out in places if people
have put in, like, a middle name or, or
574
00:39:30,463 --> 00:39:31,603
things like that as well. But
575
00:39:32,963 --> 00:39:38,843
a tested package that's built on top of or
off the, the work of Basecamp's Ruby Gem
576
00:39:38,843 --> 00:39:39,343
means that
577
00:39:39,983 --> 00:39:44,143
it's comprehensive. It's tested over a, a
long, long period of time. So definitely
578
00:39:44,143 --> 00:39:44,963
check that one out.
579
00:39:45,983 --> 00:39:46,503
Awesome.
580
00:39:47,203 --> 00:39:52,723
Uh, last package before we get to to... To
these tutorials here. Uh, Laravel AI Chat
581
00:39:52,723 --> 00:39:58,523
Starter Kit created by Pushpack Chahed is
a modern starter kit that features real
582
00:39:58,523 --> 00:40:04,523
time streaming responses using Prism,
Inertia, Vue, and Tailwind CSS. Okay.
583
00:40:04,523 --> 00:40:08,023
Don't sleep on this thing. Let me, let me
kind of put this down for you here.
584
00:40:08,823 --> 00:40:14,163
If you are wanting to interact with an AI
model and you also are responsible perf-
585
00:40:14,163 --> 00:40:17,503
for, for providing the interface that
allows you to interact with that model, as
586
00:40:17,503 --> 00:40:22,523
well as stream back the responses, this
is a starter kit for Laravel that gives
587
00:40:22,523 --> 00:40:27,003
you everything you need to get up and
running with that from zero really
588
00:40:27,003 --> 00:40:27,403
quickly.
589
00:40:28,043 --> 00:40:32,323
As I said, it's a starter kit. So as of
Laravel 12, we now have these starter kits
590
00:40:32,323 --> 00:40:36,323
that you can ship things with. So to get
started with this, all you do is Laravel
591
00:40:36,323 --> 00:40:43,323
new, and then you use PUSHPACK1300/AICHAT.
That's it. And it will give you all of
592
00:40:43,323 --> 00:40:47,623
this ready to go. Real time AI responses,
which are streamed as they're generated.
593
00:40:48,283 --> 00:40:51,523
Reasoning support, so it has support for
AI models with reasoning capabilities. I-
594
00:40:51,523 --> 00:40:56,063
it allows for multiple AI providers. Thank
you, Prism. AI, OpenAI, Anthropic,
595
00:40:56,063 --> 00:41:00,823
Gemini, Ollama, Grok, et cetera. All those
things. It has a built in authentication
596
00:41:00,823 --> 00:41:03,943
system for user authentication and
management. It has a light and a dark
597
00:41:03,943 --> 00:41:09,003
mode. It has custom theming with ShadCN.
So if you've not used Sha- ShadCN before,
598
00:41:09,003 --> 00:41:12,103
uh, you know, this is something that's
usually... It was kind of created
599
00:41:12,103 --> 00:41:16,223
originally for React, but it's been ported
over to Vue. So now you can do easy theme
600
00:41:16,223 --> 00:41:21,043
customization with just simple CSS
variables. Really nice there. And then
601
00:41:21,043 --> 00:41:25,803
also allows you to do chat sharing, which
is, uh, allowing you to share
602
00:41:25,803 --> 00:41:29,843
conversations with other users. This is
something that ChatGPT has done in the not
603
00:41:29,843 --> 00:41:33,687
too, um...... re- you know, not too
distant past, which has been really
604
00:41:33,687 --> 00:41:36,647
helpful for myself. Specifically, I'll-
I'll write something up, wanna share it
605
00:41:36,647 --> 00:41:39,547
with my wife. I either have to copy and
paste this whole conversation or I can
606
00:41:39,547 --> 00:41:42,247
say, "Just share this over to this
person," and it kinda gives them the
607
00:41:42,247 --> 00:41:47,648
entire context. So a really, really
comprehensive starter kit here, as well as
608
00:41:47,648 --> 00:41:54,468
shipping with an enum that specifies the
model names that you'd like to use. So,
609
00:41:54,468 --> 00:42:01,368
you know, you've got GPT-4-0-mini- mini,
and GPT-41-nano, and 04-mini. And
610
00:42:01,368 --> 00:42:04,667
if you didn't know the names of these or
how they're specifically... It's sort of
611
00:42:04,667 --> 00:42:09,567
like when you're doing regions for Amazon.
It's like, was it US, ES- US East 1 or
612
00:42:09,567 --> 00:42:13,448
East 2, or which one was it? This just
kinda simplifies that for you by providing
613
00:42:13,448 --> 00:42:18,308
an enum that has all those values ready
for you to go to plug in. So if this is
614
00:42:18,308 --> 00:42:21,727
something you've needed to do, even if you
just wanted to play around with Prism,
615
00:42:21,727 --> 00:42:26,448
this is a great spot for you to just grab
the starter kit, spin it up, and give it a
616
00:42:26,448 --> 00:42:31,847
try. So really, really cool here. Thanks
to Pushpack and Chahajed for, uh, creating
617
00:42:31,847 --> 00:42:32,847
that. Very nice.
618
00:42:33,808 --> 00:42:38,707
Nice. Uh, several tutorials this week, all
of them from our favorite, Harris
619
00:42:38,707 --> 00:42:41,927
Raftopoulos. All of them framework
reminders, if I have classified them
620
00:42:41,927 --> 00:42:46,807
correctly. I'm gonna run through them all
and leave them to you, dear listener, to
621
00:42:46,807 --> 00:42:51,288
go forward and read them. First up,
simplifying stream handling with Laravel's
622
00:42:51,288 --> 00:42:56,127
resource method. We've got dependency
injection in Laravel closure commands,
623
00:42:56,127 --> 00:43:01,907
Laravel's inarrayKeys rule allowing you to
validate partial array keys, content
624
00:43:01,907 --> 00:43:06,627
negotiation with Laravel's prefers method.
There is Laravel request content type
625
00:43:06,627 --> 00:43:11,687
inspection methods, as well as blade
authorization directives for Vue security,
626
00:43:11,687 --> 00:43:16,987
enhancing JSON responses with Laravel's
modelappends property, enhanced Enum
627
00:43:16,987 --> 00:43:21,487
processing with Laravel's default
parameter support, custom object casting
628
00:43:21,487 --> 00:43:26,947
in Laravel models, and Laravel's
ruleContains method for fluent array
629
00:43:26,947 --> 00:43:30,527
validation. All of these things that we
have spoken about at various points in
630
00:43:30,527 --> 00:43:35,287
time on Laravel News, and Harris, as
always, has helpfully gone through and
631
00:43:35,287 --> 00:43:39,307
just expanded on the high-level stuff that
we talk about on the show to give you
632
00:43:39,307 --> 00:43:43,947
more context around how you might use some
of this functionality in your projects.
633
00:43:45,047 --> 00:43:50,207
Yep. They are actually so well-written,
and he does a really good job breaking
634
00:43:50,207 --> 00:43:52,987
down the high-level things that we're
talking about. When we're talking about
635
00:43:52,987 --> 00:43:56,227
release things, a lot of times it's just
the bullet point version.
636
00:43:56,227 --> 00:43:58,667
-Mm-hmm.
-Here's the feature, top level. And maybe
637
00:43:58,667 --> 00:44:01,927
you don't have as much of a grasp on, "How
exactly do I use this inside my
638
00:44:01,927 --> 00:44:05,447
application?" Or, "What are some examples
of places where I might use this?" He
639
00:44:05,447 --> 00:44:09,807
takes all those and expands them to a full
tutorial and provides, uh, details on all
640
00:44:09,807 --> 00:44:13,867
of that. Really well-written, really easy
to follow, and most of them you could
641
00:44:13,867 --> 00:44:18,107
read through and understand within, I'm
talking five minutes, right? You should
642
00:44:18,107 --> 00:44:21,047
definitely go through these, read these on
a lunch break. It's gonna be really
643
00:44:21,047 --> 00:44:25,547
helpful. And there's so much stuff that's
going into the framework these days, it's
644
00:44:25,547 --> 00:44:29,687
easy to lose that there's some of these
amazing things that you have never even
645
00:44:29,687 --> 00:44:32,787
heard of, right? Even if you read through
the documentation, you might not know that
646
00:44:32,787 --> 00:44:36,507
these things exist. So definitely check
these tutorials out. They're super val-
647
00:44:36,507 --> 00:44:40,307
super valuable and are gonna help you
level up to the next
648
00:44:41,087 --> 00:44:42,847
level. And also, speaking of,
649
00:44:43,487 --> 00:44:46,987
if you're interested in leveling up to the
next level and you are over on the side
650
00:44:46,987 --> 00:44:50,907
of the world, uh, where Australia is near
you, you should definitely be grabbing
651
00:44:50,907 --> 00:44:54,327
your tickets to Laracon AU. Michael, give
us some dates that we should be looking
652
00:44:54,327 --> 00:44:58,147
-at.
-Yeah. November 13th and 14th in Brisbane
653
00:44:58,147 --> 00:45:04,287
this year. Um, we have sold over half of
our early bird allocation as well, uh, and
654
00:45:04,287 --> 00:45:08,467
that will run until the 7th of August
unless sold out earlier. So if, uh, if
655
00:45:08,467 --> 00:45:13,467
you've missed the boat on Laracon US,
then, uh, Laracon AU is happy for you to
656
00:45:13,467 --> 00:45:17,867
join us. If you go to Laracon US and you
think you want some more Laracon in your
657
00:45:17,867 --> 00:45:21,667
life, there will still be about a week to
grab your early bird tickets after that
658
00:45:21,667 --> 00:45:26,767
happens. So I'd love to see you there.
And, uh, we're- we're in the thick of
659
00:45:26,767 --> 00:45:31,147
announcing speakers at the moment as well.
So looking forward to getting all those.
660
00:45:31,147 --> 00:45:35,267
It's one less secret I need to keep from
the community , so definitely enjoying
661
00:45:35,267 --> 00:45:38,667
this part of, uh, the preparation process,
for sure.
662
00:45:39,347 --> 00:45:43,527
Absolutely. Hey, folks. Michael and myself
will also be at Laracon US this year,
663
00:45:43,527 --> 00:45:48,267
which is coming up right around the
corner. I think both of us will be there
664
00:45:48,267 --> 00:45:50,327
on the... Ooh, let's see.
665
00:45:51,527 --> 00:45:54,307
-28th.
-28th? Yes, we'll both be on the 28th. I'll
666
00:45:54,307 --> 00:45:58,727
be there through the 31st. Please say
hello. We would love to see you and hear
667
00:45:58,727 --> 00:46:02,527
from you. It's always great to, uh, hear
from people who are able to listen to the
668
00:46:02,527 --> 00:46:06,267
show, and very much looking forward to
catching up with all you lovely folks
669
00:46:06,267 --> 00:46:09,407
there. This has been episode 241. You can
find show notes for it at
670
00:46:09,407 --> 00:46:14,867
podcast.laravel-news.com/241. Please rate
us up in your podcatcher of choice. Five
671
00:46:14,867 --> 00:46:17,747
stars would be amazing if you enjoyed the
show. And of course, any comments or
672
00:46:17,747 --> 00:46:21,727
questions you might have, hit us up on
BlueSky or on X @MichaelDerenda,
673
00:46:21,727 --> 00:46:26,127
@JacobBennett, or @Laravel News. Folks,
until next time, it's been a fun one. We
674
00:46:26,127 --> 00:46:26,787
will see ya.
675
00:46:27,567 --> 00:46:27,907
Bye.