96

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

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

在我的应用程序的任何地方。

我的问题是,我怎样才能以所谓的“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'
        ];
}

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

namespace PJ;

use Illuminate\Support\ServiceProvider;

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

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

namespace PJ;

use Illuminate\Support\Facades\Facade;

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

作曲家.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...']
]

举个例子。Index 是类别的 id,Value 是与类别相关的信息。

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

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

4

9 回答 9

127

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

在目录中创建一个新文件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 模型,例如:

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

并查询所有类别

Category::all();

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

于 2014-11-10T22:25:55.380 回答
28

对于常量

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

于 2016-08-25T07:25:10.340 回答
19

在 Laravel 中创建通用常量文件

应用程序/constants.php

    define('YOUR_CONSTANT_VAR', 'VALUE');

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

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

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

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

composer dump-autoload
于 2018-10-30T12:00:48.977 回答
8

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

// global contants for all requests
Route::group(['prefix' => ''], function() {
    define('USER_ROLE_ADMIN','1');
    define('USER_ROLE_ACCOUNT','2');
});
于 2015-06-09T08:41:42.673 回答
5

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

messages.php在中创建一个新文件resources/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 本地化

于 2017-04-12T09:44:59.860 回答
2

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

use Illuminate\Support\Facades\Config;
于 2017-02-06T18:00:21.480 回答
2

至少在 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

于 2017-08-10T17:34:03.173 回答
0

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

于 2020-06-16T18:24:14.370 回答
0

创建一个常量类:

<?php
    
    namespace App\Support;
    
    class Constants {
        /* UNITS */
        public const UNIT_METRIC = 0;
        public const UNIT_IMPERIAL = 1;
        public const UNIT_DEFAULT = UNIT_METRIC;
    
    }

然后在您的模型、控制器等中使用它:

<?php

namespace App\Models;

use App\Support\Constants;

class Model
{
  public function units()
  {
      return Constants::UNIT_DEFAULT;
  }
}
于 2021-12-21T03:08:48.763 回答