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

Mar*_*jía 74 php global-state laravel laravel-4

我刚开始和Laravel合作.我需要重写几年前制作的整个系统,使用Laravel 4作为基础框架.在我的旧系统中,我使用一个带有一些常量声明的constant.php文件,以及一个包含大量数组的globals.php文件(例如,类别状态,事件类型,lang等).通过这样做,我可以使用类似的东西

foreach ( $langs as $code => $domain ) {
    // Some stuff
}
Run Code Online (Sandbox Code Playgroud)

我应用中的任何地方.

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

应用程序/库/项目/ 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'
        ];

}
Run Code Online (Sandbox Code Playgroud)

应用程序/库/项目/ ConstantsServiceProvider.php

namespace PJ;

use Illuminate\Support\ServiceProvider;

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

应用程序/库/项目/ ConstantsFacade.php

namespace PJ;

use Illuminate\Support\Facades\Facade;

class ConstantsFacade extends Facade {
    protected static function getFacadeAccessor() { 
        return 'PJConstants';
    }
}
Run Code Online (Sandbox Code Playgroud)

composer.json

"psr-4": {
     "PJ\\": "app/libraries/Project"
},
Run Code Online (Sandbox Code Playgroud)

所以我以PJ\Constants :: $ langs的身份访问该属性.

这有效,但我怀疑它是最有效/最正确的方法.我的意思是,通过创建一个服务提供商和外墙以及所有这些东西,它是"传播"变量的正确方法吗?或者我应该把这些数据放在哪里?

谢谢你的建议.

编辑#01

数据我想传递给所有控制器和视图可以直接设置在脚本中,就像在我的文章的开头的例子,它也可以dinamically产生,例如从一个数据库.该数据可以是类别列表.我在所有视图中都需要它们来生成导航栏,但我还需要它们来定义一些路由模式(比如/ 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...']
]
Run Code Online (Sandbox Code Playgroud)

仅作为一个例子.Index是类别的ID,Value是与类别关联的信息.

我需要这个数组,也可以在所有控制器和视图中使用.

所以,如果我把它保存为Config变量,可以吗?或者我怎么能存储这些数据?什么是最好和语义正确的方式?

谢谢

luk*_*ter 105

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

app/config目录中创建一个新文件.我们称之为constants.php

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

return [
    'langs' => [
        'es' => 'www.domain.es',
        'en' => 'www.domain.us'
        // etc
    ]
];
Run Code Online (Sandbox Code Playgroud)

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

Config::get('constants.langs');
// or if you want a specific one
Config::get('constants.langs.en');
Run Code Online (Sandbox Code Playgroud)

你也可以设置它们

Config::set('foo.bar', 'test');
Run Code Online (Sandbox Code Playgroud)

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

更新

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

class Category extends Eloquent {
    // db table 'categories' will be assumed
}
Run Code Online (Sandbox Code Playgroud)

并查询所有类别

Category::all();
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因整个模型的东西没有成功,你可以开始考虑创建自己的类和外观.或者你可以创建一个包含所有静态变量和方法的类,然后在没有外观的情况下使用它.

  • 对于使用Laravel 5或更高版本的用户,您必须添加'use Config;' 在您的Controller中或在Config的字体中添加斜杠,如下所示:\ Config :: get('constants.langs'); (4认同)
  • 您现在可以使用 `config()` 助手而不是使用 `Config::get()`。 (4认同)
  • @Corner自5.0以来,config目录直接位于项目目录的根目录中. (2认同)

Gag*_*hir 21

对于常数

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

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

return [

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

];
Run Code Online (Sandbox Code Playgroud)

您可以使用它们: -

echo YOUR_DEFINED_CONST . '<br>';

echo config('constants.your-returned-const');
Run Code Online (Sandbox Code Playgroud)

对于静态数组

在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'
    ];

}
Run Code Online (Sandbox Code Playgroud)

您可以像以下一样使用它: -

echo StaticArray::$langs['en'];
Run Code Online (Sandbox Code Playgroud)

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


Mla*_*vic 8

对于Laravel 5中的全局常量,我不喜欢为它们调用Config.我在Route组中定义它们,如下所示:

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


Ter*_*nal 7

在Laravel中创建公共常量文件

app / constants.php

    define('YOUR_CONSTANT_VAR', 'VALUE');

    //EX
    define('COLOR_TWO', 'red');
Run Code Online (Sandbox Code Playgroud)

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

"autoload": {
    "files": [
        "app/constants.php"
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

composer dump-autoload
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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

return [
    'welcome' => 'Welcome to our application'
];
Run Code Online (Sandbox Code Playgroud)

检索laravel 5.3及以下

echo trans('messages.welcome');
Run Code Online (Sandbox Code Playgroud)

或者

echo Lang::get('messages.welcome');
Run Code Online (Sandbox Code Playgroud)

5.4 使用

echo __('messages.welcome') 
Run Code Online (Sandbox Code Playgroud)

Laravel 5.0 本地化

或者

laravel 5.4 本地化