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

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

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

任何地方在我的应用

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

应用程序/库/项目/ 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'; } } 

composer.json

 "psr-4": { "PJ\\": "app/libraries/Project" }, 

所以我访问该属性为PJ \常量:: $ langs

这工作,但我怀疑这是最有效的/正确的方式来做到这一点。 我的意思是,通过创build一个服务提供商和外墙以及所有这些东西来“传播”一个variables是否正确? 或者我应该把这个数据放在哪里?

感谢您的任何build议。

编辑#01

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

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

所以,如果我把它保存为configurationvariables,可以吗? 或者我还可以如何储存这些数据? 什么会是一个最好的和语义上正确的方法?

谢谢

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

app/config目录中创build一个新文件。 我们称之为constants.php

在那里你必须返回一个configuration值的数组。

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

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

更新

configuration可能不是存储从数据库生成的信息的正确位置。 你可以使用一个雄辩模型,如:

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

并查询所有类别

 Category::all(); 

如果出于某种原因,整个模型的东西不工作,你可以开始考虑创build自己的类和门面。 或者你可以创build一个包含所有静态variables和方法的类,然后在没有外观的情况下使用它。

对于常量

在config目录下创buildconstants.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目录下创buildstatic_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自动包含所有的configuration文件,所以不需要手动包含:)

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

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

我认为最好的方法是使用本地化。 在resources / lang / en中创build一个新文件messages.php(因为这是在我的configuration/应用程序'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本地化

只需要添加上面的答案,您将不得不包含configuration类,然后才能在Laravel 5.3中使用它

 use Illuminate\Support\Facades\Config; 

至less在Laravel5.4中,在你的构造函数中你可以创build它们;

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

那么你可以用你的方法像这样称呼他们。

 \Config::get('privileged'); 

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

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

Interesting Posts