Level 1
Import the middleware class InitializeTenancyByDomain from the package folder instead of your Middleware folder:
use Stancl\Tenancy\Middleware\InitializeTenancyByDomain;
Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.
I tried to import middleware but still getting the same error
\<?php
use App\Http\Middleware\InitializeTenancyByDomain;
use App\Http\Middleware;
return [
/*
|--------------------------------------------------------------------------
| Sub-Domain Routing
|--------------------------------------------------------------------------
|
| This value is the "domain name" associated with your application. This
| can be used to prevent panel internal routes from being registered
| on subdomains that do not need access to your admin application.
|
| You can use the admin panel on a separate subdomain.
|
| Example: 'admin.example.com'
|
*/
'domain' => env('DASHBOARD_DOMAIN', null),
/*
|--------------------------------------------------------------------------
| Route Prefixes
|--------------------------------------------------------------------------
|
| This prefix method can be used for the prefix of each
| route in the administration panel. Feel free to
| change this path to anything you like.
|
| Example: '/', '/admin', '/panel'
|
*/
'prefix' => env('DASHBOARD_PREFIX', '/admin'),
/*
|--------------------------------------------------------------------------
| Middleware
|--------------------------------------------------------------------------
|
| This middleware will be assigned to every route, giving you the
| chance to add your own middleware to this stack or override any of
| the existing middleware. Or, you can stick with this stack.
|
| You can learn more here: https://laravel.com/docs/middleware
|
*/
// 'middleware' => [
// 'public' => ['web'],
// 'private' => ['web', 'platform'],
// ],
'middleware' => [
'public' => ['web', 'universal', InitializeTenancyByDomain::class], // Don't forget to import the middleware
'private' => ['web', 'platform', 'universal', InitializeTenancyByDomain::class],
],
/*
|--------------------------------------------------------------------------
| Guard
|--------------------------------------------------------------------------
|
| This can be used if you are using a multi-auth setup configured.
| Such as using an Admin model for Orchid and User Model for frontend access.
| If not using default auth guard remember to add 'auth:guard_name' to the middleware
| where guard_name is the custom guard name.
|
| You can learn more here: https://laravel.com/docs/authentication
|
*/
'guard' => config('auth.defaults.guard', 'web'),
/*
|--------------------------------------------------------------------------
| Auth Page
|--------------------------------------------------------------------------
|
| The property controls the visibility of Orchid's built-in authentication pages.
| You can disable this page and use your own set like 'Jetstream'
| You can learn more here: https://laravel.com/docs/authentication
|
| If your application consists entirely of an administration panel and you need
| the functions forgot password, two-factor authentication, registration,
| then consider using https://github.com/orchidsoftware/fortify
|
*/
'auth' => true,
/*
|--------------------------------------------------------------------------
| Main Route
|--------------------------------------------------------------------------
|
| The main page of the application is recorded as the name of the route,
| it will be opened by users when they enter or click on logos and links.
|
*/
'index' => 'platform.main',
/*
|--------------------------------------------------------------------------
| Dashboard Resource
|--------------------------------------------------------------------------
|
| Automatically connect the stored links.
|
| Example: '/application.js', '/style/classic/ui.css'
|
*/
'resource' => [
'stylesheets' => [],
'scripts' => [],
],
/*
|--------------------------------------------------------------------------
| Template view
|--------------------------------------------------------------------------
|
| Templates that will be displayed in the application and used pages,
| allowing to customize the part of the user interface that is
| suitable for specifying the name, logo, accompanying documents, etc.
|
| Example: Path to your file '/views/brand/header.blade.php',
| then its value should be 'brand.header'
|
*/
'template' => [
'header' => '',
'footer' => '',
],
/*
|--------------------------------------------------------------------------
| Default configuration for attachments.
|--------------------------------------------------------------------------
|
| Strategy properties for the file and storage used.
|
*/
'attachment' => [
'disk' => env('FILESYSTEM_DISK', 'public'),
'generator' => \Orchid\Attachment\Engines\Generator::class,
],
/*
|--------------------------------------------------------------------------
| Icons Path
|--------------------------------------------------------------------------
|
| Provide the path from your app to your SVG icons directory.
|
| Example: [ 'fa' => storage_path('app/fontawesome') ]
*/
'icons' => [
'orc' => \Orchid\IconPack\Path::getFolder(),
],
/*
|--------------------------------------------------------------------------
| Notifications
|--------------------------------------------------------------------------
|
| It are a great way to inform your users of things that are happening
| in your application. These notifications are viewable by clicking on
| the "notification bell" icon in the application's navigation bar.
| The notification bell will have an unread count indicator when
| there are unread announcements or notifications.
|
| By default, the interval update for one minute.
*/
'notifications' => [
'enabled' => true,
'interval' => 60,
],
/*
|--------------------------------------------------------------------------
| Search
|--------------------------------------------------------------------------
|
| List of models containing Presenter and Scout,
| which will appear in search results in the sidebar.
|
*/
'search' => [
// \App\Models\User::class
],
/*
|--------------------------------------------------------------------------
| Hotwire Turbo
|--------------------------------------------------------------------------
|
| Turbo Drive maintains a cache of recently visited pages.
| This cache serves two purposes: to display pages without accessing
| the network during restoration visits, and to improve perceived
| performance by showing temporary previews during application visits.
|
*/
'turbo' => [
'cache' => false,
],
/*
|--------------------------------------------------------------------------
| Fallback Page
|--------------------------------------------------------------------------
|
| If the request does not match any route and arguments,
| Orchid will automatically generate its own 404 page.
| It can be disabled if you want to declare routes on the same
| domain and prefix or create your own page.
|
*/
'fallback' => true,
/*
|--------------------------------------------------------------------------
| Service Provider
|--------------------------------------------------------------------------
|
| This value is a class namespace of the platform's service provider. You
| can override it to define a custom namespace. This may be useful if you
| want to place Orchid's service provider in a location different to
| "app/Orchid".
|
*/
'provider' => \App\Orchid\PlatformProvider::class,
];
The App service provider,php
\<?php
declare(strict_types=1);
namespace App\Providers;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\ServiceProvider;
use Stancl\JobPipeline\JobPipeline;
use Stancl\Tenancy\Events;
use Stancl\Tenancy\Jobs;
use Stancl\Tenancy\Listeners;
use Stancl\Tenancy\Middleware;
class TenancyServiceProvider extends ServiceProvider
{
// By default, no namespace is used to support the callable array syntax.
public static string $controllerNamespace = '';
public function events()
{
return [
// Tenant events
Events\CreatingTenant::class => [],
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 ($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);
}
}
}
Please or to participate in this conversation.