FuelPHP コントローラから別のコントローラのアクション(メソッド)を実行したい

同一ファイル内のコントローラは簡単。問題は別のファイルのコントローラーを呼び出したいとき

作成日:2018-09-28, 更新日:2019-09-14

同一ファイルの別のコントローラーを呼び出す

「$this->action_〇〇〇()」を使う。

▼「action_list2()」から「action_list()」を呼び出す。

public function action_list() {
  ~ 処理 ~
}

public function action_list2() {
  $this->action_list();
}

別ファイルのコントローラーを呼び出すA

▼HMVC リクエストの「\Request::forge()」を使う

\Request::forge('〇〇〇/〇')->execute();

別ファイルのコントローラーを呼び出すB

別ファイルのコントローラーを呼び出したい経緯

ファイルとディレクトリの絡みがある。

▼下記のようなURLを作りたい
・member/list
・member/detail
・member/detail/edit
・member/detail/confirm

▼コントローラーは下記のようになる
・member.php
・member/detail.php

何が問題なのかっていうと・・・
・「member/list」を修正したいときに「member/list.php」を探す→見つからない→悩む
・「member/detail」を修正したいときに「member.php」を開く→見つからない→悩む
ってコト。

コレがなにげにストレスが溜まる。

ファイルが上記2つしかないならいいんだけど、実際は他にも色々とコンテンツがあるので複数のファイルやディレクトリが出来てしまう。
つまり「member/」ディレクトリに注目しすぎて「member.php」が目に入らないコトが多々あるってこと。

解決案

継承を使う

「ファイルを開いて見つからない」は一緒だけど、継承元が分かるのでストレスが溜まりづらい・・・ハズ。

▼継承を使ったときのファイル構成
・member.php
・member/top.php
・member/detail.php

▼「member.php」の中身

class Controller_member extends Controller_member_top {}

※中身は不要。継承しているという設定だけおいておく。

▼「member/top.php」の中身

class Controller_member_top extends Controller {
  public function action_list() {
    ~ 処理 ~
  }
}

この場合「member/list」でアクセスがあると継承元の「member/top/list」を読みにいってくれる。
ただ「member/top/list」でのアクセスが可能なのでルーティングで拒否っておく。

▼「cinfig/routes.php」の中身に下記を追加

~省略~
'(:segment)/top/(:segment)' => 404の設定にする,
~省略~

※この場合・・・「〇〇〇/top/〇〇〇」というページを作りたくなったときに困る→「特定の組み合わせのときだけ表示」 or 「topを別の文字」にする。