tomasnorre wrote a reply+100 XP
2mos ago
Reply is short of helpful but looks like it's a little outdated compared to what I can read at https://laravel.com/docs/12.x/fortify
tomasnorre wrote a reply+100 XP
2mos ago
tomasnorre liked a comment+100 XP
2mos ago
Certainly! Here’s a recommended approach to email verification and forgotten password features for your Laravel 12 app, without using any JS frontend starter kit.
1. Laravel Fortify: The Right Choice
Since you don't want React, Vue, Livewire, or any frontend scaffolding, using Laravel Fortify is ideal. Fortify provides backend endpoints for authentication, registration, password reset, email verification, and more, but doesn't install any frontend code.
2. Setup Steps
a. Install Fortify
Run:
composer require laravel/fortify
php artisan vendor:publish --provider="Laravel\Fortify\FortifyServiceProvider"
b. Register Fortify
In config/app.php providers array, ensure:
App\Providers\FortifyServiceProvider::class,
c. Configure Features
In config/fortify.php, enable these:
'features' => [
Features::registration(),
Features::resetPasswords(),
Features::emailVerification(),
// ... (others as needed)
],
d. Enable Email Verification
User Model:
Implement MustVerifyEmail:
use Illuminate\Contracts\Auth\MustVerifyEmail;
class User extends Authenticatable implements MustVerifyEmail
{
// ...
}
3. Add Routes to Handle Verification and Reset
Fortify publishes all the routes, you just need to link to them from your Blade forms:
- Email verification: after registration, point user to
/email/verify(Fortify provides this). - Send verification email:
POST /email/verification-notification - Check verification: link in the email goes to
/email/verify/{id}/{hash}
Password reset:
- Request:
POST /forgot-password - Form link (sent by email):
/reset-password/{token}
4. Blade Forms
You need to build the forms/views yourself. For example, for "Forgot password":
<!-- resources/views/auth/forgot-password.blade.php -->
<form method="POST" action="{{ route('password.email') }}">
@csrf
<input type="email" name="email" required autofocus>
<button type="submit">Send Password Reset Link</button>
</form>
For "Reset password":
<!-- resources/views/auth/reset-password.blade.php -->
<form method="POST" action="{{ route('password.update') }}">
@csrf
<input type="hidden" name="token" value="{{ $token }}">
<input type="email" name="email" required autofocus>
<input type="password" name="password" required>
<input type="password" name="password_confirmation" required>
<button type="submit">Reset Password</button>
</form>
And you can copy similar forms for login, registration, etc.
5. Summary / TL;DR
- Fortify gives you full authentication endpoints but no frontend so you control the UI (with Blade).
- You get email verification and password resets "for free"—just hook up the forms and notification templates.
- No React, Vue, or Livewire needed.
- Simple, upgradable, and secure.
If you want more guidance on the Blade side or customizing Fortify's flows, just ask!
tomasnorre started a new conversation+100 XP
2mos ago
Hi,
I have a Laravel 12 application that I have build with no starter kit. I have right now simple registration and login forms.
My next steps are to build, email verification into the registration process, and then add the forgotten password functionality.
I have been looking a little around.
If I start a new Laravel 12 application, is asking for React, Vue or Livewire starter kit. I would prefer none; I know I get boilerplate code handed to me, but I would prefer to keep React, Vue and Livewire out of the picture for now.
I have been looking into Laravel Breeze, but sounds like it's not "the way to go" anymore for new projects. Furthermore, I have look at a little into Laravel Fortify, which looks a little like a skeleton I can build on, and currently I think that's the way to go for me.
Do you have any suggestions on how I should approach this? Feedback would be welcomed and appreciated.
Thanks
tomasnorre wrote a comment+100 XP
2mos ago
I just saw that its corrected directly in the next episode. https://laracasts.com/series/laravel-from-scratch-2026/episodes/38
tomasnorre wrote a comment+100 XP
2mos ago
tomasnorre wrote a comment+100 XP
2mos ago
tomasnorre wrote a reply+100 XP
4mos ago
tomasnorre wrote a comment+100 XP
4mos ago
tomasnorre liked a comment+100 XP
4mos ago
Thanks for that link. I am a new subscriber, so I was not aware of the issues around XP. That wasn't a vibe I had picked up on before subscribing.
Personally, I have ZERO interest in being on any leaderboard, I wish there was an opt-out option for that kind of thing.
I had hoped to use accumulating XP and levelling up as a measure of progress and consistency as I go from starting PHP/Laravel to getting my first small prototype running in the coming weeks. I have much to learn in that quest.
However, it seems (from reading that thread) that someone who has set significant time aside for watching/rewatching videos may be suspected of gaming a competitive XP system. My XP is currently frozen without explanation.
@JeffreyWay Would it be possible to allow subscribers to opt-out of XP leaderboards entirely in return for a reliable, predictable XP/Level progress score? These subscribers would then be beyond suspicion of gaming the system, as they are solely interested in personal tracking. Thanks.
tomasnorre wrote a reply+100 XP
4mos ago
There is a thread about XP for watching videos here https://laracasts.com/discuss/channels/site-improvements/forum-leaderboard-updates-and-question
The Forum part I know nothing about a change.
tomasnorre liked a comment+100 XP
4mos ago
There may be a bug with XP. I have noticed the same, though I only started last week. Despite 90 lessons this week, I've been stuck on 7600 XP for a few days.
XP is a fun feature, but I was also hoping to use it to set daily goals as I try to get up to speed with PHP and Laravel. Unfortunately XP is not updating for me either for activities on Laracasts.
(Really enjoying the tutorials anyway, and already getting value from the lifetime license!)
tomasnorre liked a comment+100 XP
4mos ago
tomasnorre started a new conversation+100 XP
4mos ago
I have currently 283,360 XPs, which I have had for quite a while. According to my profile, I have to be awarded +100 for some forum posts, but the points haven't been update lately.
Is there a Work in progress bug, or something I'm not aware of? I do know that there has been changes regarding XPs for watching videos. I'm not aware of any changes in the regards of forum posts, and the profile states entries of +100 XPs that it looks like never got added.
tomasnorre wrote a reply+100 XP
4mos ago
tomasnorre started a new conversation+100 XP
4mos ago
tomasnorre wrote a comment+100 XP
4mos ago
tomasnorre liked a comment+100 XP
4mos ago
Hi Jeremy,
First of all, thanks for this series. I love the new dual instructor video concept.
In the previous lesson, for $showPostButton, you used @isset, but now you're using @if(!empty($rows)). Why did you use the empty check in this lesson instead of isset? I can't think of any cases where isset wouldn't be enough.
(could also be that you didn't even think about it and just put in what looked good at that time 😊)
tomasnorre wrote a reply+100 XP
4mos ago
tomasnorre wrote a reply+100 XP
4mos ago
tomasnorre started a new conversation+100 XP
4mos ago
I have watched this video from Simon Vrachliotis about Logo Marquees, but I cannot get it to work. If I not have listened well or be able to read the transcript, cannot say, but my logos are still doing a big jump, which is address in the video, but I must to missing something.
I have added my code to this https://jsfiddle.net/ek10yox8/2/, but I cannot see what I'm doing wrong.
I hope someone would help me out.
I have added the code here too for those preferring it inline in post.
<div class="marquee-container">
<ul class="marquee">
<li><img src="https://picsum.photos/200/64" alt="Image"></li>
<li><img src="https://picsum.photos/200/64" alt="Image"></li>
<li><img src="https://picsum.photos/200/64" alt="Image"></li>
<li><img src="https://picsum.photos/200/64" alt="Image"></li>
<li><img src="https://picsum.photos/200/64" alt="Image"></li>
<!-- duplications -->
<li aria-hidden="true"><img src="https://picsum.photos/200/64" alt="Image"></li>
<li aria-hidden="true"><img src="https://picsum.photos/200/64" alt="Image"></li>
<li aria-hidden="true"><img src="https://picsum.photos/200/64" alt="Image"></li>
<li aria-hidden="true"><img src="https://picsum.photos/200/64" alt="Image"></li>
<li aria-hidden="true"><img src="https://picsum.photos/200/64" alt="Image"></li>
</ul>
</div>
li {
list-style: none;
}
.marquee-container {
max-width: 1000px;
margin: 4rem auto 0;
overflow: clip;
background: red;
mask-image: linear-gradient(
to right,
transparent 0%,
black 10%,
black 90%,
transparent 100%
);
}
.marquee {
display: flex;
gap: 6rem;
background: yellow;
}
.marquee > li {
flex-shrink: 0;
}
.marquee > li > img {
height: 60px;
}
@keyframes marquee {
0% {
transform: translateX(0);
}
100% {
transform: translateX(calc(-50% - 3rem)); /* 3rem is half the 6rem gap */
}
}
.marquee {
animation: marquee 3s linear infinite;
}
.marquee:hover {
animation-play-state: paused;
}
.marquee img {
filter: grayscale(100%);
transition: filter 0.2s;
}
.marquee img:hover {
filter: grayscale(0%);
}