PHPのフレームワークで人気だったZend Framework。
Zend Framework2あたりから日本語情報がめっきり少なくなって、利用者も減ってきました。
Laravel隆盛の昨今ですが、どうもLaravelは性に合わない…
Zend Framework3の勉強してたら、どうも後継はLaminas(ラミナス)というものになるとのこと。
このサイトはLaminasに関するメモ書きです。
error表示
development.local.php の display_exceptions を true に。
zf1に後継が存在した
PHP8.1等でも動くように、有志がメンテナンスを行っているようです。
github上に複数プロジェクトがあるっぽい。
私が今参照しているのは
https://github.com/Shardj/zf1-future
です。
ブラボー!
viewのheadにcssを追加
application
index.phtml
<?php $this->headLink()->prependStylesheet("/design/base.css");?>
結果
<link href="/design/base.css" media="screen" rel="stylesheet" type="text/css">
viewのheadにtitleタグを追加
layout
layout.phtml
<head>
<meta charset="utf-8">
<?= $this->headTitle() ?>
</head>
application
index.phtml
<?php
$this->headTitle('トップページ');
?>
結果
<head>
<meta charset="utf-8">
<title>トップページ</title>
</head>
routerでurlの一部をパラメーター化
module/Application/config/module.config.php
'router' => [
'routes' => [
'archives' => [
'type' => Segment::class,
'options' => [
'route' => '/news/archive[/:year]',
'defaults' => [
'controller' => ArchiveController::class,
'action' => 'byYear',
'year' => date('Y'),
],
'constraints' => [
'year' => '\d{4}',
],
],
],
],
],
アクション内でのパラメーターの取得方法
$year = $this->params()->fromRoute('year');
https://docs.laminas.dev/tutorials/in-depth-guide/understanding-routing/
itemテーブルの列数を取る
<?php
//autoloadの位置は適宜設定してください
require '../vendor/autoload.php';
use Laminas\Db\Adapter\Adapter;
use Laminas\Db\Sql\Sql;
$db = new Adapter([
'driver' => 'Pgsql', //postgresを使う場合
'host' => 'localhost',
'database' => db名,
'username' => ユーザID,
'password' => パスワード
]);
$sql = new Sql($db);
$sel = $sql->select();
$sel->from('item');
$sel->columns(['num' => new \Laminas\Db\Sql\Expression('COUNT(*)')]);
$stm = $sql->prepareStatementForSqlObject($sel);
echo $stm->execute()->current()['num'];
テーブルの列数を取る例
<?php
//autoloadの位置は適宜修正してください
require '../vendor/autoload.php';
use Laminas\Db\Adapter\Adapter;
$db = new Adapter([
'driver' => 'Pgsql', //postgresを使う場合
'host' => 'localhost',
'database' => db名,
'username' => ユーザID,
'password' => パスワード
]);
$stm = $db->createStatement("SELECT COUNT(*) FROM item");
echo $stm->execute()->current()['count'];
Laminas dbの例(fetchAll的)
日本語記事が意外と見つからないzend db的にはfetchAllに該当するサンプル
use Laminas\Db\Adapter\Adapter;
use Laminas\Db\ResultSet\ResultSet;
use Laminas\Db\Sql\Sql;
$sql = "SELECT * FROM item WHERE id = ?";
$statement = $adapter->createStatement($sql, [$id]);
$result = $statement->execute();
$items = new ResultSet;
$items->initialize($result);
$rows = $items->toArray();
プレイスホルダーも使えます。
$itemsの時点だとオブジェクトです。
toArrayでfetchAllの時のように配列になります。
driverによっては?(ハテナ・クエスチョン)が使えず$1..を使わないといけないかもしれません。
例えばドライバーがPgsqlだと、?が使えません。
zend1の時のように、短く書ける方法をご存じの方はお知らせくださいm(__)m
Laminas dbのトランザクション
Laminas dbの公式のマニュアルにも見つけられないが、トランザクションは以下の方法で行えるようだ。
$adapter->getDriver()->getConnection()->beginTransaction();
$adapter->getDriver()->getConnection()->commit();
$adapter->getDriver()->getConnection()->rollback();
作成された最後のIDを取得することもできるみたい
$adapter->getDriver()->getConnection()->getLastGeneratedValue();
pgSQLを使用している場合は、最後に作成されたIDを返すシーケンスを追加する必要があるらしい。
$adapter()->getDriver()->getConnection()->getLastGeneratedValue(‘hoge_hogeid_seq’);
laminas db insert
insert(挿入)
zend_dbのinsert文は簡単だったなぁ…
use Laminas\Db\Adapter\Adapter;
$db = new Adapter([
'driver' => 'Pdo_Pgsql', //postgresを使う場合
'database' => 'データベース名',
'username' => 'ユーザー名',
'password' => 'ユーザーパスワード',
]);
$sql = new Sql($db);
$insert = $sql->insert("item");
$insert->values([
'name' => 'test',
'kosu' => 1
]);
$statement = $sql->prepareStatementForSqlObject($insert);
$results = $statement->execute();
もっと短く書ける方法をご存じの方はお知らせくださいm(__)m