multi-tenant: Undefined index: driver when sending notification to new created tenant
I have come across an issue when trying to send a welcome email after I set up a new tenant in my system.
I have put my controller and notification code below which will hopefully be straight forward to replicate for testing purposes.
I am interested to see if anyone else is having this issue too and what the fix might be?
Here is the error I am getting:

Stack Trace
[2018-02-05 21:51:23] local.ERROR: Undefined index: driver {"userId":14,"email":"hello@michaeldaly.me","exception":"[object] (ErrorException(code: 0): Undefined index: driver at /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php:115)
[stacktrace]
#0 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php(115): Illuminate\\Foundation\\Bootstrap\\HandleExceptions->handleError(8, 'Undefined index...', '/Users/mike/Sit...', 115, Array)
#1 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php(74): Illuminate\\Database\\DatabaseManager->makeConnection('tenant')
#2 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Auth/Passwords/PasswordBrokerManager.php(96): Illuminate\\Database\\DatabaseManager->connection('tenant')
#3 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Auth/Passwords/PasswordBrokerManager.php(74): Illuminate\\Auth\\Passwords\\PasswordBrokerManager->createTokenRepository(Array)
#4 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Auth/Passwords/PasswordBrokerManager.php(51): Illuminate\\Auth\\Passwords\\PasswordBrokerManager->resolve('users')
#5 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php(221): Illuminate\\Auth\\Passwords\\PasswordBrokerManager->broker()
#6 /Users/mike/Sites/openpci/app/Notifications/TenantCreated.php(23): Illuminate\\Support\\Facades\\Facade::__callStatic('broker', Array)
#7 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Notifications/Channels/MailChannel.php(50): App\\Notifications\\TenantCreated->toMail(Object(App\\User))
#8 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Notifications/NotificationSender.php(113): Illuminate\\Notifications\\Channels\\MailChannel->send(Object(App\\User), Object(App\\Notifications\\TenantCreated))
#9 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Notifications/NotificationSender.php(89): Illuminate\\Notifications\\NotificationSender->sendToNotifiable(Object(App\\User), '986a1f45-4c49-4...', Object(App\\Notifications\\TenantCreated), 'mail')
#10 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Notifications/NotificationSender.php(64): Illuminate\\Notifications\\NotificationSender->sendNow(Object(Illuminate\\Database\\Eloquent\\Collection), Object(App\\Notifications\\TenantCreated))
#11 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Notifications/ChannelManager.php(35): Illuminate\\Notifications\\NotificationSender->send(Object(Illuminate\\Database\\Eloquent\\Collection), Object(App\\Notifications\\TenantCreated))
#12 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Notifications/RoutesNotifications.php(18): Illuminate\\Notifications\\ChannelManager->send(Object(App\\User), Object(App\\Notifications\\TenantCreated))
#13 /Users/mike/Sites/openpci/app/Http/Controllers/TenantsController.php(50): App\\User->notify(Object(App\\Notifications\\TenantCreated))
#14 [internal function]: App\\Http\\Controllers\\TenantsController->store(Object(Illuminate\\Http\\Request))
#15 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): call_user_func_array(Array, Array)
#16 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(45): Illuminate\\Routing\\Controller->callAction('store', Array)
#17 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Routing/Route.php(212): Illuminate\\Routing\\ControllerDispatcher->dispatch(Object(Illuminate\\Routing\\Route), Object(App\\Http\\Controllers\\TenantsController), 'store')
#18 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Routing/Route.php(169): Illuminate\\Routing\\Route->runController()
#19 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Routing/Router.php(658): Illuminate\\Routing\\Route->run()
#20 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(30): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#21 /Users/mike/Sites/openpci/vendor/spatie/laravel-permission/src/Middlewares/RoleMiddleware.php(25): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#22 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Spatie\\Permission\\Middlewares\\RoleMiddleware->handle(Object(Illuminate\\Http\\Request), Object(Closure), 'super-admin')
#23 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#24 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(41): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#25 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#26 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#27 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php(43): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#28 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\\Auth\\Middleware\\Authenticate->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#29 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#30 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(67): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#31 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#32 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#33 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#34 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#35 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#36 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(63): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#37 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\\Session\\Middleware\\StartSession->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#38 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#39 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#40 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#41 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#42 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(59): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#43 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#44 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#45 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(102): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#46 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Routing/Router.php(660): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#47 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Routing/Router.php(635): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request))
#48 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Routing/Router.php(601): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route))
#49 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Routing/Router.php(590): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request))
#50 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(176): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request))
#51 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(30): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request))
#52 /Users/mike/Sites/openpci/vendor/fideloper/proxy/src/TrustProxies.php(56): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#53 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Fideloper\\Proxy\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#54 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#55 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(30): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#56 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#57 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#58 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(30): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#59 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#60 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#61 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#62 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#63 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#64 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php(46): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#65 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#66 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#67 /Users/mike/Sites/openpci/vendor/hyn/multi-tenant/src/Middleware/EagerIdentification.php(29): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#68 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Hyn\\Tenancy\\Middleware\\EagerIdentification->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#69 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#70 /Users/mike/Sites/openpci/vendor/hyn/multi-tenant/src/Middleware/HostnameActions.php(72): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#71 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Hyn\\Tenancy\\Middleware\\HostnameActions->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#72 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#73 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(102): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#74 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(151): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#75 /Users/mike/Sites/openpci/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(116): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request))
#76 /Users/mike/Sites/openpci/public/index.php(55): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request))
#77 /Users/mike/.composer/vendor/laravel/valet/server.php(133): require('/Users/mike/Sit...')
#78 {main}
"}
Tenant Controller
<?php
namespace App\Http\Controllers;
use App\Notifications\TenantCreated;
use App\User;
use Hyn\Tenancy\Environment;
use Hyn\Tenancy\Contracts\Repositories\CustomerRepository;
use Hyn\Tenancy\Contracts\Repositories\HostnameRepository;
use Hyn\Tenancy\Contracts\Repositories\WebsiteRepository;
use Hyn\Tenancy\Models\Customer;
use Hyn\Tenancy\Models\Hostname;
use Hyn\Tenancy\Models\Website;
use Illuminate\Console\Command;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
class TenantsController extends Controller
{
public function store(Request $request)
{
$tenantName = 'My Tenant Name';
$slug = 'my-tenant-name';
$name = 'First Tenant';
$email = 'test@example.com';
if ($this->tenantExists($name, $email)) {
// REPORT ERROR
return;
}
$this->registerTenant($tenantName, $slug, $name, $email);
$password = str_random();
$admin = $this->addAdmin($name, $email, $password);
$admin->notify(new TenantCreated());
return redirect('/admin/tenants');
}
private function tenantExists($name, $email)
{
return Customer::where('name', $name)->orWhere('email', $email)->exists();
}
private function registerTenant($tenantName, $tenantSlug, $name, $email)
{
// create a customer
$customer = new Customer;
$customer->name = $name;
$customer->email = $email;
app(CustomerRepository::class)->create($customer);
// associate the customer with a website
$website = new Website;
$website->customer()->associate($customer);
$website->name = $tenantName;
app(WebsiteRepository::class)->create($website);
// associate the website with a hostname
$hostname = new Hostname;
$baseUrl = config('app.url_base');
$hostname->fqdn = "{$tenantSlug}.{$baseUrl}";
$hostname->customer()->associate($customer);
app(HostnameRepository::class)->attach($hostname, $website);
return $hostname;
}
private function addAdmin($name, $email, $password)
{
return User::create(['name' => $name, 'email' => $email, 'password' => Hash::make($password)]);
}
}
Notification
namespace App\Notifications;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
use Illuminate\Support\Facades\Password;
class TenantCreated extends Notification
{
public function __construct()
{
}
public function via()
{
return ['mail'];
}
public function toMail($notifiable)
{
$token = Password::broker()->createToken($notifiable);
$resetUrl = "https://myurl.dev/password/reset/{$token}";
$app = config('app.name');
return (new MailMessage())
->subject("{$app} Invitation")
->greeting("Hello {$notifiable->name},")
->line("You have been invited to use {$app}!")
->line('To get started you need to set a password.')
->action('Set password', $resetUrl);
}
}
About this issue
- Original URL
- State: closed
- Created 6 years ago
- Comments: 27 (10 by maintainers)
@luceos I got same error after upgrade to 5.2 from 5.1 Initial user creation says
Undefined index: driverMy user table is in tenant database and Iuse UsesTenantConnectiontrait on User Model. Am I missing something? or it’s a bug?That is a change between 5.1 and 5.2, and is mentioned in the upgrade guide in the docs.
Environment->hostnameno longer sets the tenant, for exactly the reason you describe. This was a conscious decision, so no change/PR is necessary.I’m pretty sure I had this problem before and it was because the hostname was not set.
Try this