スクラッチでサービスクラスを作成してみる。PHPでSNSを作成してみる#10

今回は、サービスクラスの作成と
コントロールとの紐付けについて記します。

前回の記事では、会員登録画面の作成をしました。
ビューとコントローラの紐付けを行い、会員登録時に必要な情報をコントローラで受け取る処理まで行いました。
今回はその続きを記します。

処理の流れ

サービスクラスまでのフロー

コントローラで受け取った値をサービスクラスに受け渡すところまで行います。

この流れは、ビューからコントローラー、サービスクラスに値を受け渡すだけではなく、サービスから値を受け取ることもできます。また、値がなくてもリクエストのみでも実行可能な仕組みにします。

処理のイメージは、下の画像の通りです。

サービスクラスの役割

controlllerからserviceに値を受け渡し、service内で値の加工をします。
その後、Modelに箱詰めをしてAPIとしてDBにリクエストをします。

結果はoutputに返します。続けてリクエスト送る場合は、addRequestより、
リクエストをします。そして最終的な結果をrequestの戻り値としてcontrollerに返します。

では、上の仕組みを作るためにファイルの作成と処理の作成をしましょう。

必要なファイルの作成

今回作成するファイルのみ記しています。
※下記のみだと正常に実行されないのでシリーズの過去記事をご覧ください。

sns_training
      └── app
              ├── services
                      ├── service.php
                      └── userServices
                                └── registUserService.php

今回は、サービスクラスを作成する段階です。
serviceクラスからDBまでの処理は複数の内部ファイルを呼び出します。
一つの章では収まりきらないため複数章に跨って記します。

そのため、記述時にエラーが発生するのでご了承ください。

service.php

このファイルは、サービスクラスの親となるクラスのファイルです。

<?php 
namespace App\Services;

use API\Connection\api;

class service
{
  private $MODEL;

  public function request($request = null){
    $this->MODEL = $this->input($request);
    return $this->output($this->call(), $request);
  }

  public function addRequest($request = null, $inputValue = null){
    if ($request != null) {
      $this->MODEL = $request;
    } else {
      $this->MODEL = null;
    }
    return $this->call();
  }

  private function call(){
    $func = $this->REQUEST_API_NAME;
    return (new api)->$func($this->MODEL);
  }

  public function callRtnHandle($obj, $msg=null, $code=1){
     return ["RESULT"=>$obj,"MESSAGE"=>$msg,"CODE"=>$code];  }
}
?>

このファイルでは、useでapiやformatRtnValueを定義しています。
apiについては後の章で内容を記します。formatRtnValueについては後述します。

public function request($request = null){
   $this->MODEL = $this->input($request);
   return $this->output($this->call(), $request);
 }

requestメソッドは基本的にコントローラから呼び出されます。

requestメソッドでは、子クラスに記述するinputメソッドを呼び出します。
そして、戻り値をメンバ変数に代入します。
続いて、子クラスのoutputメソッドを呼び出し、戻ってきた値を戻り値としてコントローラに返します。

private function call(){
 $func = $this->REQUEST_API_NAME;
 return (new api)->$func($this->MODEL);
 }

callメソッドでは、APIへリクエストを行います。
$this->REQUEST_API_NAMEは、子クラスのメンバ変数に記述します。
この値は、API番号とします。(API番号については後の章でご説明します。)

そして、APIを介して戻ってきた値を戻り値とします。
このメソッドは同じクラスでしか使用されません。そのため、アクセス修飾子はprivateです。

public function addRequest($request = null, $inputValue = null){
 if ($request != null) {
   $this->MODEL = $request; 
  } else {
   $this->MODEL = null;
 }
 return $this->call();
}

addRequestメソッドでは、再度サービスクラスからAPIを介してDBへリクエストを渡すときに使用します。

1度目のリクエストで受け取った値を使用して再度リクエストをする。
例えば、ログイン処理でIDに紐づくハッシュ値を返却して、
パスワードのハッシュ値と一致していれば、ユーザ情報をリクエストをするようなことです。

public function callRtnHandle($obj, $msg=null, $code=1){
 return ["RESULT"=>$obj,"MESSAGE"=>$msg,"CODE"=>$code];
 }

このメソッドでは、serviceからcontrollerに返すときに使用します。
第一引数は、outputModel、第二引数は、メッセージ。第三引数はコードです。

第二、第三引数は初期値を設けておきます。
今回は、messageはnull、コードは1とします。これは、成功時です。失敗時は、エラーメッセージを入れ、コードを0とするとわかりやすいです。

データがきちんと取得できたかを判定するため、このようなオブジェクトに包んで返却します。

例えば、一致するユーザIDのユーザ情報を返す仕組みにして、一致した場合はユーザ情報を返しますが、一致するものが無い場合は[空]を返すものとします。

その判別は、極力viewでしたくないです。そのため、serviceからcontrollerに返す際に、どのような状態のオブジェクトが入っているかが分かるために、このような記述にしています。

registUserService.php

この章では、雛形のみ作成します。
実際の処理の記述に関しては後の章でご紹介します。

<?php
namespace App\Services\UserServices;
use App\Services\service;
class registUserService extends service {
    protected $REQUEST_API_NAME;
    public function input($request = null){
    }

    public function output($result = null,$request = null){
    }
}
?>

子クラスとなるサービスクラスは、ページや機能の数によって増えていくので、なるべくシンプルに記述できるような形にしました。

protected $REQUEST_API_NAME;

このメンバ変数は、API番号です。
API番号については、後の章でご紹介いたしますが、それぞれSQLの文と紐づきます。

前述しましたaddRequestメソッドを使用して別のリクエストを送る場合は、
この変数を変更する必要があります。

public function input($request = null){...}

inputメソッドの第一引数である、$requestはcontrollerより渡された値です。
このメソッド内でInputModelに箱詰めにします。そして、そのModelを戻り値にします。ここでの戻り値は、親クラスであるservice.phpのrequestメソッドに返却されます。

public function output($result = null,$request = null){...}

outputメソッドの第一引数は、一つ前にAPIにリクエストをした結果が帰ってきています。第二引数は、inputの第一引数と共通で、conrollerより渡された値です。

このメソッドでの戻り値がcontrollerに返却されます。

おわりに

サービスクラスからDBまでは複雑ですので、複数章に跨ってしまう形になりました。
一つ前の会員登録画面を作成してみる。PHPでSNSを作成してみる#09という内容までと
この記事では紐付けをしていないためエラーは出ませんが、importしているファイルを記述していなかったりと、中途半端な状態です。ぜひ次のシリーズをご覧ください。

このシリーズでは、フロントからサーバサイドまでの内容をご紹介しています。
幅広くご説明していますので、得意不得意があるかと思います。デザインは苦手だけれど、サーバサイドの堅牢な設計は得意。フロントの移り変わるスピードについて行くのが得意だけど、セキュリティが苦手といったように。

ただ、客観でないとにわかりにくい強みもあります。

リクナビNEXTでは、グッドポイント診断というリクルートが持つ独自のノウハウを活かして開発した、約30分でできる本格診断サービス。があります。

この本格診断サービスは会員登録をすれば、どなたでも診断することができます。
この結果をもとに、自分を見つめ直したり、転職の材料として利用することができます。

ぜひ、グッドポイント診断をしたい方は、リクナビNEXTをご覧ください。

リクナビNEXTの登録はコチラ

以上、ありがとうございました。

 

コメント

スポンサーリンク
スポンサーリンク
タイトルとURLをコピーしました