マルチドメイン設定でLaravelを使用するための拡張機能
このパッケージにより、単一の Laravel インストールが複数の HTTP ドメインで動作できるようになります。
異なる顧客がコードの点では同じアプリケーションを使用するが、データベース、ストレージ、構成の点では使用しないというケースは数多くあります。
このパッケージは、顧客ごとに特定の env ファイル、特定のストレージ パス、および特定のデータベースを取得する非常に簡単な方法を提供します。
ララベル | マルチドメイン |
---|---|
11.x | 11.x |
10.x | 10.x |
9.x | 5.x |
8.x | 4.x |
7.x | 3.x |
6.x | 2.x |
5.8.x | 1.4.x |
5.7.x | 1.3.x |
5.6.x | 1.2.x |
5.5.x | 1.1.x |
リリース 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 バージョンの新機能を含む最後のリリースになります (そのバージョンのバグ修正サポートはまだ有効です)。 。 2021-02-13 更新: v1.1+ リリースの最後の機能のいくつかはまだ継続中です :)
v1.0 には Laravel 5.1、5.2、5.3、および 5.4 が必要です (維持されておらず、laravel 5.4 と比較してテストされていません。ただし、パッケージの使用法は 1.1 と同じです)
2023-02-20 更新: Laravel 10.x 以降、パッケージのバージョンは同じ番号に従います。
gecche/laravel-multidomainを要件としてcomposer.jsonに追加します。
{
"require" : {
"gecche/laravel-multidomain" : "11.*"
}
}
combos update でパッケージを更新するか、composer install でインストールします。
また、 composer require gecche/laravel-multidomain
使用してパッケージを追加し、後で必要なバージョンを指定することもできます。
このパッケージは、特定の環境ファイルを取得するために、ブートストラップ プロセスの開始時に Laravel コア関数の最小限のセットで HTTP ドメインの検出をオーバーライドする必要があります。したがって、このパッケージには、ほとんどの Laravel パッケージよりもいくつかの設定手順が必要です。
インストール手順:
bootstrap/app.php
ファイルの先頭にある次の行を変更して、Laravel コンテナ全体を置き換えます。 //use Illuminate F oundation A pplication
use Gecche Multidomain Foundation Application
config/app.php
ファイル内の拡張されたものでQueueServiceProvider
オーバーライドします。 ' 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 リクエストと CLI リクエストの両方について、実行されている HTTP ドメインを認識するようになります。
注: Laravel 11 では、インストールは以前よりも簡単になっています。Laravel の以前のバージョンを使用している場合は、ドキュメントでインストール手順を確認してください。
このパッケージは、コミュニティの貢献のおかげで Horizon と互換性があります。このパッケージを Horizon と一緒に使用する必要がある場合は、他の 2 つのインストール手順に従う必要があります。
いつものようにLaravel Horizonをインストールします
app/Providers/HorizonServiceProvider.php ファイルの最上部にある Laravel Horizon インポートを置き換えます。
//use Laravel H orizon H orizonApplicationServiceProvider ;
use Gecche Multidomain Horizon HorizonApplicationServiceProvider ;
このパッケージには、アプリケーションの HTTP ドメインを管理するための 3 つのコマンドが追加されます。
domain.add
職人コマンドメインのコマンドは、アプリケーションに追加する HTTP ドメインの名前を引数として取るdomain:add
コマンドです。同じコードを共有する 2 つのドメインsite1.com
とsite2.com
あるとします。
私たちは単に次のことを行うだけです。
php artisan domain:add site1.com
そして
php artisan domain:add site2.com
これらのコマンドは、2 つの新しい環境ファイル.env.site1.com
および.env.site2.com
を作成します。このファイルに、各サイトの特定の構成 (例: データベース構成、キャッシュ構成、および通常環境で見られるその他の構成) を入れることができます。ファイル)。
このコマンドはconfig/domains.php
ファイルのdomains
キーにもエントリを追加します。
さらに、 storage/site1_com/
およびstorage/site2_com/
2 つの新しいフォルダーが作成されます。メインストレージと同じフォルダー構造になっています。
このstorage
下部構造に対するカスタマイズは、 config/domain.php
ファイル内の値と一致する必要があります。
domain.remove
削除職人コマンドdomain:remove
コマンドは、環境ファイルを削除することで、指定された HTTP ドメインをアプリケーションから削除します。例えば:
php artisan domain:remove site2.com
force
オプションを追加すると、ドメイン保存フォルダーが削除されます。
このコマンドは、 config/domains.php
ファイルのdomains
キーから適切なエントリも削除します。
domain.update_env
職人コマンドdomain:update_env
コマンドは、JSON でエンコードされたデータ配列を渡して、1 つまたはすべての環境ファイルを更新します。これらの値は、適切な .env の末尾に追加されます。
domain
引数を追加して、単一のドメイン環境ファイルを更新します。
domain
引数が指定されていない場合、コマンドは標準の.env
ファイルを含むすべての環境ファイルを更新します。
更新されるドメインのリストは、 domain.php
構成ファイルに保持されます。
例えば:
php artisan domain:update_env --domain_values='{"TOM_DRIVER":"TOMMY"}'
すべてのドメイン環境ファイルに行TOM_DRIVER=TOMMY
が追加されます。
domain.list
職人コマンドdomain:list
コマンドは、現在インストールされているドメインを、その .env ファイルとストレージ パス dir とともに一覧表示します。
このリストはconfig/domain.php
構成ファイルのdomains
キーで維持されます。
このリストはdomain:add
およびdomain:remove
コマンドが実行されるたびに自動的に更新されます。
config:cache
職人コマンドconfig:cache 職人コマンドは、他の職人コマンドと同じようにこのパッケージで使用できます。
このコマンドは、コマンドが実行されたドメインごとに 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 ドメインの検出は、 $_SERVER['SERVER_NAME']
PHP 変数を使用して行われます。
重要な注意: 一部の実行環境では $_SERVER['SERVER_NAME'] がインスタンス化されないため、以下で説明するように HTTP ドメインの検出をカスタマイズするまで、このパッケージは正しく動作しません。
リリース 1.1.15 以降、 Application
のコンストラクターの新しいdomainParams
引数のdomain_detection_function_web
エントリとしてClosure
渡すことで、HTTP ドメインの検出をカスタマイズできます。次の例では、HTTP ドメインの検出は $_SERVER[' $_SERVER['SERVER_NAME']
$_SERVER['HTTP_HOST']
に依存します。
//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
このコマンドは、対応するドメイン設定を使用します。
職人コマンドのqueue:work
およびqueue:listen
コマンドが更新され、新しいdomain
オプションを受け入れるようになりました。
php artisan queue:work --domain=site1.com
いつものように、上記のコマンドは対応するドメイン設定を使用します。
たとえば、 database
ドライバーを使用していて、同じデータベースを共有する 2 つのドメインがある場合、各ドメインのジョブを個別に管理したい場合は、2 つの異なるキューを使用する必要があることに注意してください。
たとえば、次のことができます。
QUEUE_DEFAULT=default1
、site2.com の場合はQUEUE_DEFAULT=default2
なります。queue.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
という 2 つのドメインがあり、ストレージ フォルダー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) 設定でパッケージを使用している場合は、Scaenicus が .htaccess ソリューションで指摘したように、.htaccess または同様のソリューションを介してドメインごとに個別のパブリック リソースをより適切に処理できる可能性があります。
バージョン 1.1.11 からは、環境ファイルを配置するフォルダーを選択するために、Application コンストラクターに 2 番目の引数が追加されました。数十のドメインがある場合、ルート 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 ();
第 2 引数を指定しない場合は、標準のフォルダーが使用されます。フォルダーを指定する場合は、標準の.env
ファイルもそのフォルダーに配置する必要があることに注意してください。
特定のドメイン (たとえば、 sub1.site1.com
で Web ページまたはシェル コマンドを実行しようとしたときに、そのドメインに特定の環境ファイルがない場合 (つまり、ファイル.env.sub1.site1.com
が存在しない場合)、パッケージは、ドメイン名をドットで分割することにより、最初に使用可能な環境ファイルを使用します。この例では、パッケージは次の中から最初の環境ファイルを検索します。
.env.site1.com
.env.com
.env
同じロジックがストレージフォルダーにも適用されます。
設定でLaravelのスケジューラを使用する場合は、コマンドschedule:run
もドメインオプションを指定して起動する必要があることに注意してください。したがって、ドメインごとにスケジューラを起動する必要があります。最初は、1 つのスケジューラ インスタンスが任意のドメインに対して起動されたコマンドを処理する必要があると考えられるかもしれませんが、スケジューラ自体は Laravel アプリケーション内で実行されるため、スケジューラが実行される「env」は、スケジュールされた各コマンドに自動的に適用され、 --domain
オプションはまったく効果がありません。
同じことが Supervisor などの外部ツールにも当てはまります。Supervisor を職人コマンド ( queue:work
コマンドなど) に使用する場合は、処理したいドメインごとにコマンドを必ず準備してください。
上記の理由により、パッケージが機能しない場合があります。たとえば、スケジューラのcrontab
エントリではなくスーパーバイザ設定を変更する可能性がない設定です。ここでは、Docker インスタンスが使用されている例を指摘しました。
最後に、一部の Laravel コマンドは、明らかに--domain
オプションを使用せずに、内部から他の Artisan コマンドを呼び出すことに注意してください。サブコマンドは標準環境ファイルで動作するため、上記の状況は正しく動作しません。例としては、 --seed
オプションを使用する場合のmigrate
コマンドがあります。