如何在Laravel中使用数据库进行邮件设置

mpe*_*pet 4 php laravel laravel-5

我想让用户远离编辑配置文件,所以我在管理面板中创建了用于设置邮件服务器,用户名,密码,端口,加密的web界面.我在Laravel 4.2中运行良好,但现在当应用程序已被重写为Laravel 5,发生错误:

Class 'Settings' not found in <b>F:\htdocs\app\config\mail.php</b> on line <b>18</b><br />
Run Code Online (Sandbox Code Playgroud)

为此我创建了一个服务提供者,制作了一个外观,将它们放在config/app.php中,Settings::get('var')/Settings::set('var')完美地工作,但不是用于邮件设置.


配置/ mail.php:

<?php return array(
            'driver' => Settings::get('mail_driver'),
            'host' => Settings::get('mail_host'),
            'port' => Settings::get('mail_port'),
            'from' => array('address' => Settings::get('mail_from_address'), 'name' => Settings::get('mail_from_name')),
            'encryption' => Settings::get('mail_encryption'),
            'username' => Settings::get('mail_username'),
            'password' => Settings::get('mail_password'),
            'sendmail' => Settings::get('mail_sendmail'),
            'pretend' => false,
            );
Run Code Online (Sandbox Code Playgroud)

配置/ app.php:

'providers' => [

    ...

    'App\Providers\SettingsServiceProvider',

    ...

'aliases' => [

    ...

    'Settings' => 'App\Custom\Facades\Settings',
Run Code Online (Sandbox Code Playgroud)
<?php namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Custom\Settings;

class SettingsServiceProvider extends ServiceProvider {

/**
 * Bootstrap the application services.
 *
 * @return void
 */
public function boot()
{
    //
}

/**
 * Register the application services.
 *
 * @return void
 */
public function register()
{
    $this->app->singleton('settings', function()
    {
        return new Settings;
    });
}

}
Run Code Online (Sandbox Code Playgroud)
<?php namespace App\Custom;

use App\Setting;

class Settings {
public function get($var) {

    try{
        $setting = Setting::first();                

    } catch(exception $e)
    {
        return false;
    }

    return $setting->$var;

}

public function set($var, $val) {

    try{
        $setting = Setting::first();
        $setting->$var = $val;              
        $setting->save();               

    } catch(exception $e)
    {
        return false;
    }

    return true;

}   
}
Run Code Online (Sandbox Code Playgroud)
<?php

namespace App\Custom\Facades;

use Illuminate\Support\Facades\Facade;

class Settings extends Facade {

    protected static function getFacadeAccessor() { return 'settings'; }

}
Run Code Online (Sandbox Code Playgroud)

有关如何使用数据库实现Laravel邮件设置的任何想法?

Eme*_*bah 8

要存档我CustomMailServiceProvider通过扩展 创建Illuminate\Mail\MailServiceProvider 以覆盖此方法:

protected function registerSwiftTransport(){
    $this->app['swift.transport'] = $this->app->share(function($app)
    {
    return new TransportManager($app);
    });
}
Run Code Online (Sandbox Code Playgroud)

这是完整的解决方案

  1. 我在app\Providers中创建了CustomMailServiceProvider.php

namespace App\Providers;

use Illuminate\Mail\MailServiceProvider;
use App\Customs\CustomTransportManager;

class CustomMailServiceProvider extends MailServiceProvider{

    protected function registerSwiftTransport(){
        $this->app['swift.transport'] = $this->app->share(function($app)
        {
            return new CustomTransportManager($app);
        });
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 我在app/customs目录中创建了CustomTransportManager.php - 注意:app/customs目录在默认的laravel 5目录结构中不存在,我创建了它

namespace App\Customs;

use Illuminate\Mail\TransportManager;
use App\Models\Setting; //my models are located in app\models

class CustomTransportManager extends TransportManager {

    /**
     * Create a new manager instance.
     *
     * @param  \Illuminate\Foundation\Application  $app
     * @return void
     */
    public function __construct($app)
    {
        $this->app = $app;

        if( $settings = Setting::all() ){

            $this->app['config']['mail'] = [
                'driver'        => $settings->mail_driver,
                'host'          => $settings->mail_host,
                'port'          => $settings->mail_port,
                'from'          => [
                'address'   => $settings->mail_from_address,
                'name'      => $settings->mail_from_name
                ],
                'encryption'    => $settings->mail_encryption,
                'username'      => $settings->mail_username,
                'password'      => $settings->mail_password,
                'sendmail'      => $settings->mail_sendmail,
                'pretend'       => $settings->mail_pretend
           ];
       }

    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 最后,我用'Illuminate\Mail\MailServiceProvider',config/app.php 替换了'App\Providers\CustomMailServiceProvider',