はじめに
こんばんは。
大したことない記事ですが、最近cakephp3.5を触る機会があったんで、ちょろっとした記事ですが、自分のために残しておこうかなと思いました。
まだドキュメント見ながらですが、なんとなくやっております。
今回やったのは、環境ごとに設定を切り分ける方法と、Middlewareの使用方法です。
やってみた
環境ごとに設定を切り分ける
なんか色々やる方法があるっぽいですが、自分がやったのはbootstrap.phpで切り替える方法でした。
cakephp3.5はdotenvをデフォルトサポートしているようなので、それ利用しない手はないと思って、dotenvを呼び出すところを以下のように修正しました。
<?php ... if (env("ENVIRONMENT") === 'production') { $dotEnvFilePath = CONFIG . '.env.production'; $appFileKey = 'app_production'; } elseif (env("ENVIRONMENT") === 'staging') { $dotEnvFilePath = CONFIG . '.env.staging'; $appFileKey = 'app_staging'; } else { $dotEnvFilePath = CONFIG . '.env.develop'; $appFileKey = 'app_develop'; } $dotenv = new \josegonzalez\Dotenv\Loader([$dotEnvFilePath]); $dotenv->parse()->toEnv(); try { Configure::config('default', new PhpConfig()); Configure::load($appFileKey, 'default', false); } catch (\Exception $e) { exit($e->getMessage() . "\n"); } ...
これで、切り替えできました。
Middleware
テスト環境・ステージング環境とかで、Basic認証かけたいみたいな事よくあって、実際今仕事いただいている会社でもそんな状況です。
現状は .htaccess
.htpasswd
で実装しているんですが、cakephp3上で再現したほうがめんどくさくないなと思って、やりました。
また、全体にかけないといけないので、これはMiddlewareかなと。
- Application.phpに以下を追加
<?php public function middleware($middlewareQueue) { if (env('IS_PRODUCTION') === false) { $middlewareQueue->add(BasicAuthenticateMiddleware::class); } ... }
- Middleware\BasicAuthenticateMiddleware.phpを作成
<?php namespace App\Middleware; /** * Basic認証ミドルウェア * Class BasicAuthenticateMiddleware * @package App\Middleware */ class BasicAuthenticateMiddleware { public function __invoke($request, $response, $next) { if (isset($_SERVER['PHP_AUTH_USER'])) { if (!($_SERVER['PHP_AUTH_USER'] === env("BASIC_AUTH_USER") && $_SERVER['PHP_AUTH_PW'] === env("BASIC_AUTH_PASS"))) { $this->_basicUnauthorized(); } } else { $this->_basicUnauthorized(); } return $next($request, $response); } protected function _basicUnauthorized() { header('WWW-Authenticate: Basic realm="Please enter your ID and password"'); header('HTTP/1.0 401 Unauthorized'); die("Authorization Required"); } }
簡単でした。
終わりに
自分がcakephpをガッツリ触ってたのは1.2で、2系は少しだけ触っていたので、なんか色々できるようになってるなぁと思いました。
今はDIコンテナはないのかなぁと探してるんですが、rochamarcelo/cake-pimple-di がいいかなーと思い、ちょろちょろ触っております。
本当はSentryネタ上げたかったんですが、プライベートが忙しくて全く手を付けられていません。。。
今日はつかれたからこれで終わりますぅ。