エンジニアのひよこ_level10

【毎日更新!】新卒3年目エンジニアブログです! プログラムだけじゃなく、マネジメントとかも書いていきたい!

【Laravel】初心者も出来た!Laravelの中身を読んでコントリビュートしよう

Laravelアドベントカレンダー12日目の記事です

この記事は、Laravelアドベントカレンダー2018の12日目の記事です。

qiita.com

読者対象

PHP、Laravel初心者。

Laravelにプルリク出してみたい人。

初心者PHPerです!

はい!私PHP歴1.5年の初心者です!

そんな私も、実はLaravelにプルリクエストを出して、コントリビュートした経験が。
バグを直しました。

[5.7] causes problem when we write unit-test in `cache('foo')` by klack710 · Pull Request #25492 · laravel/framework · GitHub

実は、Laravelにプルリクを出すって、そんなに難しくない!
この記事をきっかけに、それを知っていただけると嬉しいです!

突然ですが問題です

User::select('*')->orderBy('id', 'ascc')->get();

このコード、'asc'を間違えて、'ascc'になってますね。

これはどう動くでしょうか!

1. そのまま
2. エラーになる
3. ascになる
4. descになる

他の人の回答

Twitterのアンケート。中身を読む前にぽちっとしてみてください。
他の人の意見も見れます。

1. Laravelのコードの場所

Laravelのプロジェクトの中にある、vendorディレクトリを開いたら、 laravelって文字が見えますね。それです。

vendor/laravel/framework/src/Illuminateの中が主に見るコードです。

2.クエリビルダの場所

vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php

ここが、クエリビルダのコードが書かれている場所です。

Database、Query、Builder、わかりやすいですね!

3.関数を探す

では検索をしてみましょう。 orderBy(で検索してみてください。

みなさん、読みましたか?では正解です。

(回答)5.7現在、descに変わります

    public function orderBy($column, $direction = 'asc')
    {
        $this->{$this->unions ? 'unionOrders' : 'orders'}[] = [
            'column' => $column,
            'direction' => strtolower($direction) === 'asc' ? 'asc' : 'desc',
        ];

        return $this;
    }

これ、PHP初心者でも読めますね!

解説

'direction' => strtolower($direction) === 'asc' ? 'asc' : 'desc',

strtolowerは、$directionをすべて小文字にします。

なので、$directionが'asc'、'ASC'、'Asc'とかなら、'asc'で動きます。

それ以外はすべて'desc'で動きます。

'ascc'は条件に合致しないので、'desc'で動く。
そう、さっきの問題は5が正解です!

元コードを読むのは意外と簡単

今回はファイルの場所を私が示しましたが、
自分で探すのも簡単です。

よくコードの一番上に useを書くと思います。プロジェクトでも探してみてください。

use Illuminate\Database\Eloquent\Builder;

Illuminateで始まるuseです。

このパスはLaravelのコードのことです。
vendor/laravel/framework/src/の下にあるこのパスを辿れば、元コードにたどり着きます。

namespaceやuseに着目すれば、元コードは簡単にたどれます!

コントリビュートの話は?

さっきの問題が予想外だった方、このままでいいのかな?とか思いませんでしたか?
エラー吐くべき?似たコードは保管するべき?とかとか。

そんなときが、コントリビュートチャンス。

私がこの話したら、早速友人がissueを立てました。

Add InvalidArgumentException For orderBy() in Illuminate\Database\Query\Builder · Issue #1434 · laravel/ideas · GitHub

さっきコード読んだとき、結構簡単なコードだと思いませんでしたか?
コントリビュートって結構難しくないのです。

5.7では'desc'で動くと書きましたが、これがもしかしたら、明日にでも修正されるかもしれない!
私も、バグ修正はプルリク出して1日でマージされました。

コントリビュートは難しくない!

私がバグを直したときも、if文を少し追加したものでした。
(マージしてもらったあとで、コードをもっと良いコードに変えてもらいましたが、テストコードは残ってます)

[5.7] causes problem when we write unit-test in `cache('foo')` by klack710 · Pull Request #25492 · laravel/framework · GitHub

ぜひ、Laravelで『あれ?』って思ったときは、一度コードを読んでみてください。

そして、プルリクを出してみてください。

『大型OSS、Laravelにコントリビュートした!』『俺のコードが世界中で動いている!』

ちょっと冗談めいた話ですが、それができるのが、この業界の面白いところ。
ぜひ、元コードを読んで見る習慣をつけてみてください。

Laravelはよくできたコードなので、普通に勉強になると思います!

是非皆さんもコードを読んでみてください!

おまけ

コントリビュートの過程や、コントリビュートでどんな面白いことがあったかは、以下の記事に書いています。
コントリビュートすると何が嬉しい?ってのは、この記事を参考にどうぞ。

いい記事だと思ったら、是非下のTwitterFacebookでのシェアボタンでシェアをお願いいたします!

www.nyamucoro.com