前提
「おすすめの本にタグをつけて投稿する掲示板」を作成しています。
現状は400個ほどの関数のみで構成されているのですが、クラス化に挑戦することにしました。
どの関数をクラス化するのが適切かが分からないので、ひとまず「投稿コンテンツ(本やタグ)にまつわる処理」をクラス化していこうと考えました。
発生している問題
しかし、本テーブルへのINSERTの過程で、タグテーブルとリレーションテーブルもINSERTするのですが、
クラス化にあたって リレーションテーブルへの保存処理を class Book
の中に書くか class Tag
の中に書くか、分からず躓いております。
(リレーションテーブルへの保存処理は、関数 insert_my_relations
が担っています。)
知りたいこと
どちらが良いのか、または別の書き方が良いのかを知りたいです。アドバイス頂戴できましたら幸いです。
ご回答を頂戴する身として大変僭越ではございますが、「その関数群(該当のソースコード)なら、このようにクラス化したらいいだろう」といった内容でご教示頂くと大変ありがたく思います。
該当のソースコード
現状の関数はこのようになっています。(エラー処理とセキュリティ面は無視してください。)
php
1// パスワードを確認 2function check_thread_password( $thread_id, $password ){ 3 return ['status'=>'ok']; 4} 5 6// 本テーブルを INSERT 7function insert_my_books( $book_data ){ 8 return ['status'=>'ok','book_id'=>1]; 9} 10 11// タグテーブルを INSERT 12function insert_my_tags( $tag_data ){ 13 return ['status'=>'ok','tag_ids'=>[1,2]]; 14} 15 16// リレーションテーブルを INSERT 17function insert_my_relations( $book_id, $tag_ids ){ 18 return ['status'=>'ok']; 19} 20 21// おすすめの本を投稿 22function ajax_post_recommend_book(){ 23 // post された値 24 $password = $_POST['password']; 25 $book_data = $_POST['book_data']; 26 $thread_id = $_POST['thread_id']; 27 28 // パスワードを確認 29 $checked = check_thread_password( $thread_id, $password ); 30 if ( $checked['status'] === 'ok' ) { 31 // テーブルロックして INSERT 32 $inserted = insert_my_books_with_table_lock( $book_data ); 33 if ( $inserted['status'] === 'ok' ) { 34 $book_id = $inserted['book_id']; 35 } 36 } 37 38 echo ['status'=>'ok','book_id'=>$book_id]; 39} 40 41// テーブルロックして INSERT 42function insert_my_books_with_table_lock( $book_data ){ 43 44 $pdo = new PDO(); 45 $pdo->query("LOCK TABLES my_books WRITE, my_tags WRITE, my_relations WRITE"); 46 47 // book テーブルを INSERT 48 $inserted = insert_my_books( $book_data ); 49 if ( $inserted['status'] === 'ok' ) { 50 $book_id = $inserted['book_id']; 51 52 // tag テーブルを INSERT 53 $inserted = insert_my_tags( $book_data['tag_data'] ); 54 if ( $inserted['status'] === 'ok' ) { 55 $tag_ids = $inserted['tag_ids']; 56 57 // リレーションテーブルを INSERT 58 insert_my_relations( $book_id, $tag_ids ); 59 } 60 61 } 62 63 $pdo->query("COMMIT"); 64 return ['status'=>'ok','book_id'=>$book_id]; 65} 66
試したこと
上記の関数群について、class Book
と class Tag
に分けて次のようにクラス化してみました。
ここで上述の問題が生じまして、つまり、関数 insert_my_relations
を下記は class Book
に入れていますが、これを class Tag
に入れた方がいいのかで悩んでいる次第です。
もしくは何か全く別の書き方で適切なクラス化の方向性があるでしょうか…
php
1// パスワードを確認 2function check_thread_password( $thread_id, $password ){ 3 return ['status'=>'ok']; 4} 5 6// タグにまつわる処理 7class Tag{ 8 9 // タグテーブルを INSERT 10 public function insert_my_tags( $tag_data ){ 11 return ['status'=>'ok','tag_ids'=>[1,2]]; 12 } 13 14} 15 16// 本にまつわる処理 17class Book{ 18 19 // 本テーブルを INSERT 20 public function insert_my_books( $book_data ){ 21 return ['status'=>'ok','book_id'=>1]; 22 } 23 24 // リレーションテーブルを INSERT 25 public function insert_my_relations( $book_id, $tag_ids ){ 26 return ['status'=>'ok']; 27 } 28 29 // テーブルロックして INSERT 30 public function insert_my_books_with_table_lock( $book_data ){ 31 32 $pdo = new PDO(); 33 $pdo->query("LOCK TABLES my_books WRITE, my_tags WRITE, my_relations WRITE"); 34 35 // book テーブルを INSERT 36 $inserted = $this->insert_my_books( $book_data ); 37 if ( $inserted['status'] === 'ok' ) { 38 $book_id = $inserted['book_id']; 39 40 // tag テーブルを INSERT 41 $tag = new Tag(); 42 $inserted = $tag->insert_my_tags( $book_data['tag_data'] ); 43 if ( $inserted['status'] === 'ok' ) { 44 $tag_ids = $inserted['tag_ids']; 45 46 // リレーションテーブルを INSERT 47 $this->insert_my_relations( $book_id, $tag_ids ); 48 } 49 50 } 51 52 $pdo->query("COMMIT"); 53 return ['status'=>'ok','book_id'=>$book_id]; 54 } 55 56} 57 58// おすすめの本を投稿 59function ajax_post_recommend_book(){ 60 // post された値 61 $password = $_POST['password']; 62 $book_data = $_POST['book_data']; 63 $thread_id = $_POST['thread_id']; 64 65 // パスワードを確認 66 $checked = check_thread_password( $thread_id, $password ); 67 if ( $checked['status'] === 'ok' ) { 68 // テーブルロックして INSERT 69 $book = new Book(); 70 $inserted = $book->insert_my_books_with_table_lock( $book_data ); 71 if ( $inserted['status'] === 'ok' ) { 72 $book_id = $inserted['book_id']; 73 } 74 } 75 76 echo ['status'=>'ok','book_id'=>$book_id]; 77}
補足情報(FW/ツールのバージョンなど)
PHPは7.2ですが、8.0にアプデ可能です。
あなたの回答
tips
プレビュー