Laravel Posts
How to Setup Swagger in Laravel ApplicationLaravel

How to Setup Swagger in Laravel ApplicationLaravel
Generally, we are using a Swagger in Laravel. it will take time if we set up swagger manually. so, In this article, I going to show you very easy steps for setup in Laravel.
You can watch the following video tutorial as well.
Steps 1:
You should download these assets from here. unzip the folder and go to the public directory. you can found the swagger
directory in the side public folder. let open the swagger
directory and you can see the following files.
- jquery-2.1.4.min.js
- style.css
- swagger-bundle.js
- swagger.yaml
If are you still confuse then visit this link for files.
now, Copy the swagger
directory and put it in your laravel application on the same path.
Steps 2:
We need to load swagger with proper swagger UI. so, let navigate to resources/views
on the downloaded source code project.
You can see the swagger
directory inside the views
directory.
copy the swagger directory to your laravel application on the same path. I don't think you need to do anything in this view file. let's go to the next step.
Steps 3:
You need to update this swagger.yaml
file. you should update the following details first. and then add APIs documentation in this file. Api document example given here. you can refer it.
info:
description: LPT APis
version: 1.0.0
title: LPT Frontend API's
basePath: /api/
Steps 4:
In this step, you need to create a route for loading swagger docs. so, let's open the web.php
file add the following few lines of code.
Route::get('/docs', function () {
return view('swagger.index');
});
Now, run a command php artisan serve
and open http://127.0.0.1:8000/docs
or open a virtualHostDomain/docs
if you have one.
You should watch this tutorial as well if you using InfyOm Generator
How to Implement Browser Push Notification in LaravelLaravel

How to Implement Browser Push Notification in LaravelLaravel
You can watch the following tutorial and you can continue reading this article.
Follow the Steps given here for setup push notification.
Step 1: You can quickly install Push via npm
npm install push.js --save
Step 2: Update webpack.mix.js
Add following code into webpack.mix.js
for copy and publish assets like js in the public directory. you can see the example here
mix.copy('node_modules/push.js/bin/push.min.js',
'public/assets/js/push.min.js');
I hope you know how to use laravel mix. you can watch this video tutorial if you want to know more about the laravel mix.
fire, npm run dev
command and publish js.
Step 3: Add assets in blade file
Add script before closing body tag.
<script src="{{ asset('assets/js/push.min.js') }}"></script>
Step 4: Add this code where you want to show a push
// add logo in public dir and use it here
const iconPath = '{{ asset('logo.PNG') }}
Push.create("Hello Shailesh!",{
body: "Welcome to the Dashboard.",
timeout: 5000,
icon: iconPath
});
How to use laravel multi tenant (stancl/tenancy) with single DB ?Laravel

How to use laravel multi tenant (stancl/tenancy) with single DB ?Laravel
Nowadays multi-tenant applications are more useful than single-tenant applications. We can use multi-tenant with multiple databases or single databases as per our need. But it's better to use a single DB with a multi-tenant when you have a small application.
In this tutorial, we are going to use multi-tenant with a single database.
We will implement multi-tenant with single DB by using the following package: https://github.com/archtechx/tenancy
Assuming you already have Laravel 8 repo setup. Now please follow the given steps to implement multi-tenancy with a single DB.
Package Installation
Run following commands :
-
composer require stancl/tenancy
-
php artisan tenancy:install
php artisan migrate
Add following service provider to config/app.php
App\Providers\TenancyServiceProvider::class
Create Custom Model
Now create modal named MultiTenant
into app\Models
MultiTenant.php
SavingTenant::class,
'saved' => TenantSaved::class,
'creating' => CreatingTenant::class,
// 'created' => TenantCreated::class,
'updating' => UpdatingTenant::class,
'updated' => TenantUpdated::class,
'deleting' => DeletingTenant::class,
'deleted' => TenantDeleted::class,
];
}
Update Tenancy Configuration
As we have added custom model we also need to define that model into config/tenancy.php
Please change tenant_model
value to our custom model.
'tenant_model' => \App\Models\MultiTenant::class,
Add Resolver
To use multi tenant with single DB we also need to add our customer resolver, that will be used into Middlewares that we will create ahead.
Create MultiTenantResolver
into app\Resolvers
App\Resolvers\MultiTenantResolver.php
find(Auth::user()->tenant_id)) {
return $tenant;
}
throw new TenantCouldNotBeIdentifiedByPathException($id);
}
public function getArgsForTenant(Tenant $tenant): array
{
return [
[$tenant->id],
];
}
}
Add Middleware
We will create our custom middleware that will set the current tenant into cache, and that will used by package to fire default query where('tenant_id', "tenant id we have set into middleware")
App\Http\Middleware\MultiTenantMiddleware.php
tenancy = $tenancy;
$this->resolver = $resolver;
}
/**
* Handle an incoming request.
*
* @param Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$tenant = Auth::user()->tenant_id;
return $this->initializeTenancy(
$request, $next, $tenant
);
}
}
Also, don't forget to add middleware alias into App\Http\kernel.php
protected $routeMiddleware = [
..............
'multi_tenant' => MultiTenantMiddleware::class,
];
Now we will apply this multi_tenant
middleware to our routes.
Add Trait to tenant-specific models
We have to add BelongsToTenant
trait to all of our tenant-specific models.
Say if we want to add tenant_id
into the users table then we must have to add BelongsToTenant
to the app\Models\User
model.
That trait will by default add following query everytime when we will try to fetch records or update records.
Where('tenant_id', 'tenant id will taken from cache')
Add tenant_id to tenant-specific migrations
As we have added the tenant trait, we must have to add tenant_id
into tenant-specific migrations as specified below.
public function up()
{
Schema::create('users', function (Blueprint $table) {
...........................
$table->string('tenant_id');
$table->foreign('tenant_id')
->references('id')
->on('tenants')
->onUpdate('cascade')
->onDelete('cascade');
$table->timestamps();
});
Update TenancyServiceProvider
Replace the App\Providers\TenactServiceProvider
by the following code.
[],
Events\TenantCreated::class => [
JobPipeline::make([
Jobs\CreateDatabase::class,
Jobs\MigrateDatabase::class,
// Jobs\SeedDatabase::class,
// Your own jobs to prepare the tenant.
// Provision API keys, create S3 buckets, anything you want!
])->send(function (Events\TenantCreated $event) {
return $event->tenant;
})->shouldBeQueued(false), // `false` by default, but you probably want to make this `true` for production.
],
Events\SavingTenant::class => [],
Events\TenantSaved::class => [],
Events\UpdatingTenant::class => [],
Events\TenantUpdated::class => [],
Events\DeletingTenant::class => [],
Events\TenantDeleted::class => [
JobPipeline::make([
Jobs\DeleteDatabase::class,
])->send(function (Events\TenantDeleted $event) {
return $event->tenant;
})->shouldBeQueued(false), // `false` by default, but you probably want to make this `true` for production.
],
// Domain events
Events\CreatingDomain::class => [],
Events\DomainCreated::class => [],
Events\SavingDomain::class => [],
Events\DomainSaved::class => [],
Events\UpdatingDomain::class => [],
Events\DomainUpdated::class => [],
Events\DeletingDomain::class => [],
Events\DomainDeleted::class => [],
// Database events
Events\DatabaseCreated::class => [],
Events\DatabaseMigrated::class => [],
Events\DatabaseSeeded::class => [],
Events\DatabaseRolledBack::class => [],
Events\DatabaseDeleted::class => [],
// Tenancy events
Events\InitializingTenancy::class => [],
Events\TenancyInitialized::class => [
// Listeners\BootstrapTenancy::class,
],
Events\EndingTenancy::class => [],
Events\TenancyEnded::class => [
Listeners\RevertToCentralContext::class,
],
Events\BootstrappingTenancy::class => [],
Events\TenancyBootstrapped::class => [],
Events\RevertingToCentralContext::class => [],
Events\RevertedToCentralContext::class => [],
// Resource syncing
Events\SyncedResourceSaved::class => [
Listeners\UpdateSyncedResource::class,
],
// Fired only when a synced resource is changed in a different DB than the origin DB (to avoid infinite loops)
Events\SyncedResourceChangedInForeignDatabase::class => [],
];
}
public function register()
{
//
}
public function boot()
{
$this->bootEvents();
// $this->mapRoutes();
$this->makeTenancyMiddlewareHighestPriority();
}
protected function bootEvents()
{
foreach ($this->events() as $event => $listeners) {
foreach (array_unique($listeners) as $listener) {
if ($listener instanceof JobPipeline) {
$listener = $listener->toListener();
}
Event::listen($event, $listener);
}
}
}
protected function mapRoutes()
{
if (file_exists(base_path('routes/tenant.php'))) {
Route::namespace(static::$controllerNamespace)
->group(base_path('routes/tenant.php'));
}
}
protected function makeTenancyMiddlewareHighestPriority()
{
$tenancyMiddleware = [
// Even higher priority than the initialization middleware
Middleware\PreventAccessFromCentralDomains::class,
Middleware\InitializeTenancyByDomain::class,
Middleware\InitializeTenancyBySubdomain::class,
Middleware\InitializeTenancyByDomainOrSubdomain::class,
Middleware\InitializeTenancyByPath::class,
Middleware\InitializeTenancyByRequestData::class,
];
foreach (array_reverse($tenancyMiddleware) as $middleware) {
$this->app[\Illuminate\Contracts\Http\Kernel::class]->prependToMiddlewarePriority($middleware);
}
}
}
Create / Fetch Tenant
Now we have to create a tenant and give that tenant_id to related users.
each user contains their specific tenant_id.
Use the following code to create a tenant :
$tenant1 = \App\Models\MultiTenant::create([
'name' => 'Tenant 1'
]);
$tenant2 = \App\Models\MultiTenant::create([
'name' => 'Tenant 2'
]);
That will create tenant into tenants
table and values will be stored into data
column as a son.
$tenant1 = App\Models\MultiTenant::where('data->name', 'Tenant 1')->first();
$tenant2 = App\Models\MultiTenant::where('data->name', 'Tenant 2')->first();
$tenant1User = User::where('id', 'user id here')->update(['tenant_id' => $tenant1->id]);
$tenant2User = User::where('id', 'user id here')->update(['tenant_id' => $tenant2->id]);
Now we have 2 tenants with 2 separate users who contain separate tenant ids.
Add Middleware to Routes
Now do login with User 1 and try to fetch all users from the database, it will return users of logged-in users' tenants only.
As we have the BelongToTenant
trait into the User
model.
Route::group(['middleware' => ['auth', 'multi_tenant']], function () { Route::get('users', function() {
// only tenant-1 users will be returned because we are setting the logged-in user tenant into the cache from `multi_tenant`middleware.
$allUsers = User::all();
});
});
You can use the same for other models too.
Hope this helps you.
How to setup React in LaravelLaravel

How to setup React in LaravelLaravel
In this article, I show you how to set up react application in Laravel Framework. as you know react is a very flexible frontend library and works with together any backend framework, so let start and follow the following steps. I hope you have created the laravel application.
You can watch the following video tutorial or follow this article as well,
Step 1:
Let's go to the resource directory in laravel. now let's create react application. you should watch the following tutorial if you don't know how to create react application.
Step 2:
Merge the package.json
and package-lock.json
files in the root. fire npm install && npm run dev
command in terminal for compile react application to js.
Step 3:
In this step, you need to set up a webpack.mix.js
file. put the following code in the webpack.mix.js
file.
mix.options({
postCss: [
require('autoprefixer'),
],
});
mix.setPublicPath('public');
mix.webpackConfig({
resolve: {
extensions: ['.js', '.vue'],
alias: {
'@': __dirname + 'resources'
}
},
output: {
chunkFilename: 'js/chunks/[name].js',
},
}).react();
// used to run app using reactjs
mix.js('resources/react-app/src/index.js', 'public/js/app.js').version();
mix.copy('resources/react-app/public', 'public');
NOTE: Don't forget to change the index.js path based on your application name
Step 4:
Let's add <div id="root"></div>
to your application's root blade file
Step 5:
Let's inlude <script type="text/javascript" src="{{ mix('js/app.js') }}"></script>
to your application's root blade file before end the body tag.
So, the Basic setup is done. enjoy react with laravel.
Fix 404 while reloading Gatsby Website for dynamic client-only routeGatsby

Fix 404 while reloading Gatsby Website for dynamic client-only routeGatsby
Last week, we run into a problem for one of the large Gatsby + ReactJS + Laravel projects in hosting which is hosted with Apache Webserver on Amazon AWS EC2. The problem we were facing was, for some reason, when we reload the Gatsby website, it was giving a 404 error page.
If you open a home page and then a normal visit then the website will fully function, but if you reload the page then it gives an error. And we found it happens when we are using Dynamic routing of React Route in Gatsby as per show in Gatsby documentation here.
Also, what we found, if we test the website build with gatsby serve
then it works fine. But while using Apache, it behaves differently and we found that this problem has been faced by lots of people over the internet.
So what we came up with is, we used gatsby serve
with an apache proxy. Here is how we did it,
Step 1 - Setup Project
As a first step, clone the project on the server and run a command, gatsby build
to create a gatsby build.
Step 2 - Setup PM2 for Gatsby Serve
The next step that we need to do is run gatsby serve
. But as you know, we can not run this command directly via console, because as you exit from the console, the command will be terminated.
So we will be using pm2 package, a NodeJS utility that is used to run nodejs apps.
For that, we will need to install pm2 globally. Run the following command to install it,
npm install pm2 -g
You can find other installation ways here if you need.
Once the installation has been done, let's run the gatsby serve command via pm2. For that run the following command from the gatsby project folder,
pm2 start gatsby --name my-web-app -- serve
where my-web-app
you can replace with the name of your app.
Once, it's running, try to test it, if it's working correctly by opening the URL http://your-ip-address:9000/. Make sure, port 9000 is opened on your server for traffic.
Step 3 - Configure Apache
Once, gatsby serve
is working and tested. The next step is to configure apache to proxy all port 80 traffic to port 9000.
For that, edit your apache conf file (or virtual host conf file), and add the following lines (or configure it to something like the following),
<VirtualHost *:80>
ServerName my-web-app.infyom.com
ServerAdmin webmaster@infyom.com
ProxyRequests On
ProxyPass / http://localhost:9000/
ProxyPassReverse / http://localhost:9000/
ErrorLog ${APACHE_LOG_DIR}/my-web-app.infyom.com.error.log
CustomLog ${APACHE_LOG_DIR}/my-web-app.log combined
......
# any other options below as per your need
......
</VirtualHost>
The next step you need to do is restart your apache server by,
sudo service apache2 restart
And then you can just open the URL https://my-web-app.infyom.com and it should work fine.
Bonus
New Deployment
Whenever you deploy a new code, you again need to run gatsby build
and then pm2 restart my-web-app
. Then only it will take new changes.
Troubleshooting
Sometimes, we found that we need to restart apache as well after the new deployment. so if you run into any trouble, then make sure to restart apache as well and it should solve the problem.
I hope it may help you to resolve your 404 problem.
How to generate User Device API using Laravel One SignalLaravel

How to generate User Device API using Laravel One SignalLaravel
Generally, we are using a Laravel One Signal package for push notification. if you are planning to use one signal in the mobile application then this package right for you.
Recently, I add a new feature UserDevice. let me explain why I added support for user Device APIs.
We need to create an API to register a device because One Signal sends a push notification using os player id. so, we need to store os_player_id in the backend from the mobile application. So, need to create an API for it.
Now. you can save your time using this package. you can Generate APIs using one artisan command,
php artisan one-signal.userDevice:publish
This command generates the following files,
- UserDeviceAPIController
- UserDeviceAPIRepository
- UserDevice (model)
- Migration So, everything is ready in minutes and delivered an API on the spot.
Also, do not forget to add the following routes to the api.php file.
use App\Http\Controllers\API\UserDeviceAPIController;
Route::post('user-device/register', [UserDeviceAPIController::class, 'registerDevice']);
Route::get('user-device/{playerId}/update-status', [UserDeviceAPIController::class, 'updateNotificationStatus'])
How to generate pre-signed URL from s3 bucket ?Laravel

How to generate pre-signed URL from s3 bucket ?Laravel
People nowadays are becoming more intelligent, so better to protect our application's content/data from those who are calling themself hackers.
One of the best examples is the data URLs from AWS buckets. it's not a good idea to store sensitive data into a public AWS Bucket, as the URL is accessible by the people.
Of Course, you can store profile avatars and others data to the public bucket's that not contains any confidential information. so that's fine.
But when it's about confidential information like PAN CARD Details, AADHAR Card Details, Bank Informations we Must Recommend using AWS Protected Bucket.
In this tutorial, we are going to show that how we can prevent that kind of case, Or how we can integrate AWS Protected Bucket in our Laravel Application.
The following code will help you to generate a pre-signed AWS URL that will prevent our data, that URL is non-guessable and it will expire within some minutes/hours specified by us.
So let's start with some code :
$s3 = \Storage::disk(config('filesystems.s3_protected_disk'));
$client = $s3->getDriver()->getAdapter()->getClient();
$expiry = "+1 minutes";
$command = $client->getCommand('GetObject', [
'Bucket' => \Config::get('filesystems.disks. s3_protected_disk.bucket'),
'Key' => 'Path to your file',
]);
$request = $client->createPresignedRequest($command, $expiry);
return (string) $request->getUrl();
So here we have created an s3 instance and it's stored on the $s3 variable, we have specified the expiry time as 1 minute so the given URL for data will be expired within a minute.
Also, we have to specify the bucket name and path to our protected file to generate AWS pre-signed URL.
It will return the pre-signed URL and its looks like as the following URL.
https://pre-signed.s3.au-west-2.amazonaws.com/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=xxxxxxxx%2F20180210%2Feu-west-2%2Fs3%2Faws4_request&X-Amz-Date=20210210T171315Z&X-Amz-Expires=60&X-Amz-Signature=xxxxxxxx&X-Amz-SignedHeaders=host
Hope this helps.
How to setup passwordless Login In LaravelLaravel

How to setup passwordless Login In LaravelLaravel
Basically, we set up email/username and password login in all our projects. but, sometimes we need to implement s passwordless login in the laravel application,
First of all, what is passwordless login? passwordless login is an authentication method that allows the user to log in without entering a password.
In this article, I show you how to set up passwordless login laravel step by step.
Step 1:
one great laravel package Laravel Passwordless Login provides the ability to log in without a password.
This package provides a temporary signed URL link that logs in a user, What it does not provide is a way of actually sending the link to the route to the user. This is because I don't want to make any assumptions about how you communicate with your users.
Step 2:
Open the terminal and go to the project directory and fire the following command to install
composer require grosv/laravel-passwordless-login
Step 3:
Configure the following variables in your env file
LPL_USER_MODEL=App\User
LPL_REMEMBER_LOGIN=false
LPL_LOGIN_ROUTE=/magic-login
LPL_LOGIN_ROUTE_NAME=magic-login
LPL_LOGIN_ROUTE_EXPIRES=30
LPL_REDIRECT_ON_LOGIN=/
LPL_USER_GUARD=web
LPL_USE_ONCE=false
LPL_INVALID_SIGNATURE_MESSAGE="Expired or Invalid Link"
Step 4:
Create one function in your login controller. it looks like
use App\User;
use Grosv\LaravelPasswordlessLogin\LoginUrl;
function sendLoginLink(\Request $request)
{
$user = User::where('email','=', $request->get('email))->first();
$generator = new LoginUrl($user);
$url = $generator->generate();
//OR Use a Facade
$url = PasswordlessLogin::forUser($user)->generate();
$data['url'] = $generator->generate();
$data['user'] = $user;
Mail::to($user->email)->send(new UserLoginMail($data));
return back();
}
Step 5:
Set following route in your web.php
Route::post('/user/login', [LoginController::class, 'sendLoginLink'])->name('userLogin');
Step 6:
Create one mailable. you can refer to a doc if not familiar. Also, fire the following command to create a mailable
php artisan make:mail UserLoginMail
Step 7: Create an Email UI as per your requirement.