2015-01-05 2 views
15

Я создаю приложение, которое хранит некоторые настройки в базе данных, и в идеале было бы хорошо загрузить эти параметры во время начальной загрузки и сделать их доступными через объект по всему миру.Как сделать данные пользовательских настроек доступными по всему миру в Yii 2?

Можно ли это сделать и добавить к Yii::$app->params как-нибудь?

Как вы можете создать класс и вернуть детали как массив или экземпляр объекта?

+1

Вы можете использовать сеанс. – Kshitiz

+1

Поскольку '' 'Yii :: $ app-> params''' - это просто массив, вы можете добавить в него значения даже позже, используя что-то вроде' '' Yii :: $ app-> params ['someSetting'] = ' значение '; '' '. Но я не уверен, где именно будет иметь смысл делать что-то подобное. Хотелось бы услышать некоторые предложения о лучших практиках в этом отношении. – Tahir

+0

@Kshitiz Это было бы нормально, за исключением того, что сеансы могут быть уничтожены (скажем, если пользователь вышел из системы), и я не хочу, чтобы это происходило с этим. – Brett

ответ

34

Хорошо, я узнал, как это сделать.

В принципе, вы должны ввести bootstrapInterface, пример ниже для моей ситуации.

Установите путь к классу, который реализует интерфейс:

приложение/Config/web.php:

$config = [ 
    'id' => 'basic', 
    'basePath' => dirname(__DIR__), 
    'bootstrap' => [ 
        'log', 
        'app\base\Settings', 
    ], 
    //............. 
]; 

Так я поместил класс называется Settings.php на месте: app\base\Settings.php.

Тогда это мой Settings.php файл:

namespace app\base; 

use Yii; 
use yii\base\BootstrapInterface; 

/* 
/* The base class that you use to retrieve the settings from the database 
*/ 

class settings implements BootstrapInterface { 

    private $db; 

    public function __construct() { 
     $this->db = Yii::$app->db; 
    } 

    /** 
    * Bootstrap method to be called during application bootstrap stage. 
    * Loads all the settings into the Yii::$app->params array 
    * @param Application $app the application currently running 
    */ 

    public function bootstrap($app) { 

     // Get settings from database 
     $sql = $this->db->createCommand("SELECT setting_name,setting_value FROM settings"); 
     $settings = $sql->queryAll(); 

     // Now let's load the settings into the global params array 

     foreach ($settings as $key => $val) { 
      Yii::$app->params['settings'][$val['setting_name']] = $val['setting_value']; 
     } 

    } 

} 

теперь я могу получить доступ через настройки Yii:$app->params['settings'] во всем мире.

Дополнительная информация о других способах загрузки материалов here.

+0

Теперь это больше похоже на Yii. спасибо за сообщение ответа. – Tahir

+0

Я пробовал это с помощью расширенного шаблона, но я получаю 'Имя функции должно быть строкой' – shorif2000

+0

@bonez Возможно, вы могли бы задать вопрос с кодом, ссылаясь на этот ответ. – Brett

0

Другой способ сделать это - переопределить метод init() в baseController.

class BaseController extends Controller{...  
public function init() 
    {  
      if(Yii::$app->cache->get('app_config')) 
     { 
      $config = Yii::$app->cache->get('app_config'); 
      foreach ($config as $key => $val) 
      { 
       Yii::$app->params['settings'][$key] = $val->value; 
      } 
     } 
     else 
     { 
      $config = Config::find()->all(); 
      $config = ArrayHelper::regroup_table($config, 'name', true); 
      Yii::$app->cache->set('app_config', $config, 600); 

      foreach ($config as $key => $val) 
      { 
       Yii::$app->params['settings'][$key] = $val->value; 
      } 
     } 
} 
....}  

Это зависит от вас. Я использовал этот метод в Yii1, но теперь я бы предпочел метод начальной загрузки

-1

Я немного опоздал на вечеринку, но есть намного более простой способ сделать это.

$config = [ 
    'id' => 'basic', 
    'basePath' => dirname(__DIR__), 
    'bootstrap' => [ 
        'log', 
    ], 
    //............. 
    'params' = [ 
     'adminEmail' => '[email protected]', 
     'defaultImage' => '/images/default.jpg', 
     'noReplyEmail' => '[email protected]' 
    ], 
]; 

Теперь вы можете просто получить доступ к этим переменным со следующим синтаксисом

$adminEmail = \Yii::$app->params['adminEmail']; 
+0

Это все хорошо и хорошо, если вы устанавливаете значения вручную; но суть этого вопроса заключалась в том, чтобы динамически устанавливать их с помощью другого сценария. :) – Brett

+0

@ Бретт - Ах, ты совершенно прав – SynackSA

Смежные вопросы