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