#RESOLVIDO – Laravel erro Call to undefined function mb_strcut()

Caso você esteja recebendo o erro Call to undefined function mb_strcut() ao tentar reenviar o e-mail de confirmação ou em alguma outra tela, provavelmente você não está com o módulo do PHP mbstring instalado ou configurado.

No meu caso foi simples de resolver, como uso Linux e estou com o php 8.1 bastou rodar o seguinte comando no terminal:

sudo apt-get install php8.1-mbstring

E após isso reiniciar o serve do laravel.

Lembrando que o comando acima serve apenas caso o erro seja pelo modulo não instalado, ele ainda pode estar desativado, ai a solução é outra. E o comando a cima deve especificar a versão do php no caso …php8.1-….

Pronto agora é só partir para o próximo bug…

Verificação de E-mail para usuários com laravel 9.x

Este Artigo é basicamente uma tradução da documentação oficial do laravel: https://laravel.com/docs/9.x/verification

Sumário

  • Introdução
    • Preparando o Model
    • Preparando o Banco de Dados
  • Rotas (Routing)
    • Rota para notificar o usuário
    • Rota de confirmação de e-mail
    • Rota para reenvio do e-mail de confirmação
    • Protegendo as rotas
  • Personalizando o E-mail de confirmação
  • Configurando eventos manualmente

Introdução

A maioria dos apps e sistemas hoje em dia exigem que os usuarios cadastrados confirmem o e-mail para ter uma informação válidada.

O Laravel já tem essa função implementada nativamente em seu codigo, fazendo a configuração que este artigo descreve você vai conseguir enviar e-mails de validação para os usuários novos, válidar os e-mails através dos links enviados e reenviar e-mails de válidação caso necessário.

Tudo isso com segurança e muito simples de configurar.

Você já instalou o Starter Kit? O Starter Kit do laravel é responsavel por implementar toda autentificação de usuários, incluindo a válidação de e-mails que este artigo descreve.

Faça isso antes de seguir com este tutorial.

Preparando o Model

O priemiro passo é verificar se o model de usuários – App\Models\User – está com a  está implementando a verificação de e-mails – Illuminate\Contracts\Auth\MustVerifyEmail:

<?php
 
namespace App\Models;
 
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
 
class User extends Authenticatable implements MustVerifyEmail
{
    use Notifiable;
 
    // ...
}

Caso a linha -> “use Illuminate\Contracts\Auth\MustVerifyEmail;” não exista, insira ela como no código demonstrado acima, ou caso ela esteja comentada remova o comentário.

E não esqueça de verificar se na linha que está definindo a classe acima está finalizando com “implements MustVerifyEmail”.

Feito isto, os novos usuários registrados apartir de agora já receberão um e-mail com o link de verificação. Conforme você pode ver em App\Providers\EventServiceProvider, que o Laravel já contem o SendEmailVerificationNotification sendo chamado pelo evento Illuminate\Auth\Events\Registered.

Caso você esteja implementando a verificação de e-mail de forma completamente manual, sem estar usando o Starter Kit, tenha certeza de que você está disparando o Illuminate\Auth\Events\Registered após os registros de usuário, da seguinte forma:

use Illuminate\Auth\Events\Registered;
 
event(new Registered($user));

Preparando o Banco de Dados

Sua tabela de “users” no banco de dados deve conter a coluna “email_verified_at” para armazenar a data e hora em que o endereço de e-mail do usuário foi verificado.

Por padrão, o Laravel já incluí este campo na tabela de usuários. Você apenas precisar rodar as migrations:

php artisan migrate

Rotas (Routing)

Para implementar a verificação de e-mails são necessárias 3 rotas:

  • A primeira rota é responsável por exibir um aviso ao usuário de que ele deve clicar no link de verificação de e-mai enviado para ele
  • A segunda rota faz a verificação do email quando o usuário acessar o link enviado para ele
  • A terceira rota faz o reenvio do e-mail de verificação com o link quando o usuário solicitar.

Rota para notificar o usuário

Deve ser definida uma rota que retornará uma view avisando o usuário que ele precisa confirmar o e-mail clicando no link que foi enviado para ele via E-mail.

Essa visualização será exibida para os usuários quando eles tentarem acessar alguma parte do sistema que precise do e-mail válidado.

Lembre-se de que o link é enviado automaticamente por e-mail ao usuário, desde que seu modelo App\Models\User implemente a interface MustVerifyEmail.

Route::get('/email/verify', function () {
    return view('auth.verify-email');
})->middleware('auth')->name('verification.notice');

A rota que retorna o aviso de verificação por e-mail deve se chamar verification.notice.

É importante que a rota seja atribuída a esse nome, pois o middleware verificado incluído no Laravel será redirecionado automaticamente para esse nome de rota se um usuário não tiver verificado seu endereço de e-mail.

When manually implementing email verification, you are required to define the contents of the verification notice view yourself. If you would like scaffolding that includes all necessary authentication and verification views, check out the Laravel application starter kits.

Rota para reenvio do e-mail de confirmação

Next, we need to define a route that will handle requests generated when the user clicks the email verification link that was emailed to them. This route should be named verification.verify and be assigned the auth and signed middlewares:

use Illuminate\Foundation\Auth\EmailVerificationRequest;
 
Route::get('/email/verify/{id}/{hash}', function (EmailVerificationRequest $request) {
    $request->fulfill();
 
    return redirect('/home');
})->middleware(['auth', 'signed'])->name('verification.verify');


Before moving on, let’s take a closer look at this route. First, you’ll notice we are using an EmailVerificationRequest request type instead of the typical Illuminate\Http\Request instance. The EmailVerificationRequest is a form request that is included with Laravel. This request will automatically take care of validating the request’s id and hash parameters

Next, we can proceed directly to calling the fulfill method on the request. This method will call the markEmailAsVerified method on the authenticated user and dispatch the Illuminate\Auth\Events\Verified event. The markEmailAsVerified method is available to the default App\Models\User model via the Illuminate\Foundation\Auth\User base class. Once the user’s email address has been verified, you may redirect them wherever you wish.

Rota de confirmação de e-mail

Sometimes a user may misplace or accidentally delete the email address verification email. To accommodate this, you may wish to define a route to allow the user to request that the verification email be resent. You may then make a request to this route by placing a simple form submission button within your verification notice view:

use Illuminate\Http\Request;
 
Route::post('/email/verification-notification', function (Request $request) {
    $request->user()->sendEmailVerificationNotification();
 
    return back()->with('message', 'Verification link sent!');
})->middleware(['auth', 'throttle:6,1'])->name('verification.send');

Protegendo as rotas

Route middleware may be used to only allow verified users to access a given route. Laravel ships with a verified middleware, which references the Illuminate\Auth\Middleware\EnsureEmailIsVerified class. Since this middleware is already registered in your application’s HTTP kernel, all you need to do is attach the middleware to a route definition. Typically, this middleware is paired with the auth middleware:

Route::get('/profile', function () {
    // Only verified users may access this route...
})->middleware(['auth', 'verified']);

If an unverified user attempts to access a route that has been assigned this middleware, they will automatically be redirected to the verification.notice named route.

Personalizando o E-mail de confirmação

Although the default email verification notification should satisfy the requirements of most applications, Laravel allows you to customize how the email verification mail message is constructed.

To get started, pass a closure to the toMailUsing method provided by the Illuminate\Auth\Notifications\VerifyEmail notification. The closure will receive the notifiable model instance that is receiving the notification as well as the signed email verification URL that the user must visit to verify their email address. The closure should return an instance of Illuminate\Notifications\Messages\MailMessage. Typically, you should call the toMailUsing method from the boot method of your application’s App\Providers\AuthServiceProvider class:

use Illuminate\Auth\Notifications\VerifyEmail;
use Illuminate\Notifications\Messages\MailMessage;
 
/**
 * Register any authentication / authorization services.
 *
 * @return void
 */
public function boot()
{
    // ...
 
    VerifyEmail::toMailUsing(function ($notifiable, $url) {
        return (new MailMessage)
            ->subject('Verify Email Address')
            ->line('Click the button below to verify your email address.')
            ->action('Verify Email Address', $url);
    });
}

To learn more about mail notifications, please consult the mail notification documentation.

Configurando eventos manualmente

When using the Laravel application starter kits, Laravel dispatches events during the email verification process. If you are manually handling email verification for your application, you may wish to manually dispatch these events after verification is completed. You may attach listeners to these events in your application’s EventServiceProvider:

/**
 * The event listener mappings for the application.
 *
 * @var array
 */
protected $listen = [
    'Illuminate\Auth\Events\Verified' => [
        'App\Listeners\LogVerifiedUser',
    ],
];

Configurar e Testar envio de E-mails no Laravel 9.0

Direto ao ponto.

Para configurar você deve editar no arquivo .env as seguintes linhas:

MAIL_MAILER=smtp
MAIL_HOST= (O HOST DO SEU EMAIL ex mail.seudominio.com.br)
MAIL_PORT= (A porta de saída do seu email SMTP ex: 465)
MAIL_USERNAME= (O E-mail ex: teste@seudominio.com.br)
MAIL_PASSWORD= (Senha do seu e-mail)
MAIL_ENCRYPTION= (null | tls)
MAIL_FROM_ADDRESS= (O endereço de e-mail que vai aparecer como from nos e-mails enviados ex: "hello@example.com")
MAIL_FROM_NAME="${APP_NAME}" (Pode manter como está para mostrar o nome do projeto como nome do e-mail ou troque por um nome)

Os dados dessas linhas deve ser de um e-mail real e em funcionamento.

Caso o e-mail seja próprio da sua hospedagem você pode pesquisar da documentação da hospedagem qual a configuração do servidor. Ou normalmente quando você cria um e-mail ele já vem com um e-mail de configuração da caixa de entrada com todas as configurações.

Você também pode configurar o e-mail no arquivo config/mail.php ai é recomendando que você exclua ou comente as linhas de configuração de email no arquivo .env.

A escolha do arquivo de configuração a ser usado é importante ao versionar o projeto, tendo em vista quais configurações seram compartilhas entre os ambientes e quais arquivos seram comitados.

Testando as configurações de e-mail

Após configurar você pode testar se está funcionando pelo tinker, primeiro entre nele com o seguinte comando:

php artisan tinker

Então no tinker de o seguinte comando abaixo lembrando de alterar o endereço de e-mail para o qual você gostaria de receber a mensagem de teste.

Mail::raw('Hello World!', function($msg) {$msg->to('diego@delbianco.emp.br')->subject('Test Email'); });

Pronto, agora é só acertar os ajustes e seguir codando.

Corrigindo: Vite manifest not found at: /var/www/html/public/build/manifest.json

Acontece quando você instala o laravel e tenta acessar a tela /register ou /login sem estar com o comando  “npm run dev” rodando.

Ai você obtem o erro:

Vite manifest not found at:  public/build/manifest.json

O arquivo manifest.json fica disponivel apenas enquanto estiver rodando o comando: 

npm run dev

Quando o comando é finalizado ele deleta o arquivo manifest.json.

Mas é possivel manter o aquivo manifest.json mesmo enquanto o comando  “npm run dev“, não estiver rodando.

Para isso rode o seguinte comando:

npm run build

Pronto após esse comando o manifest.json já estará diponivel e você já pode partir para debugar outro erro!