1 关注者

使用 Yii 作为微框架

Yii 可以很容易地在没有基本和高级模板中包含的功能的情况下使用。换句话说,Yii 本身就是一个微框架。不需要使用模板提供的目录结构来使用 Yii。

当您不需要所有预定义的模板代码(如资源或视图)时,这尤其方便。其中一个用例是构建 JSON API。在以下部分将展示如何做到这一点。

安装 Yii

为您的项目文件创建一个目录,并将工作目录更改为该路径。示例中使用的命令基于 Unix,但 Windows 中也存在类似的命令。

mkdir micro-app
cd micro-app

注意:需要一些 Composer 知识才能继续。如果您还不知道如何使用 composer,请花时间阅读 Composer 指南

使用您喜欢的编辑器在 micro-app 目录下创建文件 composer.json 并添加以下内容

{
    "require": {
        "yiisoft/yii2": "~2.0.0"
    },
    "repositories": [
        {
            "type": "composer",
            "url": "https://asset-packagist.org"
        }
    ]
}

保存文件并运行 composer install 命令。这将安装框架及其所有依赖项。

创建项目结构

安装完框架后,是时候为应用程序创建一个 入口点 了。入口点是当您尝试打开应用程序时将执行的第一个文件。出于安全原因,建议将入口点文件放在单独的目录中并将其设为 Web 根目录。

创建一个 web 目录,并在其中放入 index.php,内容如下

<?php

// comment out the following two lines when deployed to production
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.php';
(new yii\web\Application($config))->run();

还要创建一个名为 config.php 的文件,其中将包含所有应用程序配置

<?php
return [
    'id' => 'micro-app',
    // the basePath of the application will be the `micro-app` directory
    'basePath' => __DIR__,
    // this is where the application will find all controllers
    'controllerNamespace' => 'micro\controllers',
    // set an alias to enable autoloading of classes from the 'micro' namespace
    'aliases' => [
        '@micro' => __DIR__,
    ],
];

信息:即使配置可以保存在 index.php 文件中,也建议将其单独保存。这样,它也可以用于控制台应用程序,如下所示。

您的项目现在已准备好进行编码。虽然您可以自行决定项目目录结构,但只要您遵守命名空间即可。

创建第一个控制器

创建一个 controllers 目录,并添加一个文件 SiteController.php,它是默认控制器,它将处理没有路径信息的请求。

<?php

namespace micro\controllers;

use yii\web\Controller;

class SiteController extends Controller
{
    public function actionIndex()
    {
        return 'Hello World!';
    }
}

如果您想为该控制器使用不同的名称,您可以更改它并相应地配置yii\base\Application::$defaultRoute。例如,对于一个DefaultController,它将是'defaultRoute' => 'default/index'

此时,项目结构应如下所示

micro-app/
├── composer.json
├── config.php
├── web/
    └── index.php
└── controllers/
    └── SiteController.php

如果您尚未设置 Web 服务器,您可能需要查看Web 服务器配置文件示例。另一种选择是使用yii serve命令,该命令将使用 PHP 内置的 Web 服务器。您可以从micro-app/目录通过以下方式运行它:

vendor/bin/yii serve --docroot=./web

在浏览器中打开应用程序 URL 现在应该打印“Hello World!”,这是在SiteController::actionIndex()中返回的。

信息:在我们的示例中,我们将默认应用程序命名空间app更改为micro,以演示您不受该名称的约束(如果您认为您受其约束),然后调整了控制器命名空间并设置了正确的别名。

创建 REST API

为了演示我们“微框架”的使用,我们将为帖子创建一个简单的 REST API。

为了使此 API 提供一些数据,我们首先需要一个数据库。将数据库连接配置添加到应用程序配置中

'components' => [
    'db' => [
        'class' => 'yii\db\Connection',
        'dsn' => 'sqlite:@micro/database.sqlite',
    ],
],

信息:为了简单起见,我们在这里使用 SQLite 数据库。有关更多选项,请参阅数据库指南

接下来,我们创建一个数据库迁移来创建帖子表。请确保您有一个单独的配置文件,如上所述,我们需要它来运行下面的控制台命令。运行以下命令将创建一个数据库迁移文件并将迁移应用于数据库

vendor/bin/yii migrate/create --appconfig=config.php create_post_table --fields="title:string,body:text"
vendor/bin/yii migrate/up --appconfig=config.php

创建目录models并在该目录中创建一个Post.php文件。这是模型的代码

<?php

namespace micro\models;

use yii\db\ActiveRecord;

class Post extends ActiveRecord
{ 
    public static function tableName()
    {
        return '{{post}}';
    }
}

信息:此处创建的模型是一个 ActiveRecord 类,它表示post表中的数据。有关更多信息,请参阅活动记录指南

要在我们的 API 上提供帖子,请在controllers中添加PostController

<?php

namespace micro\controllers;

use yii\rest\ActiveController;

class PostController extends ActiveController
{
    public $modelClass = 'micro\models\Post';

    public function behaviors()
    {
        // remove rateLimiter which requires an authenticated user to work
        $behaviors = parent::behaviors();
        unset($behaviors['rateLimiter']);
        return $behaviors;
    }
}

此时,我们的 API 将提供以下 URL

  • /index.php?r=post - 列出所有帖子
  • /index.php?r=post/view&id=1 - 显示 ID 为 1 的帖子
  • /index.php?r=post/create - 创建一个帖子
  • /index.php?r=post/update&id=1 - 更新 ID 为 1 的帖子
  • /index.php?r=post/delete&id=1 - 删除 ID 为 1 的帖子

从这里开始,您可能需要查看以下指南以进一步开发您的应用程序

  • API 目前仅理解 URL 编码的表单数据作为输入,要使其成为真正的 JSON API,您需要配置yii\web\JsonParser
  • 要使 URL 更友好,您需要配置路由。请参阅关于 REST 路由的指南,了解如何执行此操作。
  • 另请参阅展望未来部分以获取更多参考。

发现错别字或您认为此页面需要改进?
在 GitHub 上编辑它 !