laravelのenv()について

Laravelのdatabase.phpなどを見ていると下記のような記述をよく見かけます。

    'default' => [
        'host' => env('REDIS_HOST', 'localhost'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => 0,
    ],

この env() がなんなのか気になったので調べてみました。

laravelのコアを読みに行くとSupportディレクトリの下のhelpers.phpの中に、下記のような記述があります。(今回は5.5で調べました)

Illuminate/Support/helpers.php

if (! function_exists('env')) {
    /**
     * Gets the value of an environment variable.
     *
     * @param  string  $key
     * @param  mixed   $default
     * @return mixed
     */
    function env($key, $default = null)
    {
        $value = getenv($key);

        if ($value === false) {
            return value($default);
        }

laravelのhelperの中で定義されていたのですね...

ちなみに、laravel5.0だと Foundation/helpers.php の中に定義されています。

ついでに、このhelpers.phpってどこで読んでるんだ?っと思って調べてみたところ、同じSupportディレクトリのcomposer.jsonで読み込まれていました。

Illuminate/Support/composer.json

    "autoload": {
        "psr-4": {
            "Illuminate\\Support\\": ""
        },
        "files": [
            "helpers.php"
        ]
    },

composer.jsonのautoloadでは、事前に読み込んでおきたいファイルなどを定義し、読み込むことができます。 詳しくはこちらの記事がおすすめです。

qiita.com

余談

laravelでは、Redisのdbは0で定義されています(redis側がデフォルトで0を使うからこちらも0にしているのかな?)。

そのため、下記のようにRedisのDBもenvに変数として定義してみました!

    'default' => [
        'host' => env('REDIS_HOST', 'localhost'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => env('REDIS_DB', 0),
    ],

うまく行く!と思ったが、ところがどっこいそうは問屋がおろしませんでした。アプリ落ちちゃった...

原因を調べたところ、0がenv関数のkeyとして渡った場合、""が帰ってくるからです...""じゃredisのdbを指定できませんね...

コントローラ

dd(env('REDIS_DB', 1));

envの中身

REDIS_DB=0

ddの結果

""

もう少し追ってみる

helperの中に下記のように記述して追って見ます。

    function env($key, $default = null)
    {
        if($key == 'REDIS_DB') {
            dd($key, getenv($key));
        }

ddの結果

"REDIS_DB"
""

こっから先は下記のリポジトリを追っていけばいいと思うのですがここで気力が尽きたのでまた今度...

GitHub - vlucas/phpdotenv: Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.

教訓

とりあえず、0はenvの変数にいれないでおこう...

laravelで設定されているredisのデフォルト値について

Laravelで下記のような設定がありますね! laravel5.5の設定ファイルです。

github.com

    'redis' => [
        'client' => 'predis',
        'default' => [
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', 6379),
            'database' => 0,
        ],

この設定について少し調べてみました。 HOSTはまあ、置いといて、PORT番号ですね。

redisでは 6379でコネクションを受けるようにデフォルトで設定されているようです!

設定ファイル — redis 2.0.3 documentation

なので、laravelでもデフォルトで6379が指定されています。

次にdatabaseです。 下記の記事にもある通り、redisのdatabaseは整数値で識別しているようです! デフォルトでは0が自動的に選ばれます。そのため、Laravel側も0を選択するようにしているようです。 こちらも上記のドキュメントに記載さています。

データベースの番号を設定します。デフォルトのデータベースは DB 0 です。ユーザは、 SELECT を使うことで、コネクションごとに違うデータベースを選択することができます。この dbid には、0から、 databases - 1 まで設定できます。

所感

複数アプリで同じredisのDBを使っていると、いずれキャッシュのkeyがかぶったりなどと事故が起きる可能性があります! そのため、keyを作成する際はアプリごとのプレフィックスをつけるなど、チーム、またはプロジェクト全体での制約を設けることが必要だと感じました!

明けましておめでとうございます!django!始めました!

明けましておめでとうございます!! 12月に決意表明をしたにもかかわらず記事を書かなかったダメ男です... (SHIROBAKOやグリムガル, ボールルームへようこそを見ててサボってたなんていえない...

ユメかわいいよ...

f:id:yh1126:20180107221501j:plain

っと、アニメばかり見てる私ですが、年末年始の長期休暇ということで下記の記事に沿ってDjangoの勉強をしています。

qiita.com

Djangoを勉強するにあたり今回PyCharmというエディタを使っています!

今までvimを使っていたので、新鮮であり、Pycharmのすごさに圧倒されています。。。 たとえば、vimで開発を行っている時、継承しているクラスのメソッドを呼ぶ際はそのクラスがどんなメソッドを持っているか 元クラスを調べに行くことが多々あります (私が便利なプラグインを知らないのが原因かもしれません。。。) しかし、PyCharmを使うと使用する下記の画像のように呼び出せるメソッドや変数の候補を表示してくれます!

f:id:yh1126:20180107215323p:plain

いやぁ、便利ですねえ...PyCharmは使い始めたばかりですが、かなり使いやすく感じています! Pythonで本格的に開発をするなら必ず使おうと思いました!

djangoでの開発の進め方?

djangoで新しくシステムを作る時の流れを簡単に自分用に記しておきます。

  1. プロジェクトの作成
  2. DBなどの環境設定
  3. アプリの作成
  4. マイグレーションファイルの作成やurlの定義
  5. ロジックの定義・フロント用ファイルの作成

djangoを始めてみての感想

  • 業務でLaravelやCodeIgniterアプリの運用を行っているので、ディレクトリ構造の違いなどが新鮮!
  • プロジェクトとアプリケーションの関係
    プロジェクトの下に複数のアプリケーションが作成できるので、下手をすれば1つのプロジェクトに多数のアプリが存在しする。そのため、プロジェクトが肥大化すると管理が大変そう...
  • コントローラが肥大化しそう
    アプリ名/views.pyというファイルが、MVCでいうコントローラの立ち位置に当たると思います。そのため、ここに各URLごとのメソッドを用意していくのですが、どんどんここに処理を書いて行くとかなり肥大化していきそう!よって、しっかりとビジネスロジックをモデルに閉じ込めて上げる必要がある。(プロジェクト全体で使いたいモデルやメソッドを定義するところはあるのだろうか...要勉強
  • 便利なモジュールをどんどんimportしていけば、開発者の負担が減って良さげ! Pythonは本当にライブラリが充実してそうなので、どんどん便利なものを撮ってきて利用すると開発がスムーズに行えそうですね!

まだ、チュートリアルのようなものを1つこなしただけなので今度は公式のチュートリアルをこなしていきたいと思います!

決意表明!ブログ!はじめました!

毎週一本!!!記事を!!!書く!!!

記事を書くのって、小学生並みの感想である自分の考えを出すのが恥ずかしいとか
いろいろ人からのコメントがすごく怖そう(ここでもう小並感)

とか!いろいろなハードルがあると思っています

そんなハードルを乗り越える...!

乗り越えるためにここに決意を表したいと思います!(どうせ誰も見ないし...(´・ω・`)

「毎週1本記事を書く!」

お題は技術系から甘いものの話まで、とりあえず何か書いて継続していくことを目指します!

がんばるぞー!!!┗(`・ω・´)┛フンヌッ!