tomasnorre's avatar

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's avatar

tomasnorre wrote a reply+100 XP

2mos ago

That would be great with the blade side of things too, just to get some input.

tomasnorre's avatar

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's avatar

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's avatar

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's avatar

tomasnorre wrote a comment+100 XP

2mos ago

The tests look incomplete to me. Neither image nor steps are tested. I also think that's why the tests are still green.

I would expect the DB transaction to also have $attributes parse to it, and not only $data.

I'm I wrong here?

tomasnorre's avatar

tomasnorre wrote a comment+100 XP

2mos ago

You don’t need “run” in “composer run format”. That is npm like..

Composer format is enough

tomasnorre's avatar

tomasnorre wrote a reply+100 XP

4mos ago

Thanks for your reply, will look into that. Where is it hosted? I want an EU based hosting.

tomasnorre's avatar

tomasnorre wrote a comment+100 XP

4mos ago

Why $ii and not just $i for index?

tomasnorre's avatar

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's avatar

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's avatar

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's avatar

tomasnorre liked a comment+100 XP

4mos ago

Lucky that you wrote that test, I was wondering if I had misunderstood something about how the foreign key constrains works in Laravel. Glad that I hadn't :)

tomasnorre's avatar

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's avatar

tomasnorre wrote a reply+100 XP

4mos ago

I would also not have any problems with some small self-hosted solution that I can use for static sites.

tomasnorre's avatar

tomasnorre started a new conversation+100 XP

4mos ago

Hi,

I'm looking for suggestions on a Form service for a static website. I will not expect many mails from the form. It has to be fairly cheap, hosted in Europe and be GPDR conforming.

Any suggestions would be appreciated.

Thanks.

tomasnorre's avatar

tomasnorre wrote a comment+100 XP

4mos ago

If post and repliks are both posts i would not delete on cascade if a user is deleted. I want to keep replies from deleted users too as it could make the replies section to look Strange if multiple replies are missing in the chronological order. So i would separate the models.

tomasnorre's avatar

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's avatar

tomasnorre wrote a reply+100 XP

4mos ago

It actually solved it at the end.

tomasnorre's avatar

tomasnorre wrote a reply+100 XP

4mos ago

This doesn't quite solve it, there is still a small jump, but not as big as before.

https://jsfiddle.net/205jfb7z/

tomasnorre's avatar

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>