もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

cakephp3.5を少し触ってみた

はじめに

こんばんは。

大したことない記事ですが、最近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かなと。

  1. Application.phpに以下を追加
<?php

    public function middleware($middlewareQueue)
    {
        if (env('IS_PRODUCTION') === false) {
            $middlewareQueue->add(BasicAuthenticateMiddleware::class);
        }
        
        ...
    }
  1. 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ネタ上げたかったんですが、プライベートが忙しくて全く手を付けられていません。。。

今日はつかれたからこれで終わりますぅ。