J'ai créé un fournisseur de services dans mon Laravel Application SettingsServiceProvider
. Cela met en cache la table des paramètres de la base de données.
$settings = $cache->remember('settings', 60, function() use ($settings)
{
return $settings->pluck('value', 'name')->all();
});
config()->set('settings', $settings);
settings
table:
Je peux faire écho à la valeur du tableau comme ceci:
{{ config('settings.sitename') }} //returns Awesome Images
Cela fonctionne très bien sur tous les fichiers ou contrôleurs de lame dans App\Http\Controllers
Problème:
J'essaie de faire écho à la valeur de App\config\mail.php
comme ça:
'driver' => config('settings.maildriver'),
'Host' => config('settings.mailhost'),
Mais je reçois cette erreur:
Missing argument 1 for Illuminate\Support\Manager::createDriver()
Mise à jour:
J'ai créé un nouveau fournisseur de services MailServiceProvider
pour remplacer les paramètres dans Mail.php comme ceci:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Config;
class MailServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
Config::set('mail.driver', config('settings.maildriver'));
Config::set('mail.Host', config('settings.mailhost'));
Config::set('mail.port', config('settings.mailport'));
Config::set('mail.encryption', config('settings.mailencryption'));
Config::set('mail.username', config('settings.mailusername'));
Config::set('mail.password', config('settings.mailpassword'));
}
}
Mais je reçois toujours la même erreur !!
Existe-t-il un moyen de remplacer la configuration de messagerie par défaut (dans app/config/mail.php
) à la volée (par exemple, la configuration est stockée dans la base de données) avant la création du transport swiftmailer?
Lutté pendant 3 jours avec ce problème, j'ai finalement trouvé un moyen de le résoudre.
J'ai d'abord créé une table mails
et l'ai remplie avec mes valeurs. J'ai ensuite créé un fournisseur MailConfigServiceProvider.php
<?php
namespace App\Providers;
use Config;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\ServiceProvider;
class MailConfigServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
if (\Schema::hasTable('mails')) {
$mail = DB::table('mails')->first();
if ($mail) //checking if table is not empty
{
$config = array(
'driver' => $mail->driver,
'Host' => $mail->Host,
'port' => $mail->port,
'from' => array('address' => $mail->from_address, 'name' => $mail->from_name),
'encryption' => $mail->encryption,
'username' => $mail->username,
'password' => $mail->password,
'sendmail' => '/usr/sbin/sendmail -bs',
'pretend' => false,
);
Config::set('mail', $config);
}
}
}
}
Et puis enregistré dans le config\app.php
App\Providers\MailConfigServiceProvider::class,
Peut-être que c'est utile à quelqu'un, mais je l'ai résolu comme suit;
Dans un ServiceProvider
sous la méthode boot
-;
$settings = Cache::remember('settings', 60, function () {
return Setting::pluck('value', 'name')->all();
});
config()->set('settings', $settings); // optional
config()->set('mail', array_merge(config('mail'), [
'driver' => 'mailgun',
'from' => [
'address' => $settings['mail_from_address'],
'name' => $settings['mail_from_name']
]
]));
config()->set('services', array_merge(config('services'), [
'mailgun' => [
'domain' => $settings['mailgun_domain'],
'secret' => $settings['mailgun_secret']
]
]));
J'ai utilisé array_merge
avec la configuration d'origine, nous ne remplaçons donc que les valeurs dont nous avons besoin. Nous pouvons également utiliser la façade Cache
- dans la méthode boot
-.