cheka.jp 超不定期で更新する写真達。お口直しにどうぞ。

Yiiの2.0がどんなもんか見てやろうと思う 02

手を動かしながらなので2回に分かれてしまいました。

調査

フロントとなるindex.phpから見てみます。
設定ファイルを読み込んでアプリケーションを起動する流れは以前のバージョンと同じようです。
php5.4から利用できるようになったメソッドチェーンで起動している辺りが新しさを感じますね。


defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

require(__DIR__ . '/../vendor/autoload.php');
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');

$config = require(__DIR__ . '/../config/web.php');

(new yii\web\Application($config))->run();

次に設定ファイルを確認してみましょう。
こちらもphp5.4っぽいですね。
short syntacxを利用しています。
デフォルトでは目的別に設定ファイルを分けているようです。
以前のバージョンでも利用時は目的別に分けていたので個人的には違和感は無いです。

$params = require(__DIR__ . '/params.php');
$db = require(__DIR__ . '/db.php');

$config = [
    'id' => 'basic',
    'basePath' => dirname(__DIR__),
    'extensions' => require(__DIR__ . '/../vendor/yiisoft/extensions.php'),
#以下、割愛

アプリケーションが起動されるとデフォルトのtriggerが適切なタイミングで起動されていきます。
流れを理解するために順番に見ていきます。
ユーザーのリクエストを受け取ってモデルやビューとの連携を担当するControllerです。
アクセスコントロールやフィルターがコントローラーのメソッドではなく、behaviorsから移譲するように変更されています。
ファクトリー辺りで依存関係を外に追い出す必要がありそうです。

public function behaviors()
{
    return [
        'access' => [
            'class' => AccessControl::className(),
            'only' => ['logout'],
            'rules' => [
                [
                    'actions' => ['logout'],
                    'allow' => true,
                    'roles' => ['@'],
                ],
            ],
        ],
        'verbs' => [
            'class' => VerbFilter::className(),
            'actions' => [
                'logout' => ['post'],
            ],
        ],
    ];
}

アプリケーションの中心になるモデルです。
Yiiはモデル = アクティブレコードの用に扱っていないので今までもファットモデルにならないように簡単に管理できたのですが、
Yii2では更に洗練されています。
個人的にディレクトリ名をmodelsにするのはどうかと思いますが、命名規則は緩いのでどうにかなりそうです。
まだ認証系しか見ていませんが、こちらは外部に移譲して逆に分かりにくくなっていた箇所をインターフェイスの実装に変更して扱いやすくしているようです。

class User extends \yii\base\Object implements \yii\web\IdentityInterface
{

    /**
     * @inheritdoc
     */
    public static function findIdentity($id)
    {
        return isset(self::$users[$id]) ? new static(self::$users[$id]) : null;
    }

    /**
     * @inheritdoc
     */
    public static function findIdentityByAccessToken($token)
    {
        foreach (self::$users as $user) {
            if ($user['accessToken'] === $token) {
                return new static($user);
            }
        }

        return null;
    }

    /**
     * @inheritdoc
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @inheritdoc
     */
    public function getAuthKey()
    {
        return $this->authKey;
    }

    /**
     * @inheritdoc
     */
    public function validateAuthKey($authKey)
    {
        return $this->authKey === $authKey;
    }
}

最後にユーザーとのIFを担当するViewです。
htmlなので余裕です、なんて思っていたら痛い目を見ます。
特に初期はbootstrapのAssetを使っているので、ほぼPHPです。

use yii\helpers\Html;
use yii\bootstrap\Nav;
use yii\bootstrap\NavBar;
use yii\widgets\Breadcrumbs;
use app\assets\AppAsset;

/**
 * @var \yii\web\View $this
 * @var string $content
 */
AppAsset::register($this);
・・省略

ざっくりですが、各レイヤーの依存関係が整理されたように感じます。
php5.4からの流儀になれていないと大変かもしれないですが、だいぶスッキリしています。
なんとなく触って動くYiiから設計をちゃんと考えないとあまり使う必要がないYii2へと進化したような気がしました。

手探り状態なので少しづつですいません、多分まだこのシリーズは続きます。
(効率が悪いのである程度ノウハウが溜まったら書きます)

Add a Comment

メールアドレスが公開されることはありません。