为啥代码审核大佬告诉我代码中要尽量少些 env ('App_ENV') === 'local' 这种代码

问题:

今天代码提交审核,代码中有个判断是根据 APP_ENV 值做判断,然后不去走auth中间件的;但审核代码的大佬却告诉我尽量不要这么写? 我思前想后,始终不太明白,为啥不能让这么写!laravel框架给出这个配置不就是让开发人员根据不同环境做不同的事的么?

求各位有经验的大佬解疑答惑!

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案
  1. 如果执行了artisan config:cache,那么.env将不会被加载

  2. 看着不爽,建议封装个isLocal()方法

3年前 评论
goudan (楼主) 3年前
hello_bye_ 3年前
lyxxxh (作者) 3年前
讨论数量: 14

env是在配置文件中使用的;在其他代码文件中不要直接使用env;请使用配置文件

比如你可以这样操作:

在 config/app 文件中是这样

 'env' => env('APP_ENV', 'production'), 

在其他地方判断环境变量

config('app.env') == 'production'
3年前 评论
  1. 如果执行了artisan config:cache,那么.env将不会被加载

  2. 看着不爽,建议封装个isLocal()方法

3年前 评论
goudan (楼主) 3年前
hello_bye_ 3年前
lyxxxh (作者) 3年前

env是在配置文件中使用的;在其他代码文件中不要直接使用env;请使用配置文件

比如你可以这样操作:

在 config/app 文件中是这样

 'env' => env('APP_ENV', 'production'), 

在其他地方判断环境变量

config('app.env') == 'production'
3年前 评论
panda-sir

尽量走配置文件 比如config('app.env')

3年前 评论

只推荐在config中使用 env 函数

3年前 评论
  1. 如果执行了artisan config:cache,那么.env将不会被加载

  2. 看着不爽,建议封装个isLocal()方法

3年前 评论
goudan (楼主) 3年前
hello_bye_ 3年前
lyxxxh (作者) 3年前

env 函数在执行php artisan config:cache 之后 会获取不到相关的配置。

3年前 评论
goudan (楼主) 3年前

对头,env函数只允许在config文件里面调用。 判断当前环境这么写最简单:

app()->environment('local')
3年前 评论

可以用这样的形式

app()->isLocal()
3年前 评论

然鹅没有人解释清楚为啥推荐用配置文件,这时候就要请 leo 大佬来给我们解说一下了。

3年前 评论
JerryBool 3年前

file

这位兄弟解释的很清楚了

3年前 评论
goudan (楼主) 3年前

我记得这里有很多很好的约定,可以参考:《 Laravel 项目开发规范》

3年前 评论
goudan (楼主) 3年前

结贴结贴

感谢各位大佬的帮忙!

感谢 @pikalu 、 @panda-sir 、 @pigzzz 、 @lyxxxh 、 @萧潇 、 @di-gua 、 @咸鸭蛋 、 @Wi1dcard 、 @graybit (不分先后)

记录一下我的最终解决方案:

前提:为了偷懒,不在每个unit方法中加登录验证的代码。最初就是用本文所提问的一样。用env来拿环境变量判断;但最终被pass,后面从之前的一个帖子里:问答:Laravel 在做 Unit 测试时, 如何跳过中间件?

看到@fangmuke 大佬说的:

file

所以还是去从每个方法都登录的方向找办法;

最终发现在:\Illuminate\Foundation\Testing\TestCase 中发现方法setUp会调用 \Tests\CreatesApplication类里的createApplication方法,所以决定在方法:createApplication做手脚:

public function createApplication()
    {
        $app = require __DIR__.'/../bootstrap/app.php';

        $app->make(Kernel::class)->bootstrap();
        $app->alias(NullLogger::class, 'log');

        Auth::attempt([
            'email' => 'xxxxxx',
            'password' => 'xxxxxx',
        ]);

        return $app;
    }

即在每次unit方法运行之前都模拟登录一次,拿到session。继而正常走过auth中间件;

如此的话,不管是本地环境,还是测试环境,又或是gitlab的CI打包环境,都不会有被拦截的问题;

3年前 评论
goudan (作者) (楼主) 3年前

:joy:什么大公司还有代码审核

3年前 评论
goudan (楼主) 3年前
snowlyg (作者) 3年前
goudan (楼主) 3年前
panda-sir

我试了下 在createApplication方法写好像跟在类的setUp方法写没啥区别
我现在跟你一样也是每次调用单元测试都模拟登陆 但我这边应要求把jwt token存储在后端redis
每次我都要在tearDown方法内调用logout方法清除
这样太麻烦了 我试过把protected $token改成静态的 在setUp方法内判断为空才去login 但没办法在tearDown方法内判断是不是最后一个单元测试方法 :joy:

你有没有好点的解决方法@goudan

file

file

3年前 评论
goudan (楼主) 3年前
leo

$this->actingAs(User::where('email', xxx)->first())

3年前 评论
goudan (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!