Is it possible to import excel data into laravel REST API? - laravel

I don't know how to import the excel data to my database via REST API in laravel, I try so much research on google but those tutorials and videos aren't related to API..... pls help

Download the dependecy using composer for Import and export excel file.
composer require maatwebsite/excel
Add providers and aliases in config/app.php
'providers' => [
/*
* Laravel Framework Service Providers...
*/
......,
......,
Maatwebsite\Excel\ExcelServiceProvider::class,
]
'aliases' => [
.......,
-------,
'Excel' => Maatwebsite\Excel\Facades\Excel::class,
]
Now publish the changes using vendor:publish
php artisan vendor:publish
Make migration and migrate it using command.
Add routes
Create Import and Export class using import/export command
Note: This command avaialble only if you download dependecy successfully using composer(step 1)
In app/Imports/BulkImport.php file
<?php
namespace App\Imports;
use App\Bulk;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
class BulkImport implements ToModel,WithHeadingRow
{
/**
* #param array $row
*
* #return \Illuminate\Database\Eloquent\Model|null
*/
public function model(array $row)
{
return new Bulk([
'name' => $row['name'],//fields from excel
'email' => $row['email'],
]);
}
}
Make A controller and in controller use
Excel::import(new BulkImport,request()->file('file'));
Bulk is the model in this example
Hope it Will helps Have a Good Day

Related

How can i change the password reset URL in a Laravel Project?

In a Laravel project in the folder app/mail there is a file called WelcomeDogSchoolManager.php
In this file I can see the text that is being sent when a new user registers himself.
Within this file, I can see the following code:
#component('mail::button', ['url' => $passwordResetUrl])
Registreren
#endcomponent
Unfortunately, the developer left a mistake in the $passwordResetUrl (leaving it at "https://login..{domain}.nl" instead of the required "https://login.{domain}.nl"
This causes all my users being unable to register (unless they manipulate the URL).
Where in the Laravel Project can I search for the option to change the $passwordResetUrl?
I have no working knowledge of Laravel and am basically just searching through all the files on the server using Filezilla, trying to figure it all out. I got to this point, but have no idea how to proceed further. And since I have 7.200 files left, I don't think I will find it quickly :)
Any tips are appreciated!
PS. I have also found this code. Is this helpful?
$this->passwordResetUrl = url(route('password.reset', [ 'token' => $token, 'email' => $this->user->email, ], false));
Is this helpful?
Full code for the file below
<?php
namespace App\Mail;
use App\Models\DogSchool;
use App\Models\User;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Password;
class WelcomeDogSchoolManager extends Mailable
{
use Queueable;
use SerializesModels;
public $subject = 'Welkom bij de Nederlandse Detectie Bond';
public string $passwordResetUrl;
/**
* Create a new message instance.
*
* #return void
*/
public function __construct(public User $user, public DogSchool $dogSchool)
{
$token = Password::getRepository()->create($user);
$this->passwordResetUrl = url(route('password.reset', [
'token' => $token,
'email' => $this->user->email,
], false));
}
/**
* Build the message.
*
* #return $this
*/
public function build()
{
return $this->markdown('emails.welcome_dog_school_manager');
}
}
this
url(route('password.reset', [ 'token' => $token, 'email' => $this->user->email, ], false));
will generate the correct url provided your APP_URL is correct.
In your question, you repeated the same url for the desired and actual so its hard to say exactly what is wrong.

Laravel Cashier - Class "App\Models\User" not found

When trying to cancel a subscription with Laravel Cashier, it returns the error:
Class "App\Models\User" not found
Code:
public function cancel(Request $request) {
$subscription = Auth::user()->subscription('default');
$subscription->cancel();
}
This is likely because my user model is not located at "App\Models\User" (the new default in Laravel 8), but rather it is located at "App\User".
In the official documents, it mentions this:
If you're using a model other than Laravel's supplied App\Models\User model, you'll need to publish and alter the Cashier migrations provided to match your alternative model's table name.
But this isn't the problem. My table name is the same, but the location of my model is different.
How do I fix this?
use App\User; // this is important in your case
use Laravel\Cashier\Cashier;
/**
* Bootstrap any application services.
*
* #return void
*/
public function boot()
{
Cashier::useCustomerModel(User::class);
}
Docs: https://laravel.com/docs/8.x/billing#billable-model
Try change your providers config in config/auth.php
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
]
Reference https://laravel.com/docs/8.x/authentication#the-user-provider-contract

Using custom package view templates for email verification notification

I'm sending email verification by extending VerifyEmail in my custom package:
<?php
namespace MyPackages\Foo\Notifications;
use Illuminate\Support\Facades\Crypt;
class VerifyEmail extends \Illuminate\Auth\Notifications\VerifyEmail
{
/**
* Get the verification URL for the given notifiable.
*
* #param mixed $notifiable
* #return string
*/
protected function verificationUrl($notifiable)
{
$hash = Crypt::encrypt($notifiable->getKey());
return config('foo.email_verify_url') . $hash;
}
}
It's correctly using the url from config/foo.php in Foo package.
But how to tell it to use the templates which are in the two following folders:
packages/my-packages/foo/src/resources/views/vendor/mail
packages/my-packages/foo/src/resources/views/vendor/notifications
instead of the templates in:
resources/views/vendor/mail
resources/views/vendor/notifications
Knowing that I also have...
$this->loadViewsFrom(__DIR__ . '/../resources/views', 'foo');
...set in my package provider.
Handling views in custom Laravel packages is documented here: Package development - views
Option 1: Views in your Laravel installation
In config/view.php you can add additional paths where your views are located - see the config.
'paths' => [
resource_path('views'),
// ...
],
Option 2: Custom package
If you ship your views inside a custom package, the you would need to publish your views.
In your service provider specify the package views folder
protected function loadViews()
{
$this->loadViewsFrom(__DIR__.'/../resources/views', 'foo');
$this->publishes([
__DIR__.'/../resources/views' => resource_path('views/vendor/foo'),
]);
}
Then run artisan vendor:publish (Laravel docs) to make them available to your main application.

Getting class does not exist error when running database seeder

I am creating a seeder in laravel 6.1 but I keep getting this error
Illuminate\Contracts\Container\BindingResolutionException : Target class [AdminsTableSeeder] does not exist.
I tried running composer dump-autoload and composer dumpautoload, it doesn't work for me.
here is my AdminsTableSeeder.php
use App\Models\Admin;
use Faker\Factory as Faker;
use Illuminate\Database\Seeder;
class AdminsTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* #return void
*/
public function run()
{
$faker = Faker::create();
Admin::create([
'name' => $faker->name,
'email' => 'admin#admin.com',
'password' => bcrypt('password'),
]);
}
}
and here is my DatabaseSeeder.php
<?php
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* #return void
*/
public function run()
{
$this->call(AdminsTableSeeder::class);
}
}
Make sure your AdminsTableSeeder.php file is in the same directory where you have your DatabaseSeeder.php file.
Run
composer dump-autoload
then try
php artisan db:seed
Optional.
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* #return void
*/
public function run(){
$this->call('AdminsTableSeeder');
}
}
try with $this->call('AdminsTableSeeder'); like this.
In your case, move all seeder files from previous database/seeds directory to database/seeders folder & then run composer dump-autoload.
Remember, from laravel 8 seeders and factories are namespaced
To accommodate for these changes,
[1] - Add Database\Seeders namespace to your seeder classes.
namespace Database\Seeders;
[2] - Move all seeder files to database/seeders folder.
[3] - If you import any seeders classes in DatabaseSeeder file then remove all of them. (simply remove all lines that started with use Database\Seeders\... from DatabaseSeeder.php)
[4] - Finally run dump-autoload.
composer dump-autoload
You can now try a fresh migration with seed,
php artisan migrate:fresh --seed
For my case(I use Laravel 8), I solved my problem by modifying the RouteServiceProvider.php file in App/Providers/ path. I uncommented code on line 29.
protected $namespace = 'App\\Http\\Controllers';
It worked for me.
run
composer dump-autoload
then try
php artisan db:seed
For Laravel 8:
I have the same issue and I found a solution in Laravel doc and it's worked for me.
https://laravel.com/docs/8.x/upgrade#seeder-factory-namespaces
Update Composer:
"autoload": {
"psr-4": {
"App\\": "app/",
"Database\\Factories\\": "database/factories/",
"Database\\Seeders\\": "database/seeders/"
}
}
Run:
composer dumpautoload
php artisan db:seed --force
Concerning my case, I used the latest Laravel 8 which is the latest version, I solved my problem by changing the RouteServiceProvider.php file in App/Providers/ path by uncommenting the code on line 29.
protected $namespace = 'App\Http\Controllers';
For Laravel ^7.0
If your using Laravel Eloquent
Example:
<?php
use App\Models\User;
use Illuminate\Database\Seeder;
class UsersTableSeeder extends Seeder
{
public function run()
{
$users = [
[
'id' => 1,
'name' => 'Admin',
'email' => 'admin#admin.com',
'password' => bcrypt('password'),
'remember_token' => null,
],
];
User::insert($users);
}
}
If your using Laravel Query Builder
Example:
<?php
//Do not use -> namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class UsersTableSeeder extends Seeder
{
public function run()
{
DB::table('users')->insert([
'name' => 'Admin',
'email' => 'admin#admin.com',
'password' => bcrypt('password'),
'remember_token' => null,
]);
}
}
In your DatabaseSeeder.php
<?php
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
public function run()
{
$this->call([
UsersTableSeeder::class,
]);
}
}
Seems like the controller name is case-sensitive in Laravel 8. So my suggestion is to double-check the controller name.
For instance:
in web.php avoid calling
UserAPIController
as
UserApiController
(API as api)
It may fix this error.
In your DatabaseSeeder.php, you can add the nameSpace for AdminsTableSeeder like -
use App\Models\Admin\AdminsTableSeeder;
Closing the current running serve before doing db:seeds

MorphMap is not working in Laravel 5.6

I am using Polymorphic relationship in my models and with polymorphic relations I want to use Moprph map. To implement the concept of morph map I wrote my own service provider and registered it in app.php. Everything is working fine except Morph map. Morphmap is not working even with AppServiceProvider. Please have a look on my code
Service Provider
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Database\Eloquent\Relations\Relation;
class MorphServiceProvider extends ServiceProvider
{
/**
* Bootstrap services.
*
* #return void
*/
public function boot()
{
Relation::morphMap([
'First' => FirstModel::class,
'Second' => SecondModel::class,
'Third' => ThirdModel::class
]);
}
/**
* Register services.
*
* #return void
*/
public function register()
{
//
}
}
I ran into this situation too. Finally I solved this problem by running artisan command:
php artisan cache:clear
The Reason Why MorphMap is not working
The new custom service is not loaded. Check bootstrap/cache/services.php to see if the new ServiceProvider is in the array of providers
<?php return array (
'providers' =>
array (
0 => 'Illuminate\\Auth\\AuthServiceProvider',
1 => 'Illuminate\\Broadcasting\\BroadcastServiceProvider',
2 => 'Illuminate\\Bus\\BusServiceProvider',
3 => 'Illuminate\\Cache\\CacheServiceProvider',
4 => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
5 => 'Illuminate\\Cookie\\CookieServiceProvider',
6 => 'Illuminate\\Database\\DatabaseServiceProvider',
7 => 'Illuminate\\Encryption\\EncryptionServiceProvider',
8 => 'Illuminate\\Filesystem\\FilesystemServiceProvider',
//...
By default this file should update automatically after the app.php has been altered.
In my situation, I accidentally ran the command php artisan config:cache before. This prevent the services.php from updating. Further Reference:
Laravel Doc: Configuration
Why caching config would prevent services.php from updating
check bootstrap/cache/config.php, look inside what's in there. providers is part of application config
check Illuminate\Foundation\Http\Kernel
protected $bootstrappers = [
\Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables::class,
\Illuminate\Foundation\Bootstrap\LoadConfiguration::class,
\Illuminate\Foundation\Bootstrap\HandleExceptions::class,
\Illuminate\Foundation\Bootstrap\RegisterFacades::class,
\Illuminate\Foundation\Bootstrap\RegisterProviders::class,
\Illuminate\Foundation\Bootstrap\BootProviders::class,
];
check Illuminate\Foundation\Bootstrap\LoadConfiguration
check Illuminate\Foundation\Application, registerConfiguredProviders
Finally, I have to say that I am quite new to laravel. If I made some mistakes, let me know. Thank you.

Resources