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

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

在我的应用程序中的任何地方.

我的问题是,我怎样才能以所谓的"laravel方式"存储这些信息.我try 使用某种对象来存储此信息,将其设置为服务,并为其创建一个外观:

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的身份访问该房产.

这是可行的,但我怀疑这是最有效或正确的方法.我的意思是,通过创建一个完整的服务Provider 和门面以及所有这些东西来"传播"一个变量,这是正确的方式吗?或者我应该把这些数据放在哪里?

谢谢你的建议.

EDIT # 01

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

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

我还需要此数组,在所有控制器和视图中都可用.

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

推荐答案

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

app/config目录中创建一个新文件.我们就叫它constants.php

在那里,您必须返回配置值的array.

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

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

Php相关问答推荐

PHP:从数组中获取唯一的数字组合

PHP中的圆生成器在国际日期变更线上失败

WooCommerce数量减号和加号图标未显示

Laravel Nova不使用数组键作为筛选器中的选项值

根据WooCommerce中的客户计费国家/地区更改产品价格

Codeigniter 3中SMTP.office 365.com的截断问题

允许客户定义特定WooCommerce产品的价格

如何在微软图形API中使用用户S访问令牌或基于租户ID的访问令牌?

CKEDITOR-如何在PHP中判断提交后的空数据

在WooCommerce上设置简单和可变产品的最小订单量

无额外字段的Laravel同步

如何使用 PHP 创建简化的 twig 替换?

laravel Eloquent 模型的问题

使用其ID查询和捕获与订单相关的其他详细信息的shopware 6方法

如何获取用户之间的最新消息列表

Laravel Docker 几个数据库

转发和非转发呼叫 - 后期静态绑定

使用循环和引用而不是递归创建分层/父子数组

按数字然后按字符串对关联 PHP 数组进行排序

在 EasyAdmin 中添加全局操作,将我的按钮放在表格下方而不是上方