Константы, использующие define() в Laravel 5

У меня есть несколько больших файлов констант, использующих функцию PHP define(), которая хорошо работала в Laravel 4, но теперь я обновляю приложение до Laravel 5 и не знаю, как лучше перенести эти файлы.

Причина, по которой у меня есть более одного файла для констант, заключается в том, что они основаны на прошлых, настоящих и будущих годах (и это большие файлы со многими константами). Вот пример из одного из файлов констант:

<?php

//Check to see if the user is logged in.
//  If no user, we can't know what catalog we should use
if (Auth::check()) {

    //The most recent catalog year will serve as the default for anyone
    //who signs up for a catalog year that is newer than the most recent
    //catalog year.
    if (Auth::user()->strg_4 == "2015 - 2016" ||
    intval(substr(Auth::user()->strg_4, 0, 4)) > date("Y")) {

        //Constants for Create course/Edit course pages
        define('MY_CONSTANT', 'This is an example of a constant');
    }
}

Я попытался сделать следующее: Добавление следующего блока кода в мой файл composer.json:

  "autoload": {
    "classmap": [
      "database",
      "app/Http/Controllers",
      "app/Models",
      "app/myclasses"
    ],
    "psr-4": {
      "App\\": "app/"
    },
    "files": [
      "app/constants2013andearlier.php",
      "app/constants20142015.php",
      "app/constants20152016.php"
    ]
  },

Однако это не сработало, возможно, потому что в моих файлах констант есть условные операторы PHP.

Я также попытался поместить это в свои базовые блейд-файлы для всех своих представлений:

@include('constants.constants2013andearlier')
@include('constants.constants20142015')
@include('constants.constants20152016')

Однако это тоже не сработало, так как файлы, похоже, не читаются (я получил сообщение об ошибке «ErrorException в строке Course.php 752: использование неопределенной константы MY_CONSTANT — предполагается «MY_CONSTANT»», где Course.php — один из моих Модели.

В моей старой версии проекта Laravel 4 я определял эти константы в файле global.php с помощью следующего кода:

require app_path().'/constants2013andearlier.php';
require app_path().'/constants20142015.php';
require app_path().'/constants20152016.php';

Какие-либо предложения? Спасибо.


person    schedule 04.08.2015    source источник
comment
Каков реальный пример константы, которую вы определяете? Здесь определенно пахнет кодом   -  person Jonathan Crowe    schedule 04.08.2015
comment
Я привел один пример константы, потому что у меня довольно много похожих констант и нет смысла повторять одно и то же. Все они выглядят так: define('MY_CONSTANT', 'Это пример константы'); Излишне говорить, что в моих файлах констант нет ничего плохого, так как они отлично работают в моей старой версии Laravel 4 этого приложения.   -  person user3089840    schedule 04.08.2015
comment
Меня больше интересует, какие значения вы храните в константах. Если это простые текстовые строки, вам лучше использовать конструкцию Lang в laravel.   -  person Jonathan Crowe    schedule 04.08.2015
comment
В качестве констант хранятся только строки, целые числа и десятичные числа.   -  person user3089840    schedule 04.08.2015


Ответы (1)


Мне все еще было бы интересно узнать о любых других идеях или потенциальных проблемах с решением, которое я обнаружил ниже:

  1. Я поместил все свои файлы констант в папку (с именем «константы») в каталоге приложения.

  2. Из командной строки я запустил: php artisan make:middleware AddConstantsFilesToAllRoutes

  3. В файле AddConstantsFilesToAllRoutes я добавил все свои файлы констант следующим образом:

    require_once app_path('константы') . '/constants2013andearlier.php'; require_once app_path('константы') . '/constants20142015.php'; require_once app_path('константы') . '/constants20152016.php';

  4. В Kernal.php я добавил свой новый промежуточный файл выше в массив $protected middleware = [], который добавляет его ко всем возможным маршрутам:

    \App\Http\Middleware\AddConstantsFilesToAllRoutes::class,

  5. Будьте осторожны, НЕ добавляйте приведенный выше код в массив protected $routeMiddleware = [], иначе он не добавит файлы констант ко всем маршрутам.

  6. Конечно, если вы просто хотите добавить свои файлы констант к выборочным маршрутам, то это будет отличным решением; однако вам нужно будет вручную добавить эти маршруты в конструктор каждого контроллера, где вы хотите, чтобы эти маршруты имели доступ к этим файлам констант.

  7. Кроме того, убедитесь, что все ваши контроллеры наследуются от BaseController, чтобы промежуточное ПО могло работать на маршрутах для этого контроллера.

person user3089840    schedule 04.08.2015
comment
Вы должны перенести это на поставщика услуг. Вы можете включить его в метод загрузки AppServiceProvider или сделать это в новом ConstantServiceProvider. Хорошей идеей является централизация включений в поставщиках услуг. - person user2094178; 06.08.2015
comment
Не могли бы вы немного расширить свой ответ? Если я просто добавлю следующий код в метод загрузки AppServiceProvider, я просто снова получу неопределенные константы: require_once '/constants/constants2013andearlier.php'; require_once '/constants/constants20142015.php'; require_once '/constants/constants20152016.php'; - person user3089840; 06.08.2015
comment
Это должно работать, я включил несколько файлов с константами из метода загрузки AppServiceProvider, и константы отображаются правильно. - person user2094178; 06.08.2015
comment
Где вы хранили эти файлы? Имеет ли значение, что у меня есть некоторые условные операторы в моих файлах констант? - person user3089840; 06.08.2015
comment
Файлы были сохранены в app/Library, условные операторы не имеют значения, но, конечно, они также должны иметь операторы else, которых нет во фрагменте вашего вопроса. - person user2094178; 06.08.2015
comment
Я не добавлял инструкции else, потому что каждый файл охватывает период лет, который охватывает все возможные годы. Файл констант работает, когда я помещаю его в места, которые я объяснил выше, поэтому я не думаю, что отсутствие других статусов является проблемой. Не могли бы вы как-нибудь поделиться своим кодом? - person user3089840; 06.08.2015
comment
Все, что у меня есть, это require app_path('Library') .'/constants1.php' в методе загрузки AppServiceProvider. - person user2094178; 06.08.2015
comment
А вы используете Laravel 5.1? Можете ли вы дать мне фрагмент кода из вашего файла Constants1.php? Спасибо за вашу помощь - это ценится. - person user3089840; 06.08.2015
comment
Да, Ларавель 5.1. constants1.php имеет if/else вместо Auth::check, а define идентичен вашему. - person user2094178; 06.08.2015
comment
Спасибо за вашу помощь - я получил простой пример для работы без использования моих операторов условий, но когда я добавляю свои условия (которые оба используют класс Auth::), константы снова становятся неопределенными. Какие-либо предложения? - person user3089840; 07.08.2015
comment
Дальнейшая отладка показывает, что когда я удаляю условие Auth::check, мое условие на основе года приводит к ошибке: ошибка объекта не определена. Когда я выхожу из условия Auth::check, ошибка заключается в том, что моя константа не определена. Я могу убедиться, что я вошел в свое приложение, и снова эти условия работают нормально, если я помещу этот файл в другое место. Итак, мой вывод заключается в том, что AppServiceProvider не получает класс Auth::. Вы уверены, что ваш оператор else не всегда выполняется в 100% случаев? - person user3089840; 07.08.2015
comment
Я проверю это, дайте мне несколько минут. - person user2094178; 07.08.2015
comment
Вы правы, он всегда оценивает оператор else. Я отвечу так, как ответил, чтобы правильно оценить if/else. - person user2094178; 07.08.2015
comment
@user2094178 user2094178 Я нашел гораздо лучшее решение и отредактировал его в своем первоначальном ответе выше! - person user3089840; 07.08.2015
comment
Я ценю, что ты дал мне знать об этом. - person user2094178; 07.08.2015