在 laravel 中添加常量的最佳实践是啥? (长名单)

Posted

技术标签:

【中文标题】在 laravel 中添加常量的最佳实践是啥? (长名单)【英文标题】:What is the best practice for adding constants in laravel? (Long List)在 laravel 中添加常量的最佳实践是什么? (长名单) 【发布时间】:2017-06-28 13:47:21 【问题描述】:

我对 laravel 比较陌生。我有一个基本问题,在 laravel 中添加常量的最佳方法是什么。 我知道我们用来添加常量的 .env 方法。 我还制作了一个常量文件来将它们用于我的项目。 例如:

define('OPTION_ATTACHMENT', 13);
define('OPTION_EMAIL', 14);
define('OPTION_MONETERY', 15);
define('OPTION_RATINGS', 16);
define('OPTION_TEXTAREA', 17);

等等。它可以达到 100 条或更多条记录。那么编写常量的最佳方法应该是什么。 .env 方法。还是添加constant.php文件?

谢谢

【问题讨论】:

你可以选择很多地方:1)一个普通的(我的)SQL数据库2)一个键值故事/nosql数据库,比如redis 3)配置文件夹,使用你自己的配置文件,可能还有很多。最佳做法可能是选项 3,也是最快的 也许这个答案对你有用:***.com/a/26062788/6028607 @VincentG 就像我上面解释的那样。我不认为 .env 是最好的选择。我有一长串常量。 Laravel: Where to store global arrays data and constants?的可能重复 您接受的答案与您的问题或示例不符。常量不是会改变的配置变量。这正是它的标签方式,一个无论如何都不会改变的恒定值。 @Neekobus 给出的答案是常量的正确方法。您可能需要修改已接受的答案。 【参考方案1】:

对于在整个应用程序中全局使用的大多数常量,将它们存储在配置文件中就足够了。也很简单

config 目录中创建一个新文件。我们就叫它constants.php

在那里你必须返回一个配置值数组。

return [
    'options' => [
        'option_attachment' => '13',
        'option_email' => '14',
        'option_monetery' => '15',
        'option_ratings' => '16',
        'option_textarea' => '17',
    ]
];

您可以按如下方式访问它们

Config::get('constants.options');
// or if you want a specific one
Config::get('constants.options.option_attachment');

【讨论】:

@KArunSingh 你为什么不直接指向重复的***.com/questions/26854030/…。 in mathematics, the adjective constant means non-varying 这意味着这不是“正确答案” 记得添加constants.php文件后运行php artisan config:cache 另外我认为应该是\Config::get('constants.options');\Config::get('constants.options.option_attachment'); 带反斜杠 也可以使用config helper config('constants.options');调用它【参考方案2】:

您的问题是关于“最佳实践”,而您询问的是“.env 方法”。

.env 仅适用于因 环境 改变而改变的变量。不同环境的示例:测试、验收、生产。

所以 .env 包含数据库凭据、API 密钥等。

.env 应该(恕我直言)永远不会包含在所有环境中都相同的常量。只需使用建议的配置文件即可。

【讨论】:

【参考方案3】:

首先,您在应用目录中创建Constants 文件夹。

然后你创建Constants.php。在这个文件中定义你的常量

例如:

define('ONE', '1');
define('TWO', '2');

而你修改composer.json

或者,您可以使用 composer.json 通过将以下代码添加到“autoload”部分来加载 bootstrap/constants.php 文件,如下所示:

"autoload": 
    "files": [
        "bootstrap/constants.php"
    ]

并更新您的作曲家!

【讨论】:

按定义写就好了('ONE') ||定义('一个','1');【参考方案4】:

另一种方式如下:

    在app/config目录下创建constant.php文件

    在 composer.json 文件中,添加如下指令:

    "autoload": 
       "classmap": [
           "database/seeds",
           "database/factories"
       ],
       "psr-4": 
           "App\\": "app/"
       ,
       "files": [
           "app/helpers.php",
           "app/config/constants.php"
       ]
    
    

【讨论】:

【参考方案5】:

我使用别名类常量:

首先,创建包含常量的类:例如App/MyApp.php

namespace App;

class MyApp 
   const MYCONST = 'val';

然后将其添加到config/app.php中的别名类中

'aliases' => [
  //...
  'MyApp' => App\MyApp::class,

最后在任何你喜欢的地方使用它们(控制器甚至刀片):

MyApp::MYCONST

【讨论】:

我喜欢这种方法。这将帮助其他开发人员轻松跟踪常量的来源,而不是将其声明为自动加载。使用这种方法有什么缺点吗? 对于常量,我看不出有什么缺点。不适合配置(随环境变化)。改用 Config:get。 这是一个比“接受的答案”更好更快的选择谢谢! 也喜欢这种方法(只是提醒在更改后使用composer dump-autoload【参考方案6】:

您可以在根目录/config/paths.php

中创建一个名为paths.php的文件

将此数据插入到paths.php中

define('OPTION_ATTACHMENT', 13);
define('OPTION_EMAIL', 14);
define('OPTION_MONETERY', 15);
define('OPTION_RATINGS', 16);
define('OPTION_TEXTAREA', 17);

注意:确保运行命令:php artisan config:clear

【讨论】:

为什么是paths.php?看起来很随意。【参考方案7】:

除了 Arun Singh 的回答,我建议您使用 helpers。

在您的helper.php 中,您可以定义

if ( ! function_exists('constants'))

    function constants($key)
    
       return config('constants.' . $key);
    

因此而不是

Config::get('constants.options');
Config::get('constants.options.option_attachment');

你可以打电话

constants('options');
constants('options.option_attachment');

【讨论】:

虽然 Helper 不能与配置文件相关,但我非常感谢您提及这一点。常用函数和常量/配置文件的帮助文件(单例模式)应该是每个应用程序的一部分...【参考方案8】:

你可以这样做:

    把你的常量放到主数组的'config/app.php'中,比如:

    'CONSTANT_NAME' => 'CONSTANT_VALUE',
    

    随心所欲地使用它们:

     Config::get('CONSTANT_NAME')  
    

【讨论】:

【参考方案9】:

您可以在位于路由中的 web.php 文件的顶部定义常量,并且可以通过常量名称访问项目中的任何地方的常量

define('OPTION_ATTACHMENT', 13);
define('OPTION_EMAIL', 14);
define('OPTION_MONETERY', 15);
define('OPTION_RATINGS', 16);
define('OPTION_TEXTAREA', 17);

【讨论】:

【参考方案10】:
require app_path().'/constants.php';

define('ADMIN',  'administrator');

或 -

您还可以移动更敏感的信息

return [
   'hash_salt' => env('HASH_SALT'),
 ];

并像以前一样使用它:

 echo Config::get('constants.hash_salt');

【讨论】:

【参考方案11】:

我认为使用帮助文件定义常量的最佳方式。检查我的解决方案。

composer.json中定义文件路径

   "extra": 
        "laravel": 
            "dont-discover": []
        
    ,
    "autoload": 
        "files": [
            "app/helpers.php",
            "app/Helper/function.php"  // constant defined here
        ],

app/Helper/function.php

define("assetPath","UI/");
define("viewPath","UI/");

在项目的任何地方使用这个常量。我在刀片文件中使用。

  <script src="asset(assetPath.'js/jquery.min.js')"></script>
  <script src="asset(assetPath.'js/popper.min.js')"></script>
  <script src="asset(assetPath.'js/bootstrap.min.js')"></script>

我的方法比这个好

Config::get('constants.options');
Config::get('constants.options.option_attachment');

这里还有一个问题,你必须为此运行 cache:clear 或 cache 命令。但我的方法不需要这样做

【讨论】:

【参考方案12】:

我会亲自为此创建一个类。

<?php

namespace App\Transaction\Constants;

/**
 * Class TransactionTypeConstant.
 */
final class TransactionTypeConstant

    public const TYPE_CREDIT = 'CREDIT';
    public const TYPE_DEBIT = 'DEBIT';

并像这样使用它:

<?php

namespace App\Transaction;

use App\Transaction\Constants\TransactionTypeConstant;

class Transaction

    /**
     * Execute the task.
     *
     * @return object
     */
    public function run()
    
        if ($transaction->type === TransactionTypeConstant::TYPE_DEBIT) 
            //do something
        
    

【讨论】:

这种方法适用于所有人。但是在这种情况下,配置是不可缓存的。 我喜欢这个解决方案,因为它看起来很干净并且适用于所有场景。

以上是关于在 laravel 中添加常量的最佳实践是啥? (长名单)的主要内容,如果未能解决你的问题,请参考以下文章

在 Lumen/Laravel 控制器中添加自定义逻辑的最佳实践

Titanium - 在 Alloy 中动态创建和添加 UI 对象的最佳实践是啥

vue SFC中图像src的最佳实践是啥?

实现多节 TableView 的最佳实践是啥

在 php 应用程序中支持分析的最佳实践是啥?

在 laravel 项目中存储一堆独立常量的理想方法是啥?