no message
This commit is contained in:
174
database/employees/EmployeeAccess.php
Normal file
174
database/employees/EmployeeAccess.php
Normal file
@@ -0,0 +1,174 @@
|
||||
<?php
|
||||
|
||||
require_once __DIR__ . '/../abstracts/BaseAccess.php';
|
||||
require_once __DIR__ . '/../interfaces/DataAccessInterface.php';
|
||||
|
||||
/**
|
||||
* 社員情報のCSV操作を実装したクラス
|
||||
* カプセル化: バリデーションやデータ変換ロジックをprivateメソッドで隠蔽
|
||||
*/
|
||||
class EmployeeAccess extends BaseAccess implements DataAccessInterface
|
||||
{
|
||||
/**
|
||||
* 全社員情報を取得する(実装済み)
|
||||
* @return array 社員情報の連想配列の配列
|
||||
* @throws RuntimeException データ読み込みに失敗した場合
|
||||
*/
|
||||
public function getAll()
|
||||
{
|
||||
try {
|
||||
// BaseAccess の readData() を利用してCSVファイルから全データを取得
|
||||
$rows = $this->readData();
|
||||
$employees = array();
|
||||
|
||||
// 各行のデータを 'id', 'name', 'email' の連想配列に変換する
|
||||
foreach ($rows as $row) {
|
||||
$employees[] = $this->convertRowToEmployee($row);
|
||||
}
|
||||
|
||||
return $employees;
|
||||
} catch (Exception $e) {
|
||||
throw new RuntimeException("社員情報の取得に失敗しました: " . $e->getMessage(), 0, $e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 新規登録(INSERT)
|
||||
* @param array $data ['name' => '...', 'email' => '...'] の連想配列
|
||||
* @return bool 登録成功時true
|
||||
* @throws InvalidArgumentException データが不正な場合
|
||||
* @throws RuntimeException データ書き込みに失敗した場合
|
||||
*/
|
||||
public function add($data)
|
||||
{
|
||||
// カプセル化: バリデーションロジックをprivateメソッドで隠蔽
|
||||
$this->validateEmployeeData($data);
|
||||
|
||||
try {
|
||||
// TODO:既存データを取得
|
||||
|
||||
// TODO:新しいIDを生成
|
||||
|
||||
// TODO:CSVファイルに新規データを追加する処理
|
||||
|
||||
// CSVファイルに書き込み
|
||||
return $this->writeData();
|
||||
} catch (Exception $e) {
|
||||
throw new RuntimeException("社員情報の登録に失敗しました: " . $e->getMessage(), 0, $e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新(UPDATE)
|
||||
* @param string|int $id 更新する社員のID
|
||||
* @param array $data ['name' => '...', 'email' => '...'] の連想配列
|
||||
* @return bool 更新成功時true
|
||||
* @throws InvalidArgumentException データが不正な場合
|
||||
* @throws RuntimeException データ書き込みに失敗した場合、またはIDが見つからない場合
|
||||
*/
|
||||
public function update($id, $data)
|
||||
{
|
||||
// カプセル化: バリデーションロジックをprivateメソッドで隠蔽
|
||||
$this->validateEmployeeData($data);
|
||||
|
||||
// IDが指定されていない場合はエラー
|
||||
if (empty($id)) {
|
||||
throw new InvalidArgumentException("IDが指定されていません");
|
||||
}
|
||||
|
||||
try {
|
||||
// CSVファイルから全データを取得
|
||||
$rows = $this->readData();
|
||||
|
||||
// 指定されたIDの社員が見つかったかをフラグで管理
|
||||
$found = false;
|
||||
|
||||
// TODO: foreachを使い、$rows の各行を参照渡しでチェックして、$id と一致する行の 'name' と 'email' を更新する
|
||||
// TODO: 見つかったらフラグを立てる
|
||||
// TODO: 見つからなければエラー
|
||||
|
||||
|
||||
|
||||
|
||||
// 見つからなければエラー
|
||||
if (!$found) {
|
||||
throw new RuntimeException("指定されたIDの社員が見つかりません: " . $id);
|
||||
}
|
||||
|
||||
// CSVファイルに書き込み
|
||||
return $this->writeData($rows);
|
||||
} catch (RuntimeException $e) {
|
||||
throw $e;
|
||||
} catch (Exception $e) {
|
||||
throw new RuntimeException("社員情報の更新に失敗しました: " . $e->getMessage(), 0, $e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 削除(DELETE)
|
||||
* @param string|int $id 削除する社員のID
|
||||
* @return bool 削除成功時true
|
||||
* @throws InvalidArgumentException IDが指定されていない場合
|
||||
* @throws RuntimeException データ書き込みに失敗した場合、またはIDが見つからない場合
|
||||
*/
|
||||
public function delete($id)
|
||||
{
|
||||
// TODO: ゼロから実装しましょう
|
||||
}
|
||||
|
||||
/**
|
||||
* CSV行データを社員情報の連想配列に変換する(カプセル化: privateメソッド)
|
||||
* @param array $row CSVの1行データ
|
||||
* @return array ['id' => ..., 'name' => ..., 'email' => ...] の連想配列
|
||||
*/
|
||||
private function convertRowToEmployee($row)
|
||||
{
|
||||
return array(
|
||||
'id' => isset($row[0]) ? $row[0] : '',
|
||||
'name' => isset($row[1]) ? $row[1] : '',
|
||||
'email' => isset($row[2]) ? $row[2] : ''
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 社員データのバリデーション(カプセル化: privateメソッド)
|
||||
* @param array $data バリデーション対象のデータ
|
||||
* @throws InvalidArgumentException データが不正な場合
|
||||
*/
|
||||
private function validateEmployeeData($data)
|
||||
{
|
||||
if (!is_array($data)) {
|
||||
throw new InvalidArgumentException("データは配列である必要があります");
|
||||
}
|
||||
|
||||
if (!isset($data['name']) || empty(trim($data['name']))) {
|
||||
throw new InvalidArgumentException("名前が指定されていません");
|
||||
}
|
||||
|
||||
if (!isset($data['email']) || empty(trim($data['email']))) {
|
||||
throw new InvalidArgumentException("メールアドレスが指定されていません");
|
||||
}
|
||||
|
||||
// メールアドレスの形式チェック
|
||||
if (!filter_var($data['email'], FILTER_VALIDATE_EMAIL)) {
|
||||
throw new InvalidArgumentException("メールアドレスの形式が正しくありません");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 新しいIDを生成する(カプセル化: privateメソッド)
|
||||
* @param array $rows 既存のデータ行
|
||||
* @return string 生成されたID
|
||||
*/
|
||||
private function generateId($rows)
|
||||
{
|
||||
// 既存のIDの最大値を取得して+1する方式
|
||||
$maxId = 0;
|
||||
foreach ($rows as $row) {
|
||||
if (isset($row[0]) && is_numeric($row[0])) {
|
||||
$maxId = max($maxId, (int)$row[0]);
|
||||
}
|
||||
}
|
||||
return (string)($maxId + 1);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user