当前位置: 首页 > 知识库问答 >
问题:

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

曹和正
2023-03-14

我刚开始和拉威尔一起工作。我需要重写我几年前制作的整个系统,使用Laravel4作为基本框架。在我的旧系统中,我曾经有一个常量。php文件,其中声明了一些常量和一个html" target="_blank">全局变量。php文件,其中包含大量数组集(例如,类别、状态、事件类型、语言等)。通过这样做,我可以使用

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

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

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

App/库/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/库/项目/ConstantsServiceProvider.php

namespace PJ;

use Illuminate\Support\ServiceProvider;

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

App/库/项目/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\常量::$langs

这是有效的,但我怀疑这是最有效或最正确的方法。我的意思是,通过创建整个服务提供商和门面以及诸如此类的东西来“传播”变量是正确的方法吗?或者我应该把这些数据放在哪里?

谢谢你的建议。

编辑#01

我想传递给所有控制器和视图的数据可以直接在脚本中设置,就像我文章开头的例子一样,但它也可以动态生成,例如从数据库生成。该数据可以是类别列表。我需要它们在所有视图中生成导航栏,但我也需要它们来定义一些路由模式(如/类别/子类别/产品),并在几个控制器中解析一些信息(如从持有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...']
]

举个例子。索引是类别的id,值是与类别关联的信息。

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

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

共有3个答案

陈弘厚
2023-03-14

在Laravel中创建常用常量文件

应用程序/常量。php

    define('YOUR_CONSTANT_VAR', 'VALUE');

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

创作者json在composer中自动加载时添加文件位置。json

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

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

composer dump-autoload
施英哲
2023-03-14

对于常量

创建常量。配置目录中的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');

用于静态阵列

创建静态数组。配置目录中的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自动包含所有配置文件,因此无需手动包含:)

齐乐逸
2023-03-14

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

app/config目录中创建一个新文件。让我们称之为常量。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();

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

 类似资料:
  • 问题内容: 因此,我有了这种elasticsearch安装,可以在用logstash插入数​​据时使用kibana可视化它们。 conf文件中的所有内容均已注释,因此它使用的是相对于elasticsearch文件夹的默认文件夹。 这怎么可能? 但是,此命令将删除数据: 谢谢。 ps:忘了说我在窗户上 问题答案: 如果您在Linux上安装了ES,则默认数据文件夹位于(CentOS)或(Ubuntu)

  • 我将redis用于发布/订阅以及服务器端缓存。我的意思是,我的应用服务器将redis服务器作为一个进程运行(也可以作为缓存)。我有几个瘦客户端(运行redis client)以发布/订阅模式连接到此应用服务器。我想知道redis在哪里存储缓存数据?单独在服务器中,或者在客户端中也会有一个副本。如果有近100个Redis客户端通过发布/订阅通道连接到服务器,那么以这种方式使用Redis也是一个好主意

  • 它是否将其存储在缓存中?我有一个应用程序,但应用程序中没有任何地方。属性是提到的db详细信息。我可以通过邮递员存储数据和查询它。

  • 问题内容: 我已经卸载了wamp服务器,现在我需要恢复数据库。我该如何做? 问题答案: 无论如何,您都可以知道: 感谢MySql论坛的Barry Galbraith http://forums.mysql.com/read.php?10,379153,379167#msg-379167

  • 问题内容: 因此,我最近才开始学习有关数据库如何工作,如何使用SQL ect的知识。并决定开始在我的Java应用程序(特别是H2数据库)中实现嵌入式数据库,并且在我编写代码的计算机上似乎运行良好。 当我移到另一台计算机上继续进行编码时,我注意到,即使我移植了嵌入式数据库文件(h2-*。jar),我在第一台计算机上创建的所有准备好的表也不在第二台计算机上存在。我以某种方式先入为主,即通过数据库引擎生

  • 问题内容: 请看以下示例: 首先,存放在哪里?是吗: 由编译器复制到引用它的内部类的隐藏成员变量中 复制到堆并在堆上引用 留在堆栈上并以某种方式引用 其他的东西 我的 猜测 是第一选择。 其次,要做到这样做所引起的任何性能问题(而不是简单地作为类的成员变量创建并按其引用),尤其是当您创建大量引用最终局部变量的内部类构造时。 问题答案: 是的,它们已被复制,这就是为什么您必须将变量声明为final的