以邮箱配置为例
1. config辅助函数
提取数据config("mail.defaut")设置数据config(["mail.defaut"=>"ddddd"])
2. 数据库存储 配置信息存储在数据中 自定义实现即可
模型
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Setting extends Model { use HasFactory; protected $fillable = [ 'setting_key', 'setting_type', 'setting_value', ]; }
控制器
<?php namespace App\Http\Controllers\API; use Response; use Storage; use Log; use Cache; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use App\Models\Setting; class EmailSettingsController extends Controller { private $keys = [ "MAIL_MAILER", "MAIL_HOST", "MAIL_PORT", "MAIL_USERNAME", "MAIL_PASSWORD", "MAIL_ENCRYPTION", "MAIL_FROM_ADDRESS", "MAIL_FROM_NAME", ]; public function index(Request $request){ $emailSettings = [ "MAIL_MAILER"=>config("mail.default"), "MAIL_HOST"=>config("mail.mailers.smtp.host"), "MAIL_PORT"=>config("mail.mailers.smtp.port"), "MAIL_USERNAME"=>config("mail.mailers.smtp.username"), "MAIL_PASSWORD"=>config("mail.mailers.smtp.password"), "MAIL_ENCRYPTION"=>config("mail.mailers.smtp.encryption"), "MAIL_FROM_ADDRESS"=>config("mail.from.address"), "MAIL_FROM_NAME"=>config("mail.from.name") ]; return response(["data"=>$emailSettings]); } public function update(Request $request){ $check = validator($request->all(),[ 'MAIL_MAILER' =>'required', 'MAIL_HOST' =>'required', 'MAIL_PORT' =>'required', 'MAIL_USERNAME' =>'required', 'MAIL_PASSWORD' =>'required', 'MAIL_ENCRYPTION' =>'required', 'MAIL_FROM_ADDRESS' =>'required', 'MAIL_FROM_NAME' =>'required', ]); if($check->passes()){ Setting::whereIn("setting_key",$this->keys)->delete(); $settings = []; foreach($this->keys as $key){ $settings[$key] = [ "setting_key"=>$key, "setting_type"=>"string", "setting_value"=>$request->input($key) ]; } Setting::insert($settings); return response(['message'=>"数据已保留!"]); }else{ return response(['check_errors'=>$check->errors()],400); } } public function test(Request $request){ } }
3. 中间件 通过中间件批改对应路由下的邮箱配置
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use App\Models\Setting; class EmailSettingMiddleware { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle(Request $request, Closure $next) { $keys = [ "MAIL_MAILER"=>"mail.default", "MAIL_HOST"=>"mail.mailers.smtp.host", "MAIL_PORT"=>"mail.mailers.smtp.port", "MAIL_USERNAME"=>"mail.mailers.smtp.username", "MAIL_PASSWORD"=>"mail.mailers.smtp.password", "MAIL_ENCRYPTION"=>"mail.mailers.smtp.encryption", "MAIL_FROM_ADDRESS"=>"mail.from.address", "MAIL_FROM_NAME"=>"mail.from.name", ]; $settings = Setting::whereIn("setting_key",collect($keys)->keys()->toArray())->get(); foreach ($settings as $item) { config([$keys[$item->setting_key]=>$item->setting_value]); } return $next($request); } }