Laravel 5.2 基于用户的动态环境变量

Posted

技术标签:

【中文标题】Laravel 5.2 基于用户的动态环境变量【英文标题】:Laravel 5.2 dynamic environment variables based on user 【发布时间】:2019-10-30 14:56:45 【问题描述】:

在我的 .env 文件中,我有两个变量

App_id: 12345
App_secret: abc123

但我想知道是否有一种方法可以让用户 userNo2 登录然后它会改为使用

App_id: 45678
App_secret: abc456

有没有办法根据用户在env 文件中添加if/else 功能?

【问题讨论】:

不,你不能。您应该为每个用户使用数据库。 .env file 仅在开发环境和生产环境之间更改值时使用 如果您正在尝试这种情况,请尝试使用一个包来存储价值,并且包名称是STORAGE,因为如果您登录以在存储中存储价值并且仅在此包使用缓存和存储价值时获取价值在缓存中一次去数据库,其他时间从缓存中获取值试试这个 这是向users 表添加其他列并将该信息存储在那里的完美方案。 【参考方案1】:

是的,这是可能的,但不在.env 文件中。相反,您可以将逻辑移至中间件:

第 1 步:将默认值添加到应用程序配置

打开您的app/config/app.php 并将您的默认值添加到现有数组中。

<?php

return [
    'APP_ID' => '45678',
    'APP_SECRET' => 'abc456',
    ...
];

第 2 步:创建新的中间件

php artisan make:middleware SetAppConfigForUserMiddleware

将文件编辑成如下所示:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Config;

class SetAppConfigForUserMiddleware

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    
         $authorizedUser = Auth::user();

        if (!App::runningInConsole() && !is_null($authorizedUser)) 
            Config::set('app.APP_ID', 'appidOfUser' . $authorizedUser->name);
            Config::set('app.APP_SECRET', 'appsecretOfUser' . $authorizedUser->email);
        
        return $next($request);
    

第 4 步:运行您的中间件

如果您需要在所有网络路由中为用户设置此配置,您可以添加到app/Http/kernel.php 中的$middlewareGroups 数组。这会将中间件应用到 web.php 内的所有路由。

/**
 * The application's route middleware groups.
 *
 * @var array
 */
protected $middlewareGroups = [
    'web' => [
        ...
        \App\Http\Middleware\SetAppConfigForUserMiddleware::class,        
    ],

第 5 步:测试

例如,我的Auth:user()-&gt;name 是“John”,我的Auth:user()-&gt;email 是“john@example.com”

如果你把它放在你的resources/views/home.blade.php

App Id Of User <code>config('app.APP_ID')</code>
App Secret Of User <code>config('app.APP_SECRET')</code>

结果将是appidOfUserJohnappsecretOfUserjohn@example.com

【讨论】:

几天来我一直在寻找关于在运行时更改配置的直接答案!感谢您的这篇文章! 欢迎您@Bart Mommens。希望对你有帮助【参考方案2】:

.env只能存储key-value。

因为.env 总是被配置使用,你可以使用Config::set('app.id', 45678); 在运行时改变环境。您可以将代码放在中间件中,请求结束后该值将恢复为默认值。

【讨论】:

以上是关于Laravel 5.2 基于用户的动态环境变量的主要内容,如果未能解决你的问题,请参考以下文章

通过配置环境变量,直接运行python3.5.2

Laravel 5.2 将变量传递给查询生成器

基于环境变量为多用户配置不同的JDK(win)

如何在 AWS AutoScaling 中添加 Laravel 环境文件

C++动态库环境变量的传递

S3C2440 移植最新5.2linux内核