Laravel:在哪里存储全局数组的数据和常量?


82

我刚刚开始与Laravel合作。我需要使用Laravel 4作为基本框架来重写几年前制作的整个系统。在我的旧系统中,我曾经有一个constant.php声明了一些常量的globals.php文件,以及一个包含许多数组集(例如,类别状态,事件类型,语言等)的文件。这样,我可以使用类似

foreach ( $langs as $code => $domain ) {
    // Some stuff
}

我应用中的任何地方。

我的问题是,如何才能以所谓的“ laravel方式”存储该信息。我尝试使用某种对象来存储此信息,将其设置为服务并为其创建外观:

app / libraries / Project / Constants.php

namespace PJ;

class Constants {

    public static $langs = [
            'es' => 'www.domain.es',
            'en' => 'www.domain.us',
            'uk' => 'www.domain.uk',
            'br' => 'www.domain.br',
            'it' => 'www.domain.it',
            'de' => 'www.domain.de',
            'fr' => 'www.domain.fr'
        ];
}

app / libraries / Project / ConstantsServiceProvider.php

namespace PJ;

use Illuminate\Support\ServiceProvider;

class ConstantsServiceProvider extends ServiceProvider {
    public function register() {
        $this->app->singleton('PJConstants', function() {
            return new Constants;
        });
    }
}

app / libraries / Project / ConstantsFacade.php

namespace PJ;

use Illuminate\Support\Facades\Facade;

class ConstantsFacade extends Facade {
    protected static function getFacadeAccessor() { 
        return 'PJConstants';
    }
}

composer.json

"psr-4": {
     "PJ\\": "app/libraries/Project"
},

因此,我以访问该属性PJ\Constants::$langs

这可行,但是我怀疑这是最有效或正确的方法。我的意思是,通过创建整个服务提供程序,外观和所有此类东西来“传播”变量的正确方法是吗?还是应该将这些数据放在哪里?

感谢您的任何建议。

编辑#01

我想传递给所有控制器和视图的数据可以直接在脚本中设置,就像在我文章开头的示例中一样,但是也可以从数据库动态生成。该数据可以是类别列表。我在所有视图中都需要它们来生成导航栏,但是我还需要它们来定义一些路由模式(如/category/subcategory/product),并在多个控制器中解析一些信息(例如从保存X产品的类别中获取信息)。

我的数组是这样的:

$categories = [
    1 => ['name' => 'General', 'parent' => 0, 'description' => 'Lorem ipsum...'],
    2 => ['name' => 'Nature', 'parent' => 0, 'description' => 'Lorem ipsum...'],
    3 => ['name' => 'World', 'parent' => 0, 'description' => 'Lorem ipsum...'],
    4 => ['name' => 'Animals', 'parent' => 2, 'description' => 'Lorem ipsum...']
]

举个例子。索引是类别的ID,而值是与该类别关联的信息。

我还需要所有控制器和视图中都可用的数组。

那么,我应该将其另存为Config变量吗?我还能如何存储这些数据?什么是最佳且语义正确的方法?

Answers:


117

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

app/config目录中创建一个新文件。叫它吧constants.php

在这里,您必须返回一个配置值数组。

return [
    'langs' => [
        'es' => 'www.domain.es',
        'en' => 'www.domain.us'
        // etc
    ]
];

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

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

您也可以设置它们

Config::set('foo.bar', 'test');

请注意,您设置的值将不会保留。它们仅适用于当前请求。

更新资料

配置可能不是存储从数据库生成的信息的正确位置。您可以只使用如下的雄辩模型

class Category extends Eloquent {
    // db table 'categories' will be assumed
}

并查询所有类别

Category::all();

如果整个模型由于某种原因无法解决,您可以开始考虑创建自己的类和外观。或者,您可以只创建一个包含所有静态变量和方法的类,然后在不使用外观的情况下使用它。


简单的方法!这样对已经在项目代码中设置的“常量数组”非常有用。但是我想从其他任何地方全局访问在运行时生成的变量或数组呢?我在global.php上有一些基本的开始代码,并且在其中创建了一些变量,在某些控制器或视图中我需要这些变量。有没有办法设置该Config变量的值,或者甚至在运行时创建新变量?
MarcoMadueñoMejía2014年

我没想到会那么容易。我将其标记为答案,但对此我还有最后一个疑问。我需要全局访问的那些变量之一包含一组从数据库中获取的类别。所有视图都是必需的,因为它将用于导航菜单,但某些控制器甚至路由也需要它。(从名义上来说)将这种类型的数据保存为Config变量是否正确?还是应该以其他方式存储它?
MarcoMadueñoMejía2014年

2
@Corner自5.0起,配置目录直接位于项目目录的根目录中。
lukasgeiter 2015年

4
对于使用Laravel 5或更高版本的用户,您必须添加“ use Config;”。在您的控制器中,或在Config字体中添加斜线,如下所示:\ Config :: get('constants.langs');
rotaercz

2
您可以使用config()助手而不是Config::get()现在使用。
利斯,

23

对于常数

在config目录中创建constants.php文件:

define('YOUR_DEFINED_CONST', 'Your defined constant value!');

return [

'your-returned-const' => 'Your returned constant value!'

];

您可以像这样使用它们:

echo YOUR_DEFINED_CONST . '<br>';

echo config('constants.your-returned-const');

对于静态数组

在config目录中创建static_arrays.php文件:

class StaticArray
{

    public static $langs = [
        'es' => 'www.domain.es',
        'en' => 'www.domain.us',
        'uk' => 'www.domain.uk',
        'br' => 'www.domain.br',
        'it' => 'www.domain.it',
        'de' => 'www.domain.de',
        'fr' => 'www.domain.fr'
    ];

}

您可以像这样使用它:

echo StaticArray::$langs['en'];

注意:Laravel自动包含所有配置文件,因此无需手动包含:)


在某些控制台命令中不可用,例如route:cacheUse of undefined constant ID - assumed 'ID'
AliN11 '19

13

在Laravel中创建公共常量文件

app / constants.php

    define('YOUR_CONSTANT_VAR', 'VALUE');

    //EX
    define('COLOR_TWO', 'red');

composer.json 在自动加载时在composer.json中添加文件位置

"autoload": {
    "files": [
        "app/constants.php"
    ]
}

在此更改生效之前,您必须在Terminal中运行以下命令以重新生成Laravel的自动加载文件:

composer dump-autoload

1
感谢分享。我已经忘记了自动加载功能:D
Channaveer Hakari,

这是我的荣幸@ChannaveerHakari
Parth kharecha

8

对于Laravel 5中的全局常量,我不喜欢为它们调用Config。我在“路线”组中定义如下:

// global contants for all requests
Route::group(['prefix' => ''], function() {
    define('USER_ROLE_ADMIN','1');
    define('USER_ROLE_ACCOUNT','2');
});

如果我有大量的常量,是否可以将它们存储在另一个文件中,然后将其包含在路由函数中?另外,[[prefix'=>'']行在做什么?我知道这是一个关联数组,但这是否使常量可用于所有路由?谢谢。
user3089840 2015年


另一个注意事项,不管我做什么,似乎PHPUnit不喜欢它。当我按照自己的方式尝试时,所有内容都可以在浏览器上正常运行,但是PHPUnit告诉我我的常量已经定义,事实并非如此。
user3089840

如果要缓存配置,则无法在其中定义常量。
零和一

使用该前缀的好主意
Arun Yokesh

4

我认为最好的方法是使用本地化。

messages.phpresources/lang/enen因为这是我的设置)中创建一个新文件,config/app 'locale'=>'en'返回所有值的数组

return [
    'welcome' => 'Welcome to our application'
];

检索laravel 5.3及以下版本

echo trans('messages.welcome');

要么

echo Lang::get('messages.welcome');

5.4使用

echo __('messages.welcome') 

laravel 5.0本地化

要么

laravel 5.4本地化


没错 来自新手的子查询是如何读取message.php文件并以数组形式获取键值?我想将其读取为数组并以json响应的形式发送给客户端库(即Angular JS)以处理某些字符串。
Gopinath



0

只需将一个constants.php文件放入config目录,并在该文件中定义您的常量,该文件将自动加载,并在Laravel 6+中进行了测试

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.