Call Auth:user() Laravel in extend Controller - laravel

I create my controller:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ResponsaveisController extends InternoController
{
}
I try to access Auth::user() multiple forms, all times return NULL
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Auth;
class InternoController extends Controller
{
/**
* Create a new controller instance.
*
* #return void
*/
public function __construct()
{
var_dump(Auth::user());
}
}
Would anyone have any suggestions on how to solve this issue?

This is taken directly from the Laravel docs
In previous versions of Laravel, you could access session variables or the authenticated user in your controller's constructor. This was never intended to be an explicit feature of the framework. In Laravel 5.3, you can't access the session or authenticated user in your controller's constructor because the middleware has not run yet
You can read about it here as it provides an alternative solution.

Related

How to access inputted token value - Laravel API

I am inputting a token as above and trying to print the token value with the below code. But getting error Undefined variable: token. I'm not sure whether i can access the token as below. Pls help me with ur suggestions.
<?php
namespace App\Http\Controllers;
use App\Models\Files;
use Illuminate\Support\Facades\Auth;
class FileController extends Controller
{
public function upload()
{
$tock=Auth::user()->$token;
dd($tock);
}
}
You are trying to access the $token variable on the user, even though it does not exist.
Instead you should by trying to access the request and the values that are send with the request. This can be achieved using the request() helper or by injecting the Request class into the function.
With injection:
<?php
namespace App\Http\Controllers;
use App\Models\Files;
use Illuminate\Http\Request; // Add request to namespace
use Illuminate\Support\Facades\Auth;
class FileController extends Controller
{
public function upload(Request $request)
{
dd($request->bearerToken());
}
}
Or, without injection:
<?php
namespace App\Http\Controllers;
use App\Models\Files;
use Illuminate\Support\Facades\Auth;
class FileController extends Controller
{
public function upload()
{
dd($request->bearerToken());
}
}
With the bearerToken() method you can access the Bearer token provided in the request.

How to queue Laravel 5.7 "email verification" email sending

Laravel 5.7 included "email verification" feature works well but not async email sending (during user register or resend link page) is not ideal.
Is there any way to send the email verification email through a queue without rewrite whole email verification in Laravel 5.7 ?
There is no built in way, but you can do it easily by extending and overriding.
First, create a new notification that extends the built-in notification, and also implements the ShouldQueue contract (to enable queuing). The following class assumes you create a notification at app/Notifications/VerifyEmailQueued.php:
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Auth\Notifications\VerifyEmail;
class VerifyEmailQueued extends VerifyEmail implements ShouldQueue
{
use Queueable;
// Nothing else needs to go here unless you want to customize
// the notification in any way.
}
Now you need to tell the framework to use your custom notification instead of the default one. You do this by overriding the sendEmailVerificationNotification() on your User model. This simply changes which notification gets sent out.
public function sendEmailVerificationNotification()
{
$this->notify(new \App\Notifications\VerifyEmailQueued);
}
Yes! It's possible. And to do that you will have to rewrite the sendEmailVerificationNotification in your App\User. This method is provided by the Illuminate\Auth\MustVerfiyEmail trait. The method sendEmailVerificationNotification notifies the created user by sending an Email as defined in the Illuminate\Auth\Notifications\VerifyEmail Notification class.
// This is the code defined in the sendEmailVerificationNotification
public function sendEmailVerificationNotification()
{
$this->notify(new Notifications\VerifyEmail);
}
You can change this method to not notify directly the user. You will have to define a Job which you will dispath in the sendEmailVerificationNotification method instead of notifying the created user.
In the Job class you will create a handle method where you can send the email to the user, but you must provide the $user to the Job which can be performed by passing it as a parameter to the dispatch method like this:
public function sendEmailVerificationNotification()
{
VerifyEmail::dispatch($this);
}
$this represents the created user and the App\Jobs\VerififyEmail job (which you will create) will receive all the parameters passed to the dispatch in its __construct
The code of the VerifyEmail will look like this:
namespace App\Jobs;
use App\User;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Auth\Notifications\VerifyEmail;
class VerifyEmail implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $user;
public function __construct(User $user)
{
$this->user = $user;
}
public function handle()
{
// Here the email verification will be sent to the user
$this->user->notify(new VerifyEmail);
}
}
My solution is for if you gonna register a user manually in the controller.
Laravel already created the Registered event and its listener SendEmailVerificationNotification.
-first configure queue in application
in .env file update QUEUE_CONNECTION=database.
for more queue documentation read https://laravel.com/docs/6.x/queues
publish queue table by php artisan queue:table
php artisan migrate
php artisan make:job EmailVerificationJob
in EmailVerificationJob.php add public variable
public $user;
in EmailVerificationJob.php constructor
public function __construct(User $user)
{
$this->user = $user;
}
in EmailVerificationJob.php handle function write event(new Registered($this->user)).
in your controller if user created successfully add this code for job to work.
EmailVerificationJob::dispatch($user)
->delay(now()->addSeconds(5));
here job delay for 5 seconds.
at the end you must start queue worker php artisan queue:work --tries=3 . here tries means how many times queue should try the job.
Update#1
this solution I used in Laravel 8.
first create SendEmailVerificationNotification notification class
php artisan make:notification SendEmailVerificationNotification
app/Notifications/SendEmailVerificationNotification.php file content will be this one. here we are going to extend Laravel default SendEmailVerificationNotification class and implement should queue
<?php
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
class SendEmailVerificationNotification extends \Illuminate\Auth\Listeners\SendEmailVerificationNotification implements ShouldQueue
{
use Queueable;
}
the last step is editing EventServiceProvider class $listen array. Comment out default notification of Registered event and add custom notification which we have created.
use App\Notifications\SendEmailVerificationNotification as QueuedSendEmailVerificationNotification;
use Illuminate\Auth\Events\Registered;
//use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
protected $listen = [
Registered::class => [
// SendEmailVerificationNotification::class,
QueuedSendEmailVerificationNotification::class
],
];
The solution is pretty simple:
Steps:
Configure Queue Driver
Go To --> Illuminate\Auth\Notifications\VerifyEmail
Implement 'ShouldQueue' interface and add a trait 'Queueable' on above mentioned class i.e. 'VerifyEmail' like this:
class VerifyEmail extends Notification implements ShouldQueue{
use Queueable;
....
....
...
}
3.That's it
Path of interface & trait:
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Bus\Queueable;
Please check the docs too:
https://laravel.com/docs/5.7/notifications#queueing-notifications

Custom validation using make:request returns controller not found

Using php artisan make:request StoreUserData I've create my rules to the request:
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StoreUserData extends FormRequest {
public function rules(){
return [
'name'=>'required|integer',
'surname'=>'required|max:255|string',
];
}
}
And I'm trying to use it in controller
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserDataController extends Controller {
public function store(StoreUserData $request){
return 'valid';
}
}
Here the error I get: Class App\Http\Controllers\StoreUserData does not exist.
PS. Is not a problem of routing.
I'm following this documentation since I'm using Laravel 5.6 https://laravel.com/docs/5.6/validation#creating-form-requests
Actually when you use StoreUserData in controller method then you have to import that class otherwise it will assume the class is in App\Http\Controllers namespace and thats why it throw Class App\Http\Controllers\StoreUserData does not exist.
just add the below import at top of your controller class
use App\Http\Requests\StoreUserData

Laravel class#method

This is Laravel 5.4 and I'm new to the framework.
I'm trying to create a custom validator but I want to use my own class rather than having a load of logic in App\Providers
However, when I call the class like this: 'MultiDateFieldValidator#validate' I get an error: Class MultiDateFieldValidator does not exist
If I use the full namespace it works: 'App\Validators\MultiDateFieldValidator#validate'
So my question is whether its normal to have to use the full namespace in the class#method call? Or whether you have to do some Laravel magic to make it recognise the namespace at the top of the file?
Code is below.
Thanks!
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Validator;
use App\Validators\MultiDateFieldValidator;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* #return void
*/
public function boot()
{
Validator::extend('foo', 'MultiDateFieldValidator#validate' );
}

Laravel 5.3 Custom Class

Create a custom class in laravel when I am call in controller construct then
Auth::user() not return any data
When call from in a function then it's work
Class Code
<?php namespace App\Libraries;
use App\User;
use Auth;
use Illuminate\Support\Facades\DB;
use App\Friends;
class AppLibrarie
{
private static $friends_ids = array();
public function __construct()
{
self::$friends_ids=Auth::user();
}
public function getfriends(){
return self::$friends_ids;
}
}
And Controller
<?php
namespace App\Http\Controllers;
use App\Libraries\AppLibrarie;
use Illuminate\Http\Request;
use App\Http\Requests;
class LiveController extends Controller
{
protected $lib;
public function __construct(AppLibrarie $appLibrarie)
{
$this->lib = $appLibrarie;
}
public function search(Request $request){
return response()->json($this->lib->searchdata($request->get('query')));
}
}
Accessing authenticated user sessions has been deprecated in Laravel 5.3. Here is the paragraph in the upgrade guide
In previous versions of Laravel, you could access session variables or the authenticated user in your controller's constructor. This was never intended to be an explicit feature of the framework. In Laravel 5.3, you can't access the session or authenticated user in your controller's constructor because the middleware has not run yet.
As an alternative, you may define a Closure based middleware directly in your controller's constructor. Before using this feature, make sure that your application is running Laravel 5.3.4 or above:
You will need to rethink your Authentication structure a bit if you are to upgrade

Resources