在第三方程式中使用Yii(Using Yii in third party apps)

之前的遺留程式碼(legacy code)。這問題我們都會遇到, 雖然很痛苦,但是還是得處理。

如果能從之前留下來的網頁程式,逐漸的轉換到Yii,會不會很酷呢?當然。

這邊,我們教你如何一邊用之前的PHP程式,一邊使用Yii 的功能

1. 如何達成

首先,我們需要安裝Yii。因為原本的網頁程式就有自己的routing,所以我們不需要應用程式的樣板。

我們用composer進行安裝,從composer.json開始。可以使用原本的檔案或者直接建立:

{
    "name": "mysoft/mylegacyapp",
    "description": "Legacy app",
    "keywords": ["yii2", "legacy"],
    "homepage": "http://www.example.com/",
    "type": "project",
    "license": "Copyrighted",
    "minimum-stability": "dev",
    "require": {
        "php": ">=5.4.0",
        "yiisoft/yii2": "*"
    },
    "config": {
        "process-timeout": 1800
    },
    "extra": {
        "asset-installer-paths": {
            "npm-asset-library": "vendor/npm",
            "bower-asset-library": "vendor/bower"
        }
    }
}

執行composer install,然後Yii 就會安裝在vendor資料夾內

備註:Yii 程式所在的資料夾,不應該可以從網頁存取。可以放在webroot之外,或者設定存取權限拒絕該資料夾的存取

再來,我們建立一個初始化Yii 所用的程式碼。這邊我們命名為yii_init.php

<?php
// 以下這段在正式網頁應該,應該設置為false
defined('YII_DEBUG') or define('YII_DEBUG', true);

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

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

new yii\web\Application($config);

然後,建立 config檔config/yii.php:

<?php

return [
    'id' => 'myapp',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'components' => [
        'request' => [
            // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
            'cookieValidationKey' => '',
        ],
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'user' => [
            'identityClass' => 'app\models\User',
            'enableAutoLogin' => true,
        ],
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
    ],
    'params' => [],
];

就這樣,現在我們可以使用原來的程式,並一併使用Yii的功能:

// 遺留程式碼

$id = (int)$_GET['id'];


// 新程式碼
require 'path/to/yii_init.php';

$post = \app\models\Post::find()->where['id' => $id];

echo Html::encode($post->title);

2. 運作原理

yii_init.php裡面, 我們包含了Yii框架的類別,以及composer的autoloading。一個重點是,因為要跳過Yii自己的routing跟controller,這邊不像傳統的Yii程式這樣呼叫->run()

results matching ""

    No results matching ""