【问题标题】:How can I define some constants for the whole of project?如何为整个项目定义一些常量?
【发布时间】:2017-04-28 13:43:51
【问题描述】:

Here is my directory (the screen-shot in this link)。另外我还有一个名为config.php 的文件,其中包含一些变量,如下所示:

<?php

    // db
    $dbname = 'mydb';
    $db_username = 'root';
    $db_password = '';

    // login
    $l_email = 'some@one.com';
    $l_password = 'mypas'

    // details
    $sleep_on_error = 1; // per sec

    // and etc 
    // .
    // .
    // .

?>

如您所见,我有一些变量存储在config.php 文件中。我可能在项目的每个部分都需要这些变量。所以我需要让config.php 文件在整个项目中都可以访问。所以我可以将config.php 文件添加到作曲家中,使其在整个项目中都可以访问。像这样:

"autoload": {
    "classmap": [
        "database"
    ],
    "psr-4": {
        "App\\": "app/"
    },
    "files": [
        "app/classes/config.php"
    ]
},

我要做的只是为我的项目实现一个简单的配置系统。请告诉我我这样做是否正确?或者我应该为此定义一个类?或者我所做的一切都是错的,我应该做点别的?

简而言之,为项目进行配置的最佳结构是什么?

【问题讨论】:

  • 配置通常只是键/值对,因此格式应该简单且易于维护。
  • @JayBlanchard 你的意思是我必须制作一个文件(不是.php 文件,类似于xml 文件) 并解析它以供使用?
  • 你知道 PHP 实际上支持正确的常量吗?因为你在这里使用了变量。
  • 这是一种方式。我们有时使用 .ini 作为文件扩展名,有时使用 .txt。这是个人喜好。
  • @JayBlanchard 许多 PHP 项目实际上使用 PHP 模块进行配置的原因是,与普通文本文件相比,在正常情况下 PHP 文件永远不会以文本形式发送给客户端,而是始终以文本形式发送给客户端。由 PHP 处理器解析,因此不会生成任何输出,而对于普通文本文件,您需要通过其他方式确保配置从未真正发送到客户端的浏览器。所以这实际上是一个额外的安全功能,你的解决方案——如果做错了——实际上是危险的。

标签: php laravel configuration composer-php constants


【解决方案1】:

这就是我在 Laravel 5.2 应用程序中的做法

首先在my_app/bootstrap/下创建了一个名为constants.php的php文件,并将整个应用所需的所有常量都写在了这个文件中;

constants.php 的示例视图

if (!defined('LOGO_URL')) {
    define('LOGO_URL', SITEURL . '/images/' . 'logo.png');
}

if (!defined('GRAVATAR_SIZE')) {
    define('GRAVATAR_SIZE', 100);
}

if (!defined('SITE_NAME')) {
    define('SITE_NAME', 'My App');
}

然后将require 转为my_app/bootstrap/autoload.php 就像这样

require __DIR__ . '/constants.php';

现在我可以在整个应用程序中访问这个变量了!

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    这很简单,只需两步:

    1)config/app 下创建一个文件constants.php 并将值放入如下数组形式:

    return [
        'APP_NAMEIS' => 'myappname'
    ];
    

    在上述步骤之后,
    2)通过使用Config Facade 来在任何地方使用该代码,例如:

    Config::get('constants.APP_NAMEIS');
    

    希望这一点清楚,如何在任何地方使用常量。请参阅more detail 的附件参考。

    【讨论】:

      【解决方案3】:

      您可以像@Alexey Mezenim 所建议的那样创建一个文件 - 在您的 /config 目录中说 admin-settings.php 并使用包含全局所需常量/值的数组填充它

      //admin-config.php
      <?php
      
          return[
              'db' => [
                         'name' => 'mydb',
                         'username' => 'root',
                         'password' =>''
                      ],
               'login' => [
                             'email' =>'some@one.com',
                             'password' => 'mypas'
                          ],
               'sleep_on_error' => 1
          ];  
      

      然后您可以在应用程序中的任何位置访问值

      config('admin-config.db.name')
      
      config('admin-config.login.email')
      
      config('admin-config/sleep_on_error')  
      
      //and so on
      

      【讨论】:

      • 不客气。感谢您的支持:)。刚刚扩展了 Alexey 的答案,使其更符合您问题的上下文。
      【解决方案4】:

      您可以轻松地从文件中添加常量配置,例如

      <? // conf.php
      $config = ['dbname' => 'test'];
      return $config;
      

      define('config', include('conf.php'));

      echo config['dbname'];

      【讨论】:

        【解决方案5】:

        Laravel 的方式是使用config files。创建my.php并放入/config目录,然后全局访问常量值:

        config('my.variable')
        

        这是my.php 的示例:

        <?php
        
        return [
            'variable' => 15,
            'some-array' => [1, 2, 5],
        ];
        

        【讨论】:

        • 哇太棒了..你的大部分答案都很完美..谢谢你..请你添加一个工作示例(向我们展示my.php的样子) 你的解决方案?
        • 谢谢。 ) 添加了一个示例。
        • 除了函数之外是否可以做同样的事情?我的意思是我想定义一个可在所有控制器中访问的函数。这可能吗?
        • @MartinAJ 当然。阅读此stackoverflow.com/questions/37339475/…
        猜你喜欢
        • 2016-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-07
        • 2020-10-02
        • 1970-01-01
        • 2012-02-19
        • 1970-01-01
        相关资源
        最近更新 更多