あずきみるくのあずきはニガテ - for Engineer

ひよっこプログラマがやってみたことやハマっちゃったことなど、備忘録的な感じで書いていきます。

cakePHP2 - Model名をDB名と違うのんにしたい!

<環境>
 php5
 cakePHP2.5.8



お久しぶりです。
めっきり「ぴちぱー」のあずきです。
ちょっと暇ができると、すぐ更新したがります。


今日はcakePHPでDB接続する時、DB名を直接Model名に設定しないやり方です。


なんでこんなことがしたいのか。


cakePHPを見てると、DB名とModel名って連動されていることが多いようです。
そういう命名規則?と思ってました。
(実際そうなんだろうけど)

でも、
Model名 = Controller名 とか、対になったりしてるわけで。

ってことは、
ブラウザに表示されるURLにDB名出しちゃうん?

・・・それはやだ!!

って経緯です。


そんな時の対処法です。


結論から言っちゃうと、
テキトーな名前で作ったModelに

public $name = "(使いたいテーブル名)";

って書きゃいいのです。
で、Controllerでは、ここで作ったModelをApp::importして使う。
ポイントはこれだけです。

                                                                                                                                          • -

以下詳細。(読み飛ばし可w)

仮に、テーブル名を「Samples」とします。
※テーブル名は複数形にします。cakeを使っている以上、これは譲れません。


通常のDBアクセス時の記述法は下記の通りです。
※テーブル「Samples」にアクセスして、すべてのカラムを取得します
※画面表示するところは割愛してます


/app/Controller/SamplesController.php

<?php
class SamplesController extends AppController {
 
    function beforeFilter(){
        parent::beforeFilter();
    }
 
    function index(){
        $results = $this->Samples->find('all');
    }
}

/app/Model/Sample.php

<?php
Class Sample extends AppModel{
	public $name = "Sample";
}  


これだと、ブラウザからアクセス?する時のURLは

http://localhost/(プロジェクト名)/Samples

になります。


あらやだ。
テーブル名「Samples」が表に出ちゃってますね。

cakeが分かる方ならば、
サーバに侵入して、「Samples」ってテーブルを見に行ったら、
他の人のこの情報が入ってるんだな、
なんて想像されてしまうかもしれません。
(いや、そんなことしないかもしれないけど)

セキュリティUPには、なるべく脅威を減らしたい。



ってわけで、できれば

http://localhost/(プロジェクト名)/Test

ってURLでアクセスしてほしい、ってなったとします。

この時、先程作った

/app/Controller/SamplesController.php
/app/Model/Sample.php

は使いません。


新しく、以下の2つを作ります。
/app/Controller/TestController.php
/app/Model/Test.php



中身はこんな感じ。

/app/Controller/TestController.php

<?php
App::import('Model', 'Test');
class TestController extends AppController {
 
    function beforeFilter(){
        parent::beforeFilter();
    }
 
    function index(){
    	$Test = new Test;
        $results = $Test->find('all');
    }
}

/app/Model/Test.php

<?php
Class Test extends AppModel{
    public $name = "Sample";
}  


以上です。

ちなみに、Controllerにてimportせずに、以下のように記載すると、、、

<?php
class TestController extends AppController {
 
    function beforeFilter(){
        parent::beforeFilter();
    }
 
    function index(){
        $results = $this->Test->find('all');
    }
}

「Test」というテーブルを探しに行ってました。

public $name = "Sample";

の一文が効かなかったってことです。

new のタイミングで「Sample」テーブルを使う、っていうのを
認識しに行っているのでしょうか?

そこのところはよくわかりません。

とりあえず、importを使うとうまくいきました。



これでDB名を表(URL)に出すことなく、
DBアクセスできるようになりました。


んでも、こんな感じで使っていると、フレームワークのありがたみとか、
よくわかんなくなってきますよね。。。


でも、あずき的には、フレームワークはあくまで
ツールだと思っているので、プロジェクトや、やりたいことに合わせて
機能の取捨選択をしていくのもありなのかな、って思っています。
あんまり自信ないけど。


そんなわけで今後ともよろしくお願いしますm(_ _)m