Comment puis-je gérer des sous-domaines avec une installation laravel

je crée un projet laravel dont j'ai besoin une installation laravel et utilisez son instance dans le sous-domaine avec base de données distincte. Et ces informations de base de données séparées ne seront pas dans la configuration/base de données.php. Il sortira de la base de données principale et sera ensuite reconnecté à l'autre base de données.

Je n'ai pas trouvé le bon moyen de faire ça.

avez-vous une idée sur ce point ?

Merci pour votre temps.

14
demandé sur C2486 2015-12-16 13:30:03

7 réponses

Laravel supporte plusieurs connexions de base de données. Tout d'abord, définissez les connexions dans config/database.php:

<?php
return array(

    'default' => 'default_connection',

    'connections' => array(

        // domain.com
        'default_connection' => array(
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'primary_database',
            'username'  => 'username',
            'password'  => 'password'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),

        // sub.domain.com
        'subdomain_connection' => array(
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'secondary_database',
            'username'  => 'username',
            'password'  => 'password'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),
    ),
);

Maintenant pour spécifier la connexion de vos modèles devraient utiliser vous pouvez définir l' $connection propriété dans vos modèles:

<?php

class YourModel extends Eloquent {

    protected $connection = 'subdomain_connection';

}

Vous pouvez définir la valeur de $connection par programmation.

7
répondu noodles_ftw 2015-12-16 10:44:37

la multi-location est une architecture délicate qui doit être modélisée avec soin. Il existe plusieurs façons de réaliser cette architecture. Certains décident d'utiliser une seule base de données tandis que d'autres préfèrent utiliser plusieurs bases de données(qui est dans votre cas).

Ils ont tous deux leurs avantages et leurs inconvénients que vous devez considérer. Il y a beaucoup de facteurs qui doivent être pris en considération avant de commencer à modéliser votre application. par exemple, configuration de l'hôte virtuel pour les sous-domaines, migration de la base de données(rollback) toutes les bases de données lorsque le besoin, etc.). Je vais vous suggérer ces deux paquets qui peuvent vous aider à aller et vous donner plus d'idées sur la façon de modéliser votre application à la suite ce que vous voulez.

https://github.com/orchestral/tenanti

https://github.com/hyn/multi-tenant

4
répondu oseintow 2016-02-29 17:50:08

si vous voulez gérer cela à partir de la base de données, alors vérifiez le nom de l'hôte à partir de l'url http et appelez la connexion à la base de données à partir de la table principale selon le nom de l'hôte. par exemple (http://abc.maindomain.com, obtenir de l'abc à partir de l'url)

3
répondu Arvind 2015-12-16 11:40:21

je voudrais faire de cette façon:

  • Créer une base de données par domaine

  • configurer les connexions DB disponibles dans laravel config/database.php:

'connections' => [

     'mysql_domain_1' => [
        'driver'    => 'mysql',
        /* other config values... */
    ],

    'mysql_domain_2' => [
        'driver'    => 'mysql',
        /* other config values... */
    ]
];
  • dans la première phase du cycle de requête (par exemple dans un Middleware), récupérez le sous-domaine de la requête, et réglez la connexion DB actuelle en conséquence

    Par exemple créer un middleware et dans le handle méthode:

public function handle($request, Closure $next)
{
    //check the request URL and get subdomain

    //get the db connection associated to the subdomain 

    //set the connection for this request
    Config::set('database.default', $dbConnection);
} 

Config::set('database.default', $dbConnection ); définira la connexion db utilisée par l'ensemble de l'application pour le cycle de requête actuel

3
répondu Moppo 2015-12-18 17:09:33

Vous pouvez définir la configuration de DB en faisant ceci:

$tenant = Tenant::whereSubDomain($subdomain)->first();  
Config::set('database.connections.mysql.database', $tenant->db_name);       
Config::set('database.connections.mysql.username',$tenant->db_username);
Config::set('database.connections.mysql.password',$tenant->db_password);

dd(\DB::connection('mysql'));

Voir ce lien mise en place d'une connexion dynamique à la base de données sur une application multi locataires pour votre référence.

3
répondu John Roca 2016-03-01 07:15:27

Voici comment je m'y prendrais:

Dans votre config / database.php:

<?php
function getDatabaseConnectionParameters() {
    $connectionParams = array();

    // add the default connection
    // this is your master database
    $connParams = array(
        'driver'    => 'mysql',
        'host'      => 'localhost',
        'database'  => 'master',
        'username'  => 'master_user',
        'password'  => 'master_password',
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
        'strict'    => false,
    );
    array_push($connectionParams, array('mysql' => $connParams);

    // TODO: connect to your master database using PDO/mysqli or anything else you know.
    // The point is: you can't use Laravel ORM just yet because you are currently setting up its configuration!
    // Get the list of subdomain connection parameters and array_push it to $connectionParams just like above.
    // Example:
    // array_push($connectionParams, array('subdomain' => $subdomainConnParams)

    return $connectionParams;
}

return array (
    'default' => 'mysql'

    ,'connections' => getDatabaseConnectionParameters()
)
?>

avec ceci, les modèles spécifiques de sous-domaines n'ont besoin que de spécifier $connection correctement. Exemple:

<?php
class YourModel extends Eloquent {
    protected $connection = 'subdomain';
}
?>

de cette façon, vos configurations de base de données de sous-domaines pourraient être sauvegardées dans votre base de données maître, tout en rendant vos modèles simples et toujours Laravel-ful. De plus, il n'y a pas de piratage qui rendrait difficile la mise à jour de la version de Laravel.

0
répondu gmarintes 2016-03-06 21:13:25

juste tombé sur cette question, et IMHO parfois la suggestion la plus simple est la plus facile.

je place un simple interrupteur à la tête du fichier /config/database.fichier php:

switch($_SERVER['HTTP_HOST'])
{
case 'dev.yoursite.com':
    $selectedDatabase = 'mysite_dev';
    break;
case 'yoursite.com':
default:
    $selectedDatabase = 'mysite_live';
    break;
}

puis utilisez simplement la variable dans la variable de configuration renvoyée.

return [
    'connections' => 
        ['mysql' =>
             ['database' => $selectedDatabase,
              'username' => 'user_name',
              'password' => 'xxxxxxxxx',
             ],
        ]
    ];

je sais que ce n'est pas la façon laravel, mais ça va vous sortir d'une impasse si vous voulez juste ouvrir un environnement de test rapide en utilisant le même code PHP, mais une instance de test de votre la base de données.

0
répondu absolute 2018-02-14 11:02:02