Merci Popotte pour ta réponse,
J'utilise déjà ce système, le problème c'est que Laravel charge automatiquement toutes les routes dans l'ordre et si tu as 2 mêmes routes dans App et Clients il va prendre la dernière route => dans ton exemple la route Clients étant donné qu'il est en dernier dans le RouteProvider.
Mon problème c'est qu'il semble impossible de charger un fichier de route en fonction de l'url, je pense donc qu'il faut un Middleware qui va renvoyer une erreur 404 si la route ne correspond pas au domaine de l'url.
Exemple: app.exemple.com/login nous donne la route {client}.exemple.com/login dans ce cas l'url ne correspond pas à la route on renvois un erreur 404.
{client}.exemple.com/login retourne la view login
app.exemple.com/adminlogin retourne la vue admin.login
Le middleware devrait être associé à toutes les routes clients pour prévenir l'utilisation de ses routes dans l'admin. Mais je n'arrive pas formuler le code permettant de faire ce que je recherche.
Voici ce que j'ai actuellement et qui ne fonctionne pas.
Le Middleware PreventAccessFromAdmin
class PreventAccessFromAdmin
{
use UsesTenantModel;
use UsesMultitenancyConfig;
/**
* Handle an incoming request.
*
* @param Request $request
* @param Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
// Ceci n'est pas suffisant pour prévenir l'utilisation des routes identiques
// Il manque un OnFailResponse ??
if ($request->getHost() === config('app.admin_url')) {
abort(404);
}
return $next($request);
}
}
Les routes clients (tenants)
/**
* Tenants Routes
*/
Route::middleware(['web', 'tenant', 'PreventAccessFromAdmin'])->group(function () {
Route::get('/', function () {
return Inertia::render('Welcome', [
'canLogin' => Route::has('login'),
'canRegister' => Route::has('register'),
'laravelVersion' => Application::VERSION,
'phpVersion' => PHP_VERSION,
'tenant' => Tenant::current(),
]);
})->name('welcome');
Route::middleware(['auth:sanctum', 'verified'])->get('/dashboard', function () {
return Inertia::render('Dashboard');
})->name('dashboard');
});
Avec ça j'obtiens bien les views login, register et profil de JetStream avec client.exemple.com et une erreur sql avec app.exemple.com
Pour l'admin:
/**
* Admin Routes
*/
Route::domain('app.exemple.com')->middleware(['web', 'admin'])->group(function () {
Route::get('/', function () {
return "Admin Routes OK";
});
Route::get('/signup', function () {
return "Signup Page OK";
});
Route::get('/login', function () {
return "Login as Admin";
});
// Others route goes there.
// Catch All Route
Route::any('{any}', function () {
abort(404);
})->where('any', '.*');
});
Comme on peut le voir dans l'erreur il recherche la table landlord.users au lieu de la table landlord.admins (landlord est la db admin / tenant est la db clients)
Illuminate\Database\QueryException
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'landlord.users' doesn't exist (SQL: select count(*) as aggregate from `users` where `email` = test@test.com)
L'erreur se voir aussi dans la partie requête ou recherche un tenant (client) au lieu d'aller directement à admin
Partie debug de Laravel
Query
Query
select
*
from
`tenants`
where
`domain` = ?
limit
1
Time
1.78
Connection name
landlord
0
app.exemple.com
Petits détails supplémentaire j'utilise:
- Laravel 8
- Package Spatie/Multitenancy
- JetStream + InertiaJS scafolding
Toute aide sera la bienvenue Merci d'avance