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

Php 如何在Laravel中使用数据库进行邮件设置,php,laravel,laravel-5,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 /> config/app.php: 'p

我想让用户远离编辑配置文件,所以我在管理面板中创建了用于设置邮件服务器、用户名、密码、端口、加密的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 />

config/app.php:

'providers' => [

    ...

    'App\Providers\SettingsServiceProvider',

    ...

'aliases' => [

    ...

    'Settings' => 'App\Custom\Facades\Settings',


要存档此文件,我通过扩展
illighte\Mail\MailServiceProvider
创建了
CustomMailServiceProvider
,以覆盖此方法:

protected function registerSwiftTransport(){
    $this->app['swift.transport'] = $this->app->share(function($app)
    {
    return new TransportManager($app);
    });
}
这是完整的解决方案

  • 我在app\Providers中创建了CustomMailServiceProvider.php
  • 我在app/customs目录中创建了CustomTransportManager.php- 注意:默认的laravel 5目录结构中不存在app/customs目录,是我创建的
  • 最后,我用
    'app\Providers\CustomMailServiceProvider',
  • 我补充说

    $this->app['config']['services'] = [
            'mailgun' => [
                'domain' => $settings->mailgun_domain,
                'secret' => $settings->mailgun_secret,
            ]
            ];   
    
    要自定义TransportManager uu construct()以包含我用作邮件服务的mailgun API凭据,自Laravel 5.4以来已删除了方法share()。我不得不用其他方法来解决这个问题,我不确定它们是否完美。这是CustomMailServiceProvider类中的RegisterSwitTransport()方法

    首先,我们需要确定在通过命令行调用app时是否没有执行代码:“if(strpos(php_sapi_name(),'cli')==false)”。在这种情况下,若我们不进行检查,并且不阻止设置新参数,Artisan将在命令行中抛出错误。其次,我们需要以某种方式从数据库中获取设置。我使用getSettingValue()方法实现了这一点,其中第一个参数是设置键,如果找不到设置,第二个参数是默认值。如您所见,我为$this->app['config']['mail']分配了设置。 之后,我使用singleton()方法:


    我如前所述进行了配置,但是出现了以下错误。当我尝试您的代码时,发现Laravel5.4中的共享方法已被弃用,并被告知使用singleton

    调用未定义的方法\Foundation\Application::share()

    下面是使用singleton而不是share方法的以下方法:

    protected function registerSwiftTransport(){
        $this->app->singleton('swift.transport', function ($app){
            return new CustomTransportManager($app);
        });
    }
    

    我正在考虑通过Illumb\Mail\TransportManager扩展邮件的选项,正在处理它,等待您的响应。我的回答有用吗?
    <?php
    
    namespace App\Custom\Facades;
    
    use Illuminate\Support\Facades\Facade;
    
    class Settings extends Facade {
    
        protected static function getFacadeAccessor() { return 'settings'; }
    
    }
    
    protected function registerSwiftTransport(){
        $this->app['swift.transport'] = $this->app->share(function($app)
        {
        return new TransportManager($app);
        });
    }
    
    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);
            });
        }
    }
    
    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
               ];
           }
    
        }
    }
    
    $this->app['config']['services'] = [
            'mailgun' => [
                'domain' => $settings->mailgun_domain,
                'secret' => $settings->mailgun_secret,
            ]
            ];   
    
    protected function registerSwiftTransport(){
        if (strpos(php_sapi_name(), 'cli') === false) {
           $this->app['config']['mail'] = [
            'driver'        => Setting::getSettingValue('mail_driver', '****'),
            'host'          => Setting::getSettingValue('mail_host', '****'),
            'port'          => Setting::getSettingValue('mail_port', 25),
            'from'          => [
                'address'   => Setting::getSettingValue('mail_from_address', '****'),
                'name'      => Setting::getSettingValue('mail_from_name', '****'),
            ],
            'encryption'    => Setting::getSettingValue('mail_encryption', '***'),
            'username'      => Setting::getSettingValue('mail_username', '****'),
            'password'      => Setting::getSettingValue('mail_password', '****'),
         ];
       }
    
       $this->app->singleton('swift.transport', function ($app) { 
           return new Illuminate\Mail\TransportManager($app);
       });
    }
    
    protected function registerSwiftTransport(){
        $this->app->singleton('swift.transport', function ($app){
            return new CustomTransportManager($app);
        });
    }