Phalcon3のマイクロアプリケーションでDBアクセスするAPIを作成する
マイクロアプリケーションでデータベースアクセスするとなってくるとややこしくなってくるので、ディレクトリ構成を以下のように簡潔にします。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
C:. | |
├─models | |
└─index.php |
PostgreSQLにempuserテーブルが存在するとします。以下DDL文です。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
create table "public".empuser ( | |
id integer not null | |
, firstname character varying(60) not null | |
, lastname character varying(60) not null | |
, age integer not null | |
, primary key (id) | |
); |
このテーブルに対応するモデルはmodels\Empuser.phpとなります。Empuser.phpは一旦以下のようにします。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace App\Models; | |
use Phalcon\Validation; | |
class Empuser extends \Phalcon\Mvc\Model | |
{ | |
public function validation() | |
{ | |
// とりあえずこれだけ | |
$validator = new Validation(); | |
} | |
} |
Phalconには決まりごとが多く、データベースにアクセスするには、テーブルに対してモデルが1対1で必要です。
オートローダー
Phalcon\Loaderクラスのオートローダー機能によって、モデルファイルがどこにあるかなどの情報を設定しておきます。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// オートローダー設定 | |
$loader = new Phalcon\Loader(); | |
$loader->registerNamespaces( | |
[ | |
'App\Models' => __DIR__ . '/models/', | |
] | |
); | |
$loader->register(); |
DB接続情報
DB接続情報の設定をindex.phpで記述します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// DB接続情報 | |
$container = new Phalcon\Di\FactoryDefault(); | |
$container->set( | |
'db', | |
function () { | |
return new Phalcon\Db\Adapter\Pdo\Postgresql( | |
[ | |
'host' => 'localhost', | |
'port' => 5432, | |
'username' => 'postgres', | |
'password' => 'confrage', | |
'dbname' => 'postgres' | |
] | |
); | |
} | |
); | |
$app = new \Phalcon\Mvc\Micro($container); |
このDB接続情報を\Phalcon\Mvc\Microクラスのパラメータとして渡す必要があります。
PHQLでSELECT文を発行
Phalcon3ではPHQLという構文があるようです。JPQLみたいなものでしょうか。
$phql = 'SELECT * FROM App\Models\Empuser WHERE id = :idxxxx: ';
App\Modelsが名前空間です。Empuser.phpをSQL文中に指定することができます。
:idxxxx:がプレースホルダーです。
modelsManager->executeQueryの第一引数にPHQL、第二引数に置換変数の配列を指定します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$app | |
->modelsManager | |
->executeQuery( | |
'SELECT * FROM App\Models\Empuser WHERE id = :idxxxx: ', | |
[ | |
'idxxxx' => $id | |
]); | |
echo json_encode($records); |
Phalcon\Http\Responseクラスでレスポンス作成
Phalcon\Http\Responseクラスでレスポンスを作成します。
setJsonContentメソッドに配列を渡せばJSON形式で返してくれます。
setStatusCodeメソッドでHTTPステータスを設定することができます。第二引数に成功時のメッセージを指定します。第二引数省略可能です。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$response = new Phalcon\Http\Response(); | |
// $recordがexecuteQueryメソッドの戻り値 | |
if ($record === false) { | |
$response->setStatusCode(404); | |
$response->setJsonContent( | |
[ | |
'status' => 'NOT-FOUND' | |
] | |
); | |
} else { | |
$response->setStatusCode(200); | |
$response->setJsonContent( | |
[ | |
'status' => 'FOUND', | |
'data' => [ | |
'id' => $record[0]->id, | |
'firstname' => $record[0]->firstname, | |
'lastname' => $record[0]->lastname, | |
'age' => $record[0]->age | |
] | |
] | |
); | |
} | |
return $response; |
これでSelect文発行した結果を返すAPI作成完了です。
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント