Para crear conexiones dinámicas en Laravel, que varíen en función de nuestras necesidades, tendremos que modificar los valores de los archivos de configuración, que están dentro de la carpeta config.
Los pasos son :
- Añadimos al archivo .env las nuevas referencias de valores de conexión.
- Creamos un tipo de conexión nueva en el archivo que establece nuestra conexión.
- Creamos una clase que se seteará dinámicamente los valores.
El archivo .env
Es el encargado de establecer la estructura básica del comportamiento de Laravel para conexiones entre otras cosas.
Aquí añadiremos el marco de las conexiones a la base de datos y al servidor.
DB_CONNECTION_VAR=server_variable DB_HOST_VAR= DB_HOST_VAR= DB_PORT_VAR= DB_DATABASE_VAR= DB_USERNAME_VAR= DB_PASSWORD_VAR= FTP_HOST= FTP_PASSWORD= FTP_USERNAME= FTP_PORT=
El archivo database.
Como sabemos este archivo establece los términos de conexión a la base de datos, e inicialmente toma valores del archivo .env.
Podemos crear en él, tantas conexiones, como necesitemos, así que lo que haremos será crear una nueva conexión, dentro de database, que será nuestro conexión dinámica:
'connections' => [……. 'server_variable' => [ 'driver' => 'mysql', 'url' => env('DB_DATABASE_URL_VAR',''), 'host' => env('DB_HOST_VAR', ''), 'port' => env('DB_PORT_VAR', ''), 'database' => env('DB_DATABASE_VAR','' ), 'username' => env('DB_USERNAME_VAR','' ), 'password' => env('DB_PASSWORD_VAR','' ), 'unix_socket' => env('DB_SOCKET_VAR', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => false, 'engine' => null, ], …………..]
Lo que haremos ahora es crear una clase que modifica los valores del archivo config, para poder acceder a ellos de modo dinámico y variarlos en función del tipo de conexión que queremos establecer.
La clase
?php namespace App\Personalizado; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Config; class Conexion { public function conectar() { $hora = date("H.i.s"); $sitio = DB::table('sitios')->where('hora_deseada','=',$hora)->get(); if ($sitio); { $sitio = DB::table('sitios')->where('id')->first(); $driv='msql'; $puerto_conex=$sitio->port_conex; $database_name=$sitio->nombre_bd; $user_name=$sitio->usuario_bd; $contra_=$sitio->pass_bd; $host_con=$sitio->host_conex; $user_FTP=$sitio->user_FTP; $pass_FTP=$sitio->pass_FTP; $port_conex=$sitio->port_conex;
Leer: Buenas practicas de programación en Laravel
Establecemos la ruta de los archivos database y filesystem, dentro del archivo config, utilizando la convención del punto de Laravel, y seteamos los datos dinámicos tomados de la bd.
Config::set([ 'database.connections.server_variable.driver'=>$driv, 'database.connections.server_variable.database'=>$database_name, 'database.connections.server_variable.username'=>$user_name, 'database.connections.server_variable.password'=>$contra, 'filesystem.disk.ftp.driver'=> 'ftp', 'filesystem.disk.ftp.host' => $host_con, 'filesystem.disk.ftp.username' => $user_FTP, 'filesystem.disk.ftp.password' => $pass_FTP, 'filesystem.disk.ftp.port' => $puerto_conex, ]);
Solo conectaremos por ahora via ftp_connect
$driver = ( Config::get('filesystem.disk.ftp.driver')); $host = ( Config::get('filesystem.disk.ftp.host')); $username = ( Config::get('filesystem.disk.ftp.username')); $password = ( Config::get('filesystem.disk.ftp.password')); $port = ( Config::get('filesystem.disk.ftp.port')); $conex = [$driver, $host, $username, $password, $port]; $ftp_conn = ftp_connect($host) or die("no conecta ftp"); if ($ftp_conn){ echo "<br>Conectado"; $login =ftp_login($ftp_conn,$username,$password); ftp_pasv($ftp_conn, TRUE); if($login) {echo "<br>logeado"; $remote='httpdocs/tienda/import/importacion.csv'; $local='./storage/app/csv/convertidos.csv'; if (ftp_put($ftp_conn,$remote,$local, FTP_BINARY)) { echo "<br>Upload";} else {echo "<br>not upload";} } else {echo "fallo login";} if(ftp_close($ftp_conn)) {echo "conexion cerrada";}; } return $conex; }
Y listo, esto es todo.
Espero modestamente que este artículo, sirva de ayuda a alguien.
Gracias.
….un sueño es casi todo y más que nada; más que todo al soñarlo, casi nada después……