Developer

魁!小野の塾 小さな管理機能を作ってみようの巻 第17話
2021.07.22
Lv2

魁!小野の塾 小さな管理機能を作ってみようの巻 第17話

小さな管理機能を作ってみよう 第17話

初心者向け、PHPプログラム構築講座です。
初心者といっても、PHPの勉強を少し行い、LAMP環境が自分で構築でき、少しアプリケーションを作成しているレベルを対象とします。
まったくの初心者の場合は、わからない部分が出てくると思います。
できるだけ細かく説明は入れていきますが、説明がわからない場合は、PHPやMySQLの初心者講座をご覧ください。

対象のスキルレベル

  • LAMP環境の構築
  • PHP言語が読める
  • HTML, CSS, Javascriptが少しわかる
  • Bootstrapのドキュメントをみて、HTMLが書ける
  • Ajax(非同期通信)を利用したことがある
  • SESSIONを利用したことがある

構築環境

  • Windows10
  • XAMPP(PHP7.3.2, MariaDB 10.1.38)

プログラム作成

では、早速PHPのプログラムを作成していきたいと思います。
まずは、Controllerから作成するのですが、その前に、Config、Result、DbConnectionなどを作成していきます。
フォルダーは、「api」にまとめて入れていく予定なので、フォルダーをあらかじめ作成してください。

Config

データベースへの接続設定だけですが、設定ファイルを作成します。
/api/Config.php ファイルを作成します。

/api/Config.php
[php highlight=””] <?php
class Config {
public static function get(){
return [
‘database’ => [
‘host’ => ‘localhost’,
‘user’ => ‘root’,
‘password’ => ”,
‘database’ => ‘backoffice’,
‘charset’ => ‘utf8’
] ];
}
}
?>
[/php]
static method Config::get() を呼び出すと、database をキーに、各データベースのプロパティーが取得できます。

Result

jsonで返却するのですが、返却の型を大枠決めていきます。そのためにクラスを作成しておくと、後で悩まないで済みます。
今回は、関数を指定して、返却型に入れていく予定なので、trait を利用していきます。
継承でも良いのですが、ただ、関数を拡張したい場合は有効ですので、覚えておきましょう。

※参考 トレイト
※参考 【図解】phpのtrait(トレイト)とは何か。シンプルな例で説明します。
※参考 PHPのトレイトが怖くて使えない

/api/Result.php ファイルを作成します。

/api/Result.php
[php highlight=””] <?php
trait Result {
private $result = [
‘status’ => ”, // success | error | fatal
‘errors’ => [] ];

function success(){
$this->result[‘status’] = ‘success’;
}

function error($status, $item, $result){
$this->result[‘status’] = $status;
$this->result[‘errors’][$item] = $result;
}

function setList($key, $record){
$this->result[‘list’][$key] = $record;

}

function result(){
return json_encode($this->result);
}
}
?>
[/php]

Resultでは、responseに返す$result という連想配列をもっており、success(), error(), setList(), result()のそれぞれの関数を提供します。

success()
返却状態を正常と設定する

error($status, $item, $result)
返却状態を正常以外に設定(error|fatal)、どの項目でエラーなのかを知るために、項目名、エラーの情報をそれぞれ設定します。

setList($key, $record)
返却リストを設定します。返却リストは複数指定できるように、キーと値のセットにしました。

result()
返却状態を返す関数です。

DbConnection

データベースへの接続を作成するコネクションクラスを作成します。
接続クラスなので、オープンとクローズを作成しておきます。(開いたら閉じよう!!)
接続する際は、文字コードをセットします。(セットしないと文字化けしますよ!)

/api/DbConnection.php ファイルを作成します。

/api/DbConnection.php
[php highlight=””] <?php
class DbConnection {
private $db;

function getConnection($config){
$this->db = new mysqli(
$config[‘database’][‘host’],
$config[‘database’][‘user’],
$config[‘database’][‘password’],
$config[‘database’][‘database’] );
$this->db->set_charset($config[‘database’][‘charset’]);
return $this->db;
}

function close(){
$this->db->close();
}
}
?>
[/php]

インスタンス変数を所持しているので、static関数になっていないです。

Controller

所持しているリソースができましたので、早速Controllerを作成していきます。

/api/Controller.php ファイルを作成します。

/api/Controller.php
[php highlight=””] <?php
/**
* Controller.php
* 各処理に処理分けします。(process)
* 関数を実行します。(method)
*/
require_once dirname(__FILE__).DIRECTORY_SEPARATOR.’Config.php’;
require_once dirname(__FILE__).DIRECTORY_SEPARATOR.’Result.php’;
require_once dirname(__FILE__).DIRECTORY_SEPARATOR.’DbConnection.php’;

class Controller {
use Result;

public function process($request){
try{
if(is_null($request[‘process’])){
$this->error(‘fatal’, ‘*’, ‘不正な処理が実行されました。(not set process)’);
return $this->result();
}
if(is_null($request[‘method’])){
$this->error(‘fatal’, ‘*’, ‘不正な処理が実行されました。(not set method)’);
return $this->result();
}
$cls = dirname(__FILE__).DIRECTORY_SEPARATOR.$request[‘process’].’.php’;
if(!file_exists($cls)){
$this->error(‘fatal’, ‘*’, ‘不正な処理が実行されました。(not exists process)’);
return $this->result();
}
require_once $cls;
$process = new $request[‘process’]();
if(!method_exists($process, $request[‘method’])){
$this->error(‘fatal’, ‘*’, ‘不正な処理が実行されました。(not exists method)’);
return $this->result();
}
$db = new DbConnection();
$con = $db->getConnection(Config::get());
$method = $request[‘method’];
$result = $process->$method($con, $request);
$db->close();
return $result;
}catch(Exception $e){
$this->error(‘fatal’, ‘*’, $e->getMessage());
}
return $this->result();
}
}
?>
[/php]

proccess 関数のみを定義しています。Resultのtraitは、クラス宣言した下に、use キーワードを利用して指定します。

Contollerの処理の流れを簡単に説明します。

  1. 実行するクラス(ファイル)は、$request[‘process’]に入っている
  2. $request[‘process’]がない場合は、実行できないので、fatalを返します。
  3. 実行する関数は、$request[‘method’]に入っている
  4. $request[‘method’]がない場合は、実行できないので、fatalを返します。
  5. 同一階層に、$request[‘process’]で指定されたphpファイルを読込、ファイルがない場合は、fatalを返します。
  6. $request[‘process’]はクラス名なので、インスタンス化します。
  7. $request[‘method’]はメソッド名なので、$request[‘process’]のクラスにメソッドがない場合は、fatalを返します。
  8. データベースへの接続を作成したら、指定クラスの指定メソッドに引数として、コネクションとリクエストを入れ、実行します。戻り値は$resultへ代入。
  9. 戻ってきた$resultを返却
  10. 例外時は、fatalを返します。

実行するクラス、メソッドは、送信されたパラメータに入っているので、ここから先は自由に作れます。
引数は、データベースへのコネクションと、リクエストになりますので、このルール以外は自由です。

次回からはこれを利用して、プログラムを実際作成していきたいと思います。

魁!小野の塾