PHPで生年月日のフォームを自作関数にしてLaravelのbladeで使ってみた

<h2>はじめに</h2>
Laravelのbladeで、フォームに生年月日入力欄を作ろうとし、「生年月日　select コピペ」で調べてコピペした際、長すぎーと思ったので、
PHPで書き直してから、Laravelのbladeで表示させるところまでやってみました。


```php:index.blade.php
//~略

<option value="">-</option>
<option value="1900">1900</option>
<option value="1901">1901</option>
<option value="1902">1902</option>
<option value="1903">1903</option>
<option value="1904">1904</option>
<option value="1905">1905</option>
<option value="1906">1906</option>
<option value="1907">1907</option>
<option value="1908">1908</option>
<option value="1909">1909</option>
<option value="1910">1910</option>
<option value="1911">1911</option>
<option value="1912">1912</option>

//略)2021まで続く...
//...長い。
```

<h2>まずは生PHPでテスト</h2>
後ほど、自作関数としてbladeに表示させるつもりだったので、function内に処理を書いて、呼び出すようにしました。
postで受け取った後に年と月と日を連結してdate型にしたかったので、月と日はvalue値を<a href="https://www.php.net/manual/ja/function.str-pad.php">`str_pad()`</a>で0埋めにしました。
→★コメントより、`sprintf`の方がより楽という意見をいただきましたので、変更しました。よりスマートになりました。有難うございます。


```php:test.php
<?php

//年
function yearSelect(){
    $n = date("Y"); //現在の年
    $y = $n - 125; //125年前からスタート
    for($y; $y<$n; $y++){
        echo '<option value="'.$y.'">'.$y.'</option>';
    }
}

//月
function monthSelect(){

     for($m=1; $m<=12; $m++){
         $pad = sprintf('%02d', $m) 
         //1~9までは前を0埋め,str_pad($m, 2 ,0, STR_PAD_LEFT)から変更
         echo '<option value="'.$pad.'">'.$m.'</option>';
     }
}

//日
 function daySelect(){
      for($d=1; $d<=31; $d++){
         $pad = sprintf('%02d', $d);
         //1~9までは前を0埋め,str_pad($d, 2 ,0, STR_PAD_LEFT)から変更
         echo '<option value="'.$pad.'">'.$d.'</option>';
      }
  }
?>

<!--略-->

<div>
  <select name="birthday_year">
      <option value="">-</option>
      <?php yearSelect(); ?>
  </select>
  年
  <select name="birthday_month">
      <option value="">-</option>    
      <?php monthSelect(); ?>
  </select>
  月
  <select name="birthday_day">
       <option value="">-</option>    
       <?php daySelect(); ?>
  </select>
  日
</div>

<!--略-->
```
<img width="400" alt="test.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1110494/814490e6-0dc6-bdc7-fa28-d5a93c1d618a.png">
できたので、Laravelでやってみます。

<h2>【Laravel】自作関数用のクラスを作成</h2>
appディレクトリに、Lib(任意名)ディレクトリを作成し、MyFunction.php(任意名)を作成
MyFunctionクラスの中にstaticメソッドを作成していきます。（先程のをstaticにしてぶち込んだだけです。）
staticの解説としては以下が分かりやすかったです。有難うございます。
https://fresh-engineer.hatenablog.com/entry/2018/08/23/031829



```php:app>MyFunction.php
<?php

namespace App\Lib;

class MyFunction
{

  public static function yearSelect(){
      $n = date("Y"); //現在の年
      $y = $n - 125; //125年前からスタート
      for($y; $y<$n; $y++){
          echo '<option value="'.$y.'">'.$y.'</option>';
      }
  }

  public static function monthSelect(){
      for($m=1; $m<=12; $m++){
         $pad = sprintf('%02d', $m) 
         //1~9までは前を0埋め,str_pad($m, 2 ,0, STR_PAD_LEFT)から変更
         echo '<option value="'.$pad.'">'.$m.'</option>';
      }
  }

  public static function daySelect(){
      for($d=1; $d<=31; $d++){
         $pad = sprintf('%02d', $d);
         //1~9までは前を0埋め,str_pad($d, 2 ,0, STR_PAD_LEFT)から変更
         echo '<option value="'.$pad.'">'.$d.'</option>';
      }
  }

}

```


<h2>【Laravel】エイリアスに登録</h2>
configディレクトリのapp.php内にあるエイリアス（aliases）の中に
'クラス名' => App\Lib\ファイル名::class,を追加します

```php:config>app.php
'aliases' => [

        //~略
        'MyFunction' => App\Lib\MyFunction::class,
],
```

<h2>【Laravel】bladeで使用する</h2>

{{ MyFunction::関数(メソッド)名 }}

```php:index.blade.php
<!--略-->
<li class="form-item">
   <p class="form-item-title">生年月日</p>
   <select name="birthday_year">
     <option value="">-</option>
     {{ MyFunction::yearSelect() }}
   </select>
   年
   <select name="birthday_year">
     <option value="">-</option>
     {{ MyFunction::monthSelect() }}
   </select>
   月
   <select name="birthday_year">
     <option value="">-</option>
     {{ MyFunction::daySelect() }}
   </select>
   日
</li>
<!--略-->
```

<img width="400" alt="test2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1110494/607f9b6c-84eb-b550-b994-fb61a860d8a0.png">

無事表示されました。おしまい。

<h2>おわりに</h2>
初めてのQlita投稿でした。
いつもお世話になっているので、自分もと思い投稿してみましたが、Qlitaの質を下げてしまうのは一番避けたいところですので、もし他に良い方法や間違っている点等あれば教えて頂ければ幸いです。