cakePHP3でconfにrewriteの設定を記載したのに
効かなくて困った
先日の続きです
先日は対応に至った経緯を記事にしましたが
今回は何に困ったかに到るまでの作業編を書いていこうと思います
さ今回の対応の概要ですが
cakePHP3/apache/mysql/amazonLinux
今は管理者(企業)と利用ユーザーのシステなんですが
管理者(企業)は一つの環境構成に一つしか存在できない設計です
利用管理者(企業)企業が増えるたびにサーバなどの環境が無限に増えていくこの状況では運用コストもランニングコストも増え続けて利益とコストは比例型という状況を解消すべく今回は今まで一つの管理者のところ複数の管理者が共存できるように改修するわけです
といってもVirtualh Hostを作成してドキュメントルートを別に作成してもメンテナンスコストがかかるのでドキュメントルートは同じで管理者ドメインとDBも同一DBホスト内にdatabaseが増えていくような感じにしました
※本当はdatabase設計も変更して一緒にしたかったんですけどね。。
さて本題です
まずは、cakePHP3.4だったのですが環境設定ファイルはconfig配下でdevelop/productionの環境設定の定義が書かれたファイルを置き、environmentというファイルを作りこの中にdevelopと記載されていればdevelopのファイルを参照するって感じでした
独自で作ったんでしょうか?
しかも、Git管理されてしまっているのであんまりよろしくもありません。。
とりあえずこのままでは一つの管理者(企業)に用意した環境の設定した記載されません
今の状態でconfig/bootstrap.php記載されている記述をカスタマイズして複数設定を出来るようにしても良かったのですが他のプロジェクトで言語は違いましたが環境変数を使った設定をしたくこちらでも実装しようかなとそちらで対応することにしました
そして導入したのがこちら
Dotenv
基本的には、config/.envというファイルを置いて、Git管理外にしてとかするんですがそれだと元のまま一つしか設定はできないのでちょっとカスタマイズしました
ちなみにこの導入に一番参考になり分かり安かったのがこちらの
サイトでした!
まずはcomposerでDotenvをインストールします
# composer require josegonzalez/dotenv:dev-master
そして参考にしたサイトにあるようにconfig/bootstrap.phpno42行目あたりに追記したんですが、今回は複数の設定が出来るようにgetenv('PROJECT_CODE')でアクセスするドメインに応じて設定ファイルが切り替わるように手をいれました
>> try {
>> if(getenv('PROJECT_CODE')) {
>> $dotenv_name = '.env' . DS . '.' . getenv('PROJECT_CODE') . 'Env';
>> } else {
>> $dotenv_name = '.env';
>> }
>> josegonzalez\Dotenv\Loader::load([
>> 'filepath' => __DIR__ . DS . $dotenv_name,
>> 'toEnv' => true
>> ]);
>> } catch (InvalidArgumentException $e) {
>> // do nothing in case the file doesn't exist
>> }
さてこのgetenv('PROJECT_CODE')ですが、環境変数です。apacheのvirtualhostのconfファイルでアクセスドメインごとに管理者(企業)の設定を切り替えるようにしたわけです
virtualhostのconfファイルには先ほどの
PROJECT_CODEを設定します
>> Define project project_code
project_codeは管理者(企業)ごとの個別の識別子を設定します
Define でprojectに一度設定しているのはログなどの名前も分けたかったので一箇所で記載すればその他の部分も反映させられるのでこうしました
>> Define project project_code
>> <VirtualHost *:80>
>> ServerName domain.com
>> DocumentRoot /var/www/html
>> CustomLog /var/log/httpd/${project}.log combined
>> <Directory /var/www/html>
>> RewriteEngine on
>> RewriteCond %{REQUEST_URI} !^/img/${project}
>> RewriteRule ^img/(.*)$ img/${project}/$1 [L]
>> SetEnv PROJECT_CODE ${project}
>> </Directory>
>> </VirtualHost>
ざっくりはこんな感じです
これでcakePHPのbootstrap.phpに追記した部分で、virtualhostごとに設定したプロジェクトの識別コードの設定ファイルを見にいくことになります
config/.env/.projec_codetEnv
厳密には元の.envファイルの場合にも対応できるように分岐させていますが、ファイルがなければcatchに入りますが何もしません(設定が何もないのでエラーになるだけです)
また長くなりましたので今回はここまで
次回は、管理者(企業)ごとにイメージディレクトリを分けるにあたり
RewriteCond %{REQUEST_URI} !^/img/${project}
RewriteRule ^img/(.*)$ img/${project}/$1 [L]
コメント
コメントを投稿