在 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 控制器中添加自定义逻辑的最佳实践