Laravel｜同じ処理を複数のControllerで使う時に便利な共通関数を脳死で作成する方法


こんにちは、JeffTechです。

# この記事で実現できること
- 共通関数の作成＆実装
- コントローラーの簡略化
- コントローラーのメンテナンス性向上

# 説明
今回実装するのは、Hello world!と出力する処理を複数のコントローラーで実装する時に、それぞれのコントローラーで記述するのではなく、共通関数を作成し同じ処理を何回も書かないようにする方法です。

私の場合、チャット機能実装の際に、チャットルームを作成するという処理を複数のコントローラーで記述しなければならなかったので、チャットルーム作成という機能を共通関数化し、それぞれのコントローラーで共通関数を使い回す手法を行いました。

その時の備忘録を今回簡単に残していこうと思います。

# 開発環境
- OS： MacOS Catalina
- PHP： 7.3.11
- Laravel： 6

# 実装の流れ
1. Laravelプロジェクト作成
1. composer.jsonへ登録
1. composer dump-autoload実行
1. config/app.phpにエイリアスとして追加
1. 共通関数作成 
1. 処理を利用したいコントローラでuseする
1. routeの設定
1. viewの設定 

# 実装

## Laravelプロジェクト作成
今回はMAMPのhtdocs内にLaravelのプロジェクトを作成していきます。
ターミナルで以下のコマンドを実行してください。

```
$ cd /Applications/MAMP/htdocs
$ composer create-project --prefer-dist laravel/laravel commonHelloWorld "6.*"
```

これで`htdocs`配下に`commonHelloWorld`というLaravelのプロジェクトが作成されました。
記事の中では、`/Applications/MAMP/htdocs/commonHelloworld`フォルダのことをプロジェクトフォルダと呼んでいきます。

## composer.jsonへ登録
今回は`commonHelloworld/app`に`Common`フォルダを作成し、そこに共通関数を格納していきます。
そのため、プロジェクトフォルダ配下に`composer.json`があるので以下の通りに編集してください。

```json:composer.json
{
    ー省略ー

    "autoload": {
        "psr-4": {
            "App\\": "app/"
        },
        "classmap": [
            "database/seeds",
            "database/factories", // 最後にコンマを追加
            "app/Common" // ここを追加
        ]
    },

    ー省略ー
}
```

## composer dump-autoload実行
まずは、`commonHelloworld/app`配下に`Common`フォルダを作成してから以下のコマンドを実行してください。

```
$ composer dump-autoload
```
下記のような感じになれば成功です。

```
Package manifest generated successfully.
Generated optimized autoload files containing 4255 classes
```

もし下記のようなエラーが出た時は、`commonHelloWorld/app`に`Common`フォルダを作成してくださいね！

```
  [RuntimeException]                                                                              
  Could not scan for classes inside "app/Common" which does not appear to be a file nor a folder
```

## config/app.phpにエイリアスとして追加
`commonHelloWorld/config/app.php`のaliasesに共通関数の登録を行っていきます。
今回は、クラス名をsayHelloにするので、下記のように記述してください。
※クラス名は自由です。
※共通関数と同じクラス名にしてください。

```php:app.php
<?php

return [

    ー省略ー
    'aliases' => [
        
        ー省略ー

        'URL' => Illuminate\Support\Facades\URL::class,
        'Validator' => Illuminate\Support\Facades\Validator::class,
        'View' => Illuminate\Support\Facades\View::class,
        'sayHelloClass' => app\Common\sayHelloClas::class, //ここを追加
    ],
```

## 共通関数作成
今回は、単純にHello World!を出力するだけなので、`commonHelloWorld/app/Common`配下に`sayHelloClass.php`を作成し、以下のように記述してください。

```php:sayHelloClass.php
<?php

namespace app\Common;

class sayHelloClass
{
    public static function sayHello()
    {
        echo "Hello World!";
    }
}
```

## 処理を利用したいコントローラでuseする
まずは処理を利用したいコントローラーを作ります。
以下のコマンドをプロジェクトフォルダ配下で実行してください。

```
$ php artisan make:controller topContorller
```
これで、`app/Http/Controllers`配下に`topController.php`というコントローラーが作成できました。

では、以下のように編集してください。

```php:topController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Common\sayHelloClass;

class topController extends Controller
{

    public function show()
    {
        sayHelloClass::sayHello();

        return view(
            'topShow'
        );
    }
}
```

これで`topShow`というviewファイルに`Hello World!`が出力されるようになります！
なお、`topShow`はこれから作成します。

## routeの設定
次に、routeの設定をしていきます。
`commonHelloWorld/routes/web.php`を下記のように編集してください。

```php:web.php
<?php
Route::get('/', 'topController@show')->name('top.show');
```
これでrouteの設定は終わりました。

## viewの設定
続いて、Viewファイルの作成です。
`commonHelloWorld/resources/views`に`topShow.blade.php`を作成し、下記のように編集してください。

```php:topShow.blade.php
<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  これはトップだよ！
</body>

</html>
```

これで、あとは下記のコマンドでサーバーを立ち上げて、画面を確認してみましょう！

```
$ php artisan serve
```

画面を表示して、Hello World! これはトップだよ！　と出てくれば成功です！


# 最後に
少しでも役に立った！という時は、いいねをポチッとして
フォローしてくださると嬉しいです、、、笑

役に立たなかった時は、怒らないでコメント頂けますと幸いです笑

Twitterもやってますので、よかったら見てみてくださいね！
https://twitter.com/jefftechsaku