Расширение для использования Laravel в многодоменной среде.
Этот пакет позволяет одной установке Laravel работать с несколькими доменами HTTP.
Во многих случаях разные клиенты используют одно и то же приложение с точки зрения кода, но не с точки зрения базы данных, хранилища и конфигурации.
Этот пакет предоставляет очень простой способ получить конкретный файл env, конкретный путь хранения и конкретную базу данных для каждого такого клиента.
Ларавел | Мультидоменный |
---|---|
11.х | 11.х |
10.х | 10.х |
9.х | 5.х |
8.х | 4.х |
7.х | 3.х |
6.х | 2.х |
5.8.х | 1.4.х |
5.7.х | 1.3.х |
5.6.х | 1.2.х |
5.5.х | 1.1.х |
Релизы v1.1.x:
На сегодняшний день выпуски v1.1.6+, v1.2.x, v1.3.x, v1.4.x, v2.x и v3.x функционально эквивалентны. Релизы были разделены для запуска интеграционных тестов с соответствующей версией фреймворка Laravel.
Однако с выпуском Laravel 8 выпуски v1.1.14, v1.2.8, v1.3.8 и v1.4.8 являются последними выпусками, включающими новые функции для соответствующих версий Laravel 5.x (поддержка исправлений ошибок все еще активна для этих версий). . ОБНОВЛЕНИЕ 13.02.2021 : некоторые последние функции в версиях v1.1+ все еще находятся в разработке :)
v1.0 требует Laravel 5.1, 5.2, 5.3 и 5.4 (больше не поддерживается и не тестировался по сравнению с laravel 5.4, однако использование пакета такое же, как и для 1.1)
ОБНОВЛЕНИЕ 20 февраля 2023 г .: Начиная с Laravel 10.x, версии пакетов имеют одинаковую нумерацию.
Добавьте gecche/laravel-multidomain в качестве требования к композитору.json:
{
"require" : {
"gecche/laravel-multidomain" : "11.*"
}
}
Обновите свои пакеты с помощью композитора update или установите его с помощью композитора install.
Вы также можете добавить пакет, используя composer require gecche/laravel-multidomain
, а затем указать нужную версию.
Этот пакет должен переопределить обнаружение домена HTTP в минимальном наборе основных функций Laravel в самом начале процесса начальной загрузки, чтобы получить конкретный файл среды. Таким образом, для этого пакета требуется несколько больше шагов настройки, чем для большинства пакетов Laravel.
Шаги установки:
bootstrap/app.php
. //use Illuminate F oundation A pplication
use Gecche Multidomain Foundation Application
QueueServiceProvider
расширенным в файле config/app.php
следующим образом: ' providers ' => Illuminate Support ServiceProvider:: defaultProviders ()-> merge ([
// Package Service Providers . . .
])-> replace ([
Illuminate Queue QueueServiceProvider::class => Gecche Multidomain Queue QueueServiceProvider::class,
])-> merge ([
// Added Service Providers ( Do not remove this line ) . . .
])-> toArray (),
Обратите внимание: если вы изменили файл config/app.php
по другим причинам, возможно, в этом файле уже есть указанная выше запись providers
, и единственной важной строкой является та, которая заменяет QueueServiceProvider
.
php artisan vendor:publish
(Этот пакет использует функцию обнаружения.)
После описанных выше шагов ваше приложение будет знать о HTTP-домене, в котором он работает, как для HTTP-запросов, так и для запросов CLI, включая поддержку очередей.
ПРИМЕЧАНИЕ. В Laravel 11 установка проще, чем раньше: если вы используете предыдущую версию Laravel, ознакомьтесь с документацией по этапам установки.
Пакет совместим с Horizon, благодаря вкладу сообщества. Если вам нужно использовать этот пакет вместе с Horizon, вам необходимо выполнить еще два шага установки:
Установите Laravel Horizon как обычно.
Замените импорт Laravel Horizon в самом верху файла app/Providers/HorizonServiceProvider.php.
//use Laravel H orizon H orizonApplicationServiceProvider ;
use Gecche Multidomain Horizon HorizonApplicationServiceProvider ;
Этот пакет добавляет три команды для управления HTTP-доменами вашего приложения:
domain.add
ремесленную команду Основной командой является команда domain:add
, которая принимает в качестве аргумента имя HTTP-домена, добавляемого в приложение. Предположим, у нас есть два домена site1.com
и site2.com
, использующие один и тот же код.
Мы просто делаем:
php artisan domain:add site1.com
и
php artisan domain:add site2.com
Эти команды создают два новых файла среды, .env.site1.com
и .env.site2.com
, в которых вы можете поместить конкретную конфигурацию для каждого сайта (например, конфигурацию баз данных, конфигурацию кэша и другие конфигурации, которые обычно встречаются в среде файл).
Команда также добавляет запись в ключе domains
в файле config/domains.php
.
Кроме того, создаются две новые папки: storage/site1_com/
и storage/site2_com/
. Они имеют ту же структуру папок, что и основное хранилище.
Настройки этой подструктуры storage
должны соответствовать значениям в файле config/domain.php
.
domain.remove
ремесленную команду Команда domain:remove
удаляет указанный домен HTTP из приложения, удаляя его файл среды. Например:
php artisan domain:remove site2.com
Добавление опции force
приведет к удалению папки хранения домена.
Команда также удаляет соответствующую запись из ключа domains
в файле config/domains.php
.
domain.update_env
Команда domain:update_env
передает массив данных в формате JSON для обновления одного или всех файлов среды. Эти значения будут добавлены в конец соответствующего .env.
Обновите файл среды одного домена, добавив аргумент domain
.
Если аргумент domain
отсутствует, команда обновляет все файлы среды, включая стандартный .env
.
Список доменов, которые необходимо обновить, хранится в файле конфигурации domain.php
.
Например:
php artisan domain:update_env --domain_values='{"TOM_DRIVER":"TOMMY"}'
добавит строку TOM_DRIVER=TOMMY
во все файлы среды домена.
domain.list
Команда domain:list
выводит список установленных в данный момент доменов с указанием их файла .env и пути к хранилищу.
Список хранится в ключе domains
конфигурационного файла config/domain.php
.
Этот список автоматически обновляется при каждом выполнении команд domain:add
и domain:remove
.
config:cache
ремесленникаКоманда config:cache artisan может использоваться с этим пакетом так же, как и любая другая команда artisan.
Обратите внимание, что эта команда создаст файл config.php для каждого домена, под которым была выполнена команда. то есть команда
php artisan config:cache --domain=site2.com
сгенерирует файл
config-site2_com.php
Во время выполнения текущий HTTP-домен сохраняется в контейнере laravel, и к нему можно получить доступ с помощью метода domain()
добавленного этим пакетом.
Доступен метод domainList()
. Он возвращает ассоциативный массив, содержащий информацию об установленных доменах, аналогично команде domain.list
выше.
Например
[
site1.com => [
'storage_path' => <LARAVEL-STORAGE-PATH>/site1_com,
'env' => '.env.site1.com'
]
]
Для каждого HTTP-запроса, полученного приложением, загружается определенный файл среды и используется определенная папка хранения.
Если конкретный файл среды и/или папка хранения не найдены, используется стандартный.
Определение правильного домена HTTP осуществляется с помощью переменной PHP $_SERVER['SERVER_NAME']
.
ВАЖНОЕ ПРИМЕЧАНИЕ. В некоторых средах выполнения $_SERVER['SERVER_NAME'] не создается, поэтому этот пакет не будет работать должным образом, пока вы не настроите обнаружение HTTP-доменов, как описано ниже.
Начиная с версии 1.1.15, обнаружение HTTP-доменов можно настроить, передав Closure
в качестве записи domain_detection_function_web
нового аргумента domainParams
конструктора Application
. В следующем примере обнаружение домена HTTP основано на $_SERVER['HTTP_HOST']
вместо $_SERVER['SERVER_NAME']
.
//use Illuminate F oundation A pplication ;
use Gecche Multidomain Foundation Application ;
use Illuminate Foundation Configuration Exceptions ;
use Illuminate Foundation Configuration Middleware ;
$ environmentPath = null ;
$ domainParams = [
' domain_detection_function_web ' => function () {
return Illuminate Support Arr:: get ( $ _SERVER , ' HTTP_HOST ' );
}
];
return Application:: configure (basePath: dirname ( __DIR__ ),
environmentPath: $ environmentPath ,
domainParams: $ domainParams )
-> withRouting (
web: __DIR__ . ' /../routes/web.php ' ,
commands: __DIR__ . ' /../routes/console.php ' ,
health: ' /up ' ,
)
-> withMiddleware ( function ( Middleware $ middleware ) {
//
})
-> withExceptions ( function ( Exceptions $ exceptions ) {
//
})-> create ();
Чтобы различать домены, каждая команда artisan принимает новую опцию: domain
. Например:
php artisan list --domain=site1.com
Команда будет использовать соответствующие настройки домена.
Команды artisan queue:work
и queue:listen
были обновлены и теперь поддерживают новую опцию domain
.
php artisan queue:work --domain=site1.com
Как обычно, приведенная выше команда будет использовать соответствующие настройки домена.
Имейте в виду, что если, например, вы используете драйвер database
и у вас есть два домена, использующих одну и ту же базу данных, вам следует использовать две отдельные очереди, если вы хотите управлять заданиями каждого домена отдельно.
Например, вы можете:
QUEUE_DEFAULT=default1
для site1.com и QUEUE_DEFAULT=default2
для site2.comqueue.php
, изменив очередь по умолчанию соответствующим образом: 'database' => [
'driver' => 'database',
'table' => 'jobs',
'queue' => env('QUEUE_DEFAULT','default'),
'retry_after' => 90,
],
php artisan queue:work --domain=site1.com --queue=default1
и
php artisan queue:work --domain=site1.com --queue=default2
Очевидно, то же самое можно сделать и для каждого другого драйвера очереди, кроме драйвера sync
.
storage:link
Если вы используете команду storage:link
и хотите использовать отдельную символическую ссылку для каждого домена, вам придется создать их вручную, поскольку на сегодняшний день такая команда всегда создает ссылку с именем storage
, и это имя жестко запрограммировано в команде. Расширение команды storage:link
позволяющей выбирать имя, выходит за рамки этого пакета (и я надеюсь, что это будет сделано непосредственно в будущих версиях Laravel).
Способ получения нескольких ссылок на хранилище может быть следующим. Предположим, у нас есть два домена, а именно site1.com
и site2.com
со связанными папками хранения storage/site1_com
и storage/site2_com
.
ln -s storage/site1_com/app/public public/storage-site1_com
ln -s storage/site2_com/app/public public/storage-site2_com
.env.site1.com
и .env.site2.com
добавляем запись, например, для первого домена: APP_PUBLIC_STORAGE=-site1_com
filesystems.php
вносим следующие изменения: 'public' => [
'driver' => 'local',
'root' => storage_path('app/public'),
'url' => env('APP_URL').'/storage'.env('APP_PUBLIC_STORAGE'),
'visibility' => 'public',
],
Более того, если вы используете пакет в настройке одностраничного приложения (SPA), вы можете лучше обрабатывать отдельные общедоступные ресурсы для каждого домена через .htaccess или аналогичные решения, как указано Scaenicus в его решении .htaccess.
Начиная с версии 1.1.11 в конструктор приложения добавлен второй аргумент для выбора папки, в которой будут размещаться файлы окружения: если у вас десятки доменов, не очень приятно иметь файлы окружения в корне приложения Laravel. папка.
Итак, если вы хотите использовать другую папку, просто добавьте ее в самый верх файла bootstrap/app.php
. например, если вы хотите добавить файлы среды в подпапку envs
, просто выполните:
//use Illuminate F oundation A pplication ;
use Gecche Multidomain Foundation Application ;
use Illuminate Foundation Configuration Exceptions ;
use Illuminate Foundation Configuration Middleware ;
$ environmentPath = dirname ( __DIR__ ) . DIRECTORY_SEPARATOR . ' envs ' ;
$ domainParams = [];
return Application:: configure (basePath: dirname ( __DIR__ ),
environmentPath: $ environmentPath ,
domainParams: $ domainParams )
-> withRouting (
web: __DIR__ . ' /../routes/web.php ' ,
commands: __DIR__ . ' /../routes/console.php ' ,
health: ' /up ' ,
)
-> withMiddleware ( function ( Middleware $ middleware ) {
//
})
-> withExceptions ( function ( Exceptions $ exceptions ) {
//
})-> create ();
Если вы не укажете второй аргумент, предполагается стандартная папка. Обратите внимание: если вы указываете папку, в нее также необходимо поместить стандартный файл .env
Если вы попытаетесь запустить веб-страницу или команду оболочки в определенном домене, например sub1.site1.com
, и для этого домена не существует конкретного файла среды, то есть файла .env.sub1.site1.com
не существует, Пакет будет использовать первый доступный файл среды, разделив имя домена точками. В этом примере пакет ищет первый файл среды среди следующих:
.env.site1.com
.env.com
.env
Та же логика применима и к папке хранения.
Если в ваших настройках вы используете планировщик Laravel, помните, что команду schedule:run
также необходимо запускать с параметром домена. Следовательно, вам придется запустить планировщик для каждого домена. Сначала можно было подумать, что один экземпляр планировщика должен обрабатывать команды, запускаемые для любого домена, но сам планировщик запускается внутри приложения Laravel, поэтому «env», под которым он запускается, автоматически применяется к каждой запланированной команде, а --domain
Опция --domain
вообще не имеет никакого эффекта.
То же самое относится и к внешним инструментам, таким как Supervisor: если вы используете Supervisor для ремесленных команд, например queue:work
, обязательно подготовьте команду для каждого домена, с которым вы хотите работать.
В связи с вышеизложенным, в некоторых случаях пакет не может работать: в тех настройках, где у вас нет возможности изменить, например, конфигурацию супервизора, а не записи crontab
для планировщика. Здесь был указан такой пример, в котором использовался экземпляр Docker.
Наконец, имейте в виду, что некоторые команды Laravel вызывают другие команды Artisan изнутри, очевидно, без опции --domain
. Описанная выше ситуация не работает должным образом, поскольку подкоманда будет работать со стандартным файлом среды. Примером может служить команда migrate
при использовании опции --seed
.