我刚开始与Laravel合作。我需要重写几年前制作的整个系统,使用Laravel 4作为基础框架。在我的旧系统中,我使用一个带有一些常量声明的constant.php文件,以及一个包含大量数组的globals.php文件(例如,类别状态,事件类型,lang等)。通过这样做,我可以使用像
这样的东西foreach ( $langs as $code => $domain ) {
// Some stuff
}
我的应用中的任何地方。
我的问题是,如何以所谓的" laravel方式存储该信息"。我尝试使用某种对象来存储这些信息,将其设置为服务并为其创建一个外观:
应用/库/项目/ 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 \ 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变量,可以吗?或者我怎么能存储这些数据?什么是最好和语义正确的方式?
由于
答案 0 :(得分:102)
对于应用程序中全局使用的大多数常量,将它们存储在配置文件中就足够了。这也很简单
在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();
如果由于某种原因整个Model模型没有成功,你可以开始考虑创建自己的类和外观。或者你可以创建一个包含所有静态变量和方法的类,然后在没有外观的情况下使用它。
答案 1 :(得分:20)
常数
在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会自动包含所有配置文件,因此无需手动包括:)
答案 2 :(得分:8)
对于Laravel 5中的全局常量,我不喜欢为他们调用Config。我在路由组中定义它们,如下所示:
// global contants for all requests
Route::group(['prefix' => ''], function() {
define('USER_ROLE_ADMIN','1');
define('USER_ROLE_ACCOUNT','2');
});
答案 3 :(得分:2)
为了添加上述答案,您必须先包含配置类,然后才能在Laravel 5.3中开始使用它
use Illuminate\Support\Facades\Config;
答案 4 :(得分:2)
我认为最好的方法是使用本地化。
在messages.php
resources/lang/en
中创建新文件en
,因为这是config/app
'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')
或
答案 5 :(得分:2)
Laravel中的常量
app / constants.php
define('YOUR_CONSTANT_VAR', 'VALUE');
//EX
define('COLOR_TWO', 'red');
composer.json 在自动加载时在composer.json中添加文件位置
"autoload": {
"files": [
"app/constants.php"
]
}
在此更改生效之前,您必须在Terminal中运行以下命令以重新生成Laravel的自动加载文件:
composer dump-autoload
答案 6 :(得分:1)
在Laravel 5.4中的Atleast,在你的构造函数中你可以创建它们;
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 :(得分:0)
只需将文件 constants.php 文件放入 config 目录中,然后在该文件中定义常量,该文件将被自动加载, 在Laravel 6+中测试过