PHPの人気フレームワーク「Yii2」の後継として、長らく開発が続けられていた「Yii3」がついにリリース間近となりました。
公式ガイド(https://yii3.netlify.app/guide.html)も整備されつつあり、Yii2ユーザーやこれからPHPフレームワークを選ぼうとしている方にとって注目のタイミングです。
本記事では、Yii3で何が変わったのか、Yii2との違いやディレクトリ構造、実際にデータベースを使ったミニサンプルも交えて、実用的に解説します。
Yii2との主な違い・進化ポイント
項目 | Yii2 | Yii3 |
---|---|---|
リリース形態 | モノリシック構造 | パッケージ分割(コンポーザ管理) |
DI(依存性注入) | 独自コンテナ | PSR-11準拠のDIコンテナ |
イベントシステム | グローバル依存 | より明確なスコープ管理 |
HTTP処理 | Yii独自実装 | PSR-7/PSR-15完全対応 |
テンプレートエンジン | PHPベース(Twig等も可) | Twig対応強化、Templateパッケージ分離 |
ルーティング | 独自実装 | PSR準拠、Middleware対応 |
テスト性 | 構造がやや閉じていた | モジュール化されテストしやすく |
コマンドライン | yiiコマンド一体型 | 独立したパッケージに分離(symfony/console) |
Yii3では、近年のPHP界のトレンドであるPSR準拠を徹底しており、モダンPHPと高い互換性を持ちながら設計されています。
Yii3のディレクトリ構成
Yii3の標準的なアプリケーション構造は以下のようになります。
myapp/
├── config/ ← アプリ設定(DIやルーティングなど)
├── public/ ← Web公開ディレクトリ(index.php)
├── runtime/ ← ログやキャッシュなどの一時ファイル
├── src/ ← アプリケーションの本体コード
│ └── Controller/
│ └── Middleware/
│ └── View/
├── tests/ ← PHPUnitベースのテストコード
├── vendor/ ← Composer依存
└── composer.json
「config」や「src」にアプリロジックが集約されており、明確にMVCが分離されています。
Yii3での簡単なデータベース操作サンプル(MVC構成で作成)
このサンプルでは、次の機能を実装します。
「
post
テーブルの全件を取得して、一覧表示するWebページ」
ディレクトリ構成とファイル配置
まず、以下のようにディレクトリ構成を整理します。Yii3では、src/
がアプリケーションコードの中核です。
myapp/
├── config/
│ └── params.php
│ └── routes.php ← ルーティング設定
│ └── web.php ← DI・アプリ設定
├── src/
│ ├── Controller/
│ │ └── SiteController.php ← コントローラ(C)
│ ├── Model/
│ │ └── Post.php ← モデル(M)
│ ├── View/
│ │ └── site/
│ │ └── index.php ← ビュー(V)
├── public/
│ └── index.php ← フロントコントローラ
├── vendor/ ← Composer依存
└── composer.json
モデル(M) – src/Model/Post.php
ActiveRecordを使用して、post
テーブルに対応したモデルクラスを作成します。
<?php
namespace App\Model;
use Yiisoft\ActiveRecord\ActiveRecord;
final class Post extends ActiveRecord
{
public static function tableName(): string
{
return 'post';
}
}
コントローラ(C) – src/Controller/SiteController.php
データベースからデータを取得し、ビューに渡す役割を担います。
<?php
namespace App\Controller;
use App\Model\Post;
use Yiisoft\Yii\View\ViewRenderer;
use Yiisoft\Router\CurrentRoute;
final class SiteController
{
private ViewRenderer $view;
public function __construct(ViewRenderer $view)
{
$this->view = $view->withControllerName('site');
}
public function index(): string
{
$posts = Post::find()->all(); // すべての投稿を取得
return $this->view->render('index', ['posts' => $posts]);
}
}
ビュー(V) – src/View/site/index.php
データをHTMLとして整形・表示するテンプレートファイルです。
<h1>記事一覧</h1>
<ul>
<?php foreach ($posts as $post): ?>
<li>
<strong><?= htmlspecialchars($post->title) ?></strong><br>
<?= nl2br(htmlspecialchars($post->content)) ?>
</li>
<?php endforeach; ?>
</ul>
ルーティング設定 – config/routes.php
リクエストURLとコントローラの対応関係を定義します。
<?php
use Yiisoft\Router\Route;
use App\Controller\SiteController;
return [
Route::get('/')
->action([SiteController::class, 'index'])
];
アプリ設定 – config/web.php
必要なパッケージや設定を読み込むファイルです。ここでDB接続なども設定します。
<?php
use Yiisoft\Db\Connection\ConnectionInterface;
use Yiisoft\Db\Mysql\Connection;
return [
ConnectionInterface::class => static function () {
return new Connection(
dsn: 'mysql:host=localhost;dbname=yii3_demo',
username: 'root',
password: 'your_password',
);
},
];
フロントコントローラ – public/index.php
アプリケーションのエントリーポイントです。
<?php
declare(strict_types=1);
require dirname(__DIR__) . '/vendor/autoload.php';
use Yiisoft\Yii\Web\Application;
use Yiisoft\Yii\Web\Emitter\SapiEmitter;
$container = require dirname(__DIR__) . '/config/web.php';
$app = new Application($container);
$response = $app->handle(
$_SERVER['REQUEST_METHOD'],
$_SERVER['REQUEST_URI']
);
(new SapiEmitter())->emit($response);
MySQL テーブル定義
CREATE TABLE post (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL
);
実行までの流れまとめ
- MySQLで
post
テーブルを作成する composer install
で依存パッケージを取得php -S localhost:8080 -t public
で開発サーバを起動- ブラウザで
http://localhost:8080
にアクセス
補足:Yii3は「自由度の高いMVC」
Yii3は、Laravelのような「レールに乗った」MVCよりも、より柔軟で明示的なアーキテクチャを採用しています。自分で組み立てる分、学習コストはやや高いかもしれませんが、カスタマイズ性と保守性に優れた構成です。
この構成に沿えば、MVCモデルの設計思想を維持しつつ、Yii3のモダンな利点を活かしたWebアプリを構築できます。
今後はフォームバリデーション、APIレスポンス、ログイン機能など、より実践的なトピックも記事化していきます。
コメント