2015-12-16 11 views
14

sto creando un progetto laravel per il quale ho bisogno installazione uno laravel e usare il suo esempio nel sub-dominio con database separato. E quelle informazioni del database separato non saranno in config/database.php. Otterrà dal database master e quindi riconnessa all'altro database.Come posso gestire sottodomini con l'installazione una laravel

Non ho trovato alcun modo corretto per farlo.

Avete qualche idea su questo?

Grazie per il vostro tempo.

+0

Stai chiedendo come configurare i sottodomini? Come, per due applicazioni Laravel separate? –

+0

@CaptainHypertext Penso che la parte del sottodominio sarà eseguita tramite l'host virtuale, sto cercando suggerimenti per la gestione del database. – C2486

+0

Il database separato è sullo stesso server? –

risposta

7

Laravel supporta più connessioni Database. In primo luogo, definire i collegamenti in 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' => '', 
     ), 
    ), 
); 

Ora per specificare quale connessione tuoi modelli dovrebbero usare è possibile impostare la proprietà $connection nei tuoi modelli:

<?php 

class YourModel extends Eloquent { 

    protected $connection = 'subdomain_connection'; 

} 

È possibile impostare il valore della $connection programatically.

3

vorrei fare in questo modo:

  • Creare un database per dominio

  • Impostare le connessioni DB disponibili in laravel config/database.php:

'connections' => [ 

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

    'mysql_domain_2' => [ 
     'driver' => 'mysql', 
     /* other config values... */ 
    ] 
]; 
  • Nel primo fase del ciclo di richiesta (per esempio in un Middleware), ottiene il sottodominio dalla richiesta, e impostare la connessione DB corrente di conseguenza

    Per esempio creare un middleware e nel metodo handle:

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); imposterà la connessione db utilizzato dall'intero domanda di corrente ciclo di richiesta

3

Se si desidera gestire questo dal database, controllare il nome host dall'URL http e chiamare la connessione al database dalla tabella principale in base al nome host. per esempio. (http://abc.maindomain.com, ottieni l'abc dall'URL)

3

La multi-tenancy è un'architettura complessa che richiede attenzione per la modellazione. Ci sono diversi modi per ottenere questa architettura. Alcuni decidono di utilizzare un singolo database mentre altri preferiscono utilizzare più database (nel tuo caso).

Entrambi hanno i loro pro e contro che è necessario prendere in considerazione. Ci sono molti fattori che devono essere presi in considerazione prima di iniziare a modellare la tua applicazione. es. Configurazione host virtuale per sottodomini, Migrazione del database (ripristino di tutti i database quando necessario, ecc.).Suggerirò questi due pacchetti che possono aiutarti ad andare avanti e fornirti maggiori informazioni su come modellare la tua applicazione in suite come desideri.

https://github.com/orchestral/tenanti

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

3

È possibile impostare la configurazione DB in questo modo:

$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')); 

Vedi questo link Set up dynamic database connection on Multi tenant application per il vostro riferimento.

0

Ecco come vorrei affrontare questo:

Nel vostro 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() 
) 
?> 

Con questo, specifici modelli sottodominio solo bisogno di specificare correttamente il collegamento $. Esempio:

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

In questo modo, le configurazioni di database sottodominio potrebbe essere salvato nel database master, rendendo i vostri modelli semplici e ancora laravel-ful. Inoltre, non ci sono brutti hack che possano rendere difficile l'aggiornamento della versione di Laravel.

0

Basta imbattersi in questa domanda, e IMHO a volte il suggerimento più semplice è il più semplice.

Ho appena posizionare un semplice interruttore a capo del file /config/database.php:

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

Poi basta utilizzare la variabile all'interno della variabile di configurazione restituito.

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

So che la sua non è il modo laravel, ma otterrà fuori di una correzione, se si desidera solo per aprire un ambiente di test rapido utilizzando la stessa codifica PHP, ma un'istanza di prova del database.

Problemi correlati