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

2022-08-30 07:39:35

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

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

在我的应用中的任意位置。

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

应用程序/库/项目/常量.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

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

我的数组是这样的:

$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,值是与类别关联的信息。

我需要这个数组,在所有控制器和视图中都可用。

那么,我应该将其另存为配置变量吗?否则我怎么能存储这些数据;什么是最好和语义正确的方法?


答案 1

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

在目录中创建一个新文件。让我们来称呼它app/configconstants.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();

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


答案 2

对于常量

在 config 目录中创建常量.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会自动包含所有配置文件,因此无需手动包含:)


推荐