Yii2

Yii3ついに登場!Yii2からどう変わった?進化点と基本構造、サンプルを一挙解説

この記事は約8分で読めます。
スポンサーリンク

PHPの人気フレームワーク「Yii2」の後継として、長らく開発が続けられていた「Yii3」がついにリリース間近となりました。
公式ガイド(https://yii3.netlify.app/guide.html)も整備されつつあり、Yii2ユーザーやこれからPHPフレームワークを選ぼうとしている方にとって注目のタイミングです。

本記事では、Yii3で何が変わったのか、Yii2との違いやディレクトリ構造、実際にデータベースを使ったミニサンプルも交えて、実用的に解説します。

Guide | Yii3
Various Yii 3.0 related documentation
スポンサーリンク

Yii2との主な違い・進化ポイント

項目Yii2Yii3
リリース形態モノリシック構造パッケージ分割(コンポーザ管理)
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
);

実行までの流れまとめ

  1. MySQLで post テーブルを作成する
  2. composer install で依存パッケージを取得
  3. php -S localhost:8080 -t public で開発サーバを起動
  4. ブラウザで http://localhost:8080 にアクセス

補足:Yii3は「自由度の高いMVC」

Yii3は、Laravelのような「レールに乗った」MVCよりも、より柔軟で明示的なアーキテクチャを採用しています。自分で組み立てる分、学習コストはやや高いかもしれませんが、カスタマイズ性と保守性に優れた構成です。

この構成に沿えば、MVCモデルの設計思想を維持しつつ、Yii3のモダンな利点を活かしたWebアプリを構築できます。
今後はフォームバリデーション、APIレスポンス、ログイン機能など、より実践的なトピックも記事化していきます。

スポンサーリンク
Yii2
フォローしてね
スポンサーリンク

コメント

タイトルとURLをコピーしました