【问题标题】:Laravel: Where to store global arrays data and constants?Laravel:在哪里存储全局数组数据和常量?
【发布时间】:2015-01-07 08:39:21
【问题描述】:

我刚开始使用 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...']
]

仅作为示例。 Index是分类的id,Value是分类关联的信息。

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

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

【问题讨论】:

    标签: php laravel laravel-4 global-state


    【解决方案1】:

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

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

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

    【讨论】:

    • 简单的方法!这样做对于已经在项目代码中设置的“常量数组”很好。但是,我想从其他任何地方全局访问的在运行时生成的变量或数组呢?我在 global.php 中有一些基本的启动代码,并且在那里创建了一些变量,我在某些控制器或视图中将需要这些变量。有没有办法设置 Config 变量的值,甚至在运行时创建新变量?
    • @Corner 从 5.0 开始,配置目录直接位于项目目录的根目录中。
    • 对于使用 Laravel 5 或更高版本的人,您必须添加 'use Config;'在您的控制器中或在 Config 的字体中添加一个斜杠,如下所示:\Config::get('constants.langs');
    • 您现在可以使用config() 助手而不是Config::get()
    • 我建议不要这样做。这些不是常数。它们是变量,可以修改。常量在程序执行期间不应该被修改(这就是为什么它们被称为常量)。我建议 app/constants.php 使用下面描述的 composer.json 方法,或者this post
    【解决方案2】:

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

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

    【讨论】:

    • 如果我有大量常量,有没有办法将它们存储在另一个文件中,然后将它们包含在路由的函数中?另外, ['prefix' => ''] 行在做什么?我知道它是一个关联数组,但这是否使常量可用于所有路由?谢谢。
    • 啊哈,我想出了前缀部分:laravel.com/docs/5.1/routing#route-group-prefixes
    • 另外说明,不管我做什么,PHPUnit 似乎都不喜欢它。当我按照你的方式尝试时,浏览器上一切正常,但 PHPUnit 告诉我我的常量已经定义,这根本不是真的。
    • 如果您正在缓存配置,那么在其中定义常量将不起作用。
    • 使用前缀的好主意
    【解决方案3】:

    对于常量

    在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:cache等一些控制台命令中不可用:Use of undefined constant ID - assumed 'ID'
    【解决方案4】:

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

    use Illuminate\Support\Facades\Config;
    

    【讨论】:

    • 或者简单的使用函数config()。
    【解决方案5】:

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

    resources/lang/en 中创建一个新文件messages.phpen 因为这是我的config/app 'locale'=&gt;'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

    【讨论】:

    • 没错。来自新手的子查询是如何读取该 message.php 文件并将键值作为数组获取?我想将它作为数组读取并作为我的客户端库的 json 响应发送,即 Angular JS 来处理某些字符串。
    【解决方案6】:

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

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

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

    \Config::get('privileged');
    

    对Model中的静态方法等特别有用……

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

    【讨论】:

      【解决方案7】:

      在 Laravel 中创建通用常量文件

      app/constants.php

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

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

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

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

      composer dump-autoload
      

      【讨论】:

      • 感谢分享。我忘记了自动加载:D
      • 这是我的荣幸@ChannaveerHakari
      【解决方案8】:

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

      【讨论】:

        【解决方案9】:

        创建一个常量类:

        <?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;
          }
        }
        

        【讨论】:

          猜你喜欢
          • 2023-04-08
          • 2011-01-08
          • 1970-01-01
          • 2021-10-18
          • 2020-04-20
          • 2017-06-10
          • 1970-01-01
          • 2013-02-10
          • 1970-01-01
          相关资源
          最近更新 更多