カテゴリー
Laminas

Zend Frameworkの後継

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

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

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

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/

カテゴリー
db

Laminas dbの例(fetchOne的)laminas dbのselectを使う

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'];
カテゴリー
db

Laminas dbの例(fetchOne的)sqlベタ書き

テーブルの列数を取る例

<?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'];
カテゴリー
db

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

カテゴリー
db

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’);

カテゴリー
db

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