Aller au contenu

Configuration multi-site

ArtisanCMS supporte nativement le mode multi-site, permettant de gerer plusieurs sites web depuis une seule installation. Chaque site dispose de son propre contenu, de ses parametres et de son identite visuelle, tout en partageant la meme base de donnees et la meme infrastructure.

Le multi-site repose sur une architecture a base de donnees partagee. Une colonne site_id est presente sur les tables de contenu, permettant d’isoler les donnees de chaque site.

Le modele Site represente un site dans l’installation :

ChampTypeDescription
namestringNom du site
domainstringDomaine associe (ex: www.exemple.com)
localestringLangue principale du site
is_activebooleanSite actif ou desactive
is_primarybooleanSite principal de l’installation
settingsjsonSurcharges de parametres specifiques au site
class Site extends Model
{
protected $casts = [
'is_active' => 'boolean',
'is_primary' => 'boolean',
'settings' => 'array',
];
}

Le trait HasSiteScope est utilise par tous les modeles dont le contenu est propre a un site (pages, articles, medias, menus, etc.). Il applique automatiquement un scope global qui filtre les requetes selon le site courant :

trait HasSiteScope
{
protected static function bootHasSiteScope(): void
{
static::addGlobalScope('site', function (Builder $builder) {
$builder->where('site_id', current_site_id());
});
static::creating(function (Model $model) {
$model->site_id = current_site_id();
});
}
}

Ce trait garantit qu’un utilisateur ne voit et ne modifie que le contenu du site sur lequel il travaille, sans intervention manuelle dans les requetes.

Le middleware ResolveSite intercepte chaque requete et determine le site courant en fonction du domaine :

class ResolveSite
{
public function handle(Request $request, Closure $next)
{
$site = Site::where('domain', $request->getHost())
->where('is_active', true)
->first();
if ($site) {
app()->instance('current_site', $site);
}
return $next($request);
}
}

Si aucun site ne correspond au domaine de la requete, le site principal (is_primary = true) est utilise par defaut.

RessourceDescription
UtilisateursUn seul compte pour acceder a tous les sites
Roles et permissionsLes roles sont definis globalement
PluginsLes plugins sont installes une seule fois
MediathequeLes fichiers medias sont partages
RessourceDescription
PagesChaque site a ses propres pages
ArticlesLes articles sont propres a chaque site
MenusNavigation specifique par site
ParametresSurcharges de configuration par site
ThemesChaque site peut utiliser un theme different
TaxonomiesCategories et tags propres a chaque site

Le mode multi-site se configure dans config/cms.php :

config/cms.php
'multisite' => [
'enabled' => env('CMS_MULTISITE', false),
'shared' => ['users', 'roles', 'plugins', 'media'],
],

Activez le mode multi-site en definissant la variable d’environnement :

Fenêtre de terminal
CMS_MULTISITE=true

Une agence web peut gerer les sites de tous ses clients depuis une seule installation d’ArtisanCMS. Chaque client dispose de son propre domaine, contenu et identite visuelle.

Gerez un site en plusieurs langues avec un sous-domaine par langue (fr.exemple.com, en.exemple.com). Chaque site contient le contenu traduit dans sa langue.

Declinez un site en versions regionales avec du contenu adapte a chaque marche, tout en partageant les ressources communes (medias, plugins, utilisateurs).