【パーフェクトPHP FW拡張】$_content以外の場所にDBからのデータを用いる

既に拡張しすぎていてもはやシリーズ化などできなそうな話題。
以前も書いたけど、僕は「パーフェクトPHP」のフレームワークを自社サイトの管理ページとして使っている。このフレームワークは学習用というのもあり機能はそんなに多くない。なのでできないことが出てくると、ちょくちょく拡張させていく必要がある。
今回やりたいこと
今回は「$_contentの外にあるサイドメニューの項目をDBの値に関連付け、自動的に増減させる」ということを目標に拡張した。このフレームワークを使ってない人には仕様の違いなどの関係上役に立たないことも多いだろうので、興味がある人だけ見ていって下さい。ちなみに僕はPHP歴、プログラム歴が浅いので変なことを書く可能性も多くある。ご注意。
方法
1、Functions.phpを作る
modelsフォルダ内にFunctions.phpというファイルを作る。これが今回の情報を出すクラスになる。名前はわかりやすければなんでもいい。中身はとりあえずこんな感じ。
<?php
class Functions
{
protected $db_manager;
public function __construct( $db_manager )
{
$this->db_manager = $db_manager;
}
public function get_nav_info(){
$nav_info;
$nav_info['fruit'] = $this->db_manager->get('Fruit')->fetchAllFruit();
return $nav_info;
}
}
DB接続を行うので、このクラスを呼び出す時にdbManagerのインスタンスを渡すようにする。そしてメソッド内で使うためにプロパティに格納しておく。
今回はget_nav_info()ということで、データベースからフルーツ一覧を取得し$nav_info['fruit']に入れて返すメソッドを作った。他にも欲しいデータが増えた時に対応できるように、配列として渡している。
2、Application.phpで呼び出す
Application.php内にFunctions.phpを保管するプロパティを作る。その後initialize()から呼び出す。
protected $functions;
protected function initialize()
{
$this->request = new Request();
$this->response = new Response();
$this->session = new Session();
$this->db_manager = new DbManager();
$this->functions = new Functions( $this->db_manager ); // ←追加した
$this->router = new Router($this->registerRoutes());
}
また、他のインスタンスと同じように、Functionsを返すだけのメソッドを作る。
public function getFunctions()
{
return $this->functions;
}
これでApplication.phpからController.phpに渡せるようになったので、受け取る側のController.phpを作っていく。
2、Controller.phpで呼び出す
コンストラクタでApplication.phpのgetFunctions()メソッドからFunctionsオブジェクトを受け取り、プロパティに格納。
protected $functions;
$this->functions = $application->getFunctions();
これでContrillerでFunctionsオブジェクトが使えるようになったので、後はrender()メソッド内で呼び出せば、晴れて変数が使えるように。
$defaults = array(
'request' => $this->request,
'base_url' => $this->request->getBaseUrl(),
'session' => $this->session,
'nav_info' => $this->functions->get_nav_info(), // ←追加した
);
あとは表示側で使うだけ!
僕はサイドメニューはlayout.phpから切り分けて使っているので、そこで呼び出す。どこからでも呼び出せるので安心。
<?php foreach( $nav_info['fruit'] as $val ): ?> <a href="<?php echo $base_url; ?>/fruit/detail/<?php echo $val['id'] ?>"><li><?php echo $val['title'] ?></li></a> <?php endforeach; ?>
これでレコードの数だけループされて、idとtitleを使ってリンクと項目名を表示できた。
ちゃんと表示されてる。
でも
効率が悪いかもしれないので、何か言いたいところなどがあれば指摘してもらえると幸いです。
技術評論社
売り上げランキング: 36,605

