首页 文章

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

提问于
浏览
65

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

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 .

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

谢谢你的建议 .

EDIT # 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...']
]

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

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

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

谢谢

7 回答

  • 2

    只需添加上述答案,您必须先包含配置类,然后才能在Laravel 5.3中开始使用它

    use Illuminate\Support\Facades\Config;
    
  • 6

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

    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');
    

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

    更新

    配置可能不是存储从数据库生成的信息的正确位置 . 您可以使用Eloquent Model之类的:

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

    并查询所有类别

    Category::all();
    

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

  • 92

    For Constants

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

    For Static Arrays

    在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自动包含所有配置文件,因此无需手动包含:)

  • 1

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

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

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

    resources/lang/en 中创建一个新文件 messages.phpen ,因为这是我的 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 localization

    要么

    laravel 5.4 localization

  • 15

    至少在Laravel 5.4中,你可以在你的构造函数中创建它们;

    public function __construct()
    {
      \Config::set('privileged', array('user1','user2');
      \Config::set('SomeOtherConstant', 'my constant');     
    }
    

    然后你可以在你的方法中像这样调用它们;

    \Config::get('privileged');
    

    特别适用于模型中的静态方法等...

    参考Laracasts.com https://laracasts.com/discuss/channels/general-discussion/class-apphttpcontrollersconfig-not-found

  • 1

    Laravel的常数

    应用程序/ constants.php

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

    composer.json add file location at autoload in composer.json

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

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

    composer dump-autoload
    

相关问题