Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Настройки и перевод интерфейса

Адрес базы данных, ключи платёжной системы, язык интерфейса на вашем компьютере и на сервере разные. Laravel отделяет такие значения от кода: секреты лежат в .env, настройки — в папке config, тексты интерфейса — в файлах перевода.

Файл .env

.env хранит значения, которые отличаются между окружениями. В репозиторий он не попадает:

APP_NAME="Мой блог"
APP_ENV=local
APP_DEBUG=true
 
STRIPE_SECRET=sk_test_123

Файлы настроек

В коде значения из .env напрямую не читают. Их подключают в файлах папки config функцией env():

// config/services.php
 
return [
    'stripe' => [
        'secret' => env('STRIPE_SECRET'),
        'currency' => env('STRIPE_CURRENCY', 'rub'),
    ],
];

Второй аргумент env() — значение по умолчанию.

Чтение настроек

Везде в приложении настройки читают функцией config(). Путь к значению записывают через точку: имя файла, затем ключи:

$secret = config('services.stripe.secret');
$name = config('app.name');
$timezone = config('app.timezone', 'UTC');

Свои настройки

Достаточно создать файл в папке config:

// config/blog.php
 
return [
    'posts_per_page' => 15,
    'allow_comments' => env('BLOG_COMMENTS', true),
];
$posts = Post::latest()->paginate(config('blog.posts_per_page'));

Окружение

if (app()->environment('production')) {
    // только на рабочем сервере
}
 
if (app()->isLocal()) {
    // только при разработке
}

Файлы перевода

Тексты интерфейса хранят в папке lang. Её создаёт команда:

php artisan lang:publish

Для каждого языка — своя папка с файлами-массивами:

// lang/ru/messages.php
 
return [
    'welcome' => 'Добро пожаловать, :name!',
    'posts' => '{0} Нет статей|{1} :count статья|[2,4] :count статьи|[5,*] :count статей',
];

Вывод перевода

Функция __() возвращает текст на текущем языке. Значения подставляются на место слов с двоеточием:

<h1>{{ __('messages.welcome', ['name' => $user->name]) }}</h1>
 
<p>{{ trans_choice('messages.posts', $count, ['count' => $count]) }}</p>

trans_choice() выбирает форму слова по числу.

Переключение языка

Язык по умолчанию задаёт APP_LOCALE в .env. Для конкретного запроса его меняют в посреднике:

use Illuminate\Support\Facades\App;
 
public function handle(Request $request, Closure $next)
{
    App::setLocale($request->segment(1) === 'en' ? 'en' : 'ru');
 
    return $next($request);
}

Частая ошибка

После команды php artisan config:cache функция env() вне папки config возвращает null: файл .env больше не читается. Поэтому в контроллерах, моделях и шаблонах используйте только config(), а env() — исключительно в файлах настроек.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.