Yii2 アドバンストバージョン API インターフェース開発 RESTful アーキテクチャに基づく構成、実装、テスト

WBOY
リリース: 2016-08-08 09:24:15
オリジナル
1154 人が閲覧しました

環境設定:

サーバー擬似静的を有効にする

この記事ではApacheを例として取り上げ、Apacheのconfディレクトリにあるhttpd.confを確認し、次のコードを見つけます

LoadModule rewrite_module modules/mod_rewrite.so
ログイン後にコピー

その前にある#を削除して追加します見つからない場合は。

コードを見つけます

<Directory "C:/phpStudy/Apache/cgi-bin"><span>    AllowOverride All
    Options None
    </span><span>Require</span><span> all granted
</span></Directory>
ログイン後にコピー

元のAllowOverride NoneをAllowOverride Allに変更します。

次に、次の内容の .htaccess ファイルをサイトのルート ディレクトリに作成します。

<IfModule mod_rewrite.c><span>  Options </span>+<span>FollowSymlinks
  RewriteEngine On
  RewriteCond </span>%{REQUEST_FILENAME} !-<span>d
  RewriteCond </span>%{REQUEST_FILENAME} !-<span>f
  RewriteRule </span>. index.<span>php
</span></IfModule>
ログイン後にコピー
.htaccess

yii2 の構成についてはここでは説明しません。必要に応じて、 YII2実践マニュアル .

YII2の実際の操作:

1. URLルールとモジュールを設定します

(1) 新しいモジュールフォルダーを作成し、APIインターフェースのバージョン管理を実装します。例えば、V1バージョン、V2バージョン...

v1フォルダーの下に新しいcontrollersフォルダー(コントローラー)、モデルフォルダー(モデル)、Module.php設定ファイルを作成します。

Module.php ファイルは次のとおりです:

<span> 1</span> <?<span>php
</span><span> 2</span><span>namespace api\modules\v1;
</span><span> 3</span><span> 4</span><span>class</span> Module <span>extends</span><span> \yii\base\Module
</span><span> 5</span><span>{
</span><span> 6</span><span> 7</span><span>public</span><span>$controllerNamespace</span> = 'api\modules\v1\controllers'<span>;
</span><span> 8</span><span> 9</span><span>public</span><span>function</span><span> init()
</span><span>10</span><span>    {
</span><span>11</span>         parent::<span>init();
</span><span>12</span><span>    }
</span><span>13</span> }
ログイン後にコピー

2 行目と 7 行目はバージョン拡張 (v1->v2...) に応じて変更されます。

(2) configフォルダー配下のmain.phpファイルを設定します

<span> 1</span> <?<span>php
</span><span> 2</span><span>$params</span> = <span>array_merge</span>(<span>require</span> (__DIR__ . '/../../common/config/params.php'), <span>require</span> (__DIR__ . '/../../common/config/params-local.php'), <span>require</span> (__DIR__ . '/params.php'), <span>require</span> (__DIR__ . '/params-local.php'<span>));
</span><span> 3</span><span> 4</span><span>return</span><span> [
</span><span> 5</span>     'id' => 'app-api',
<span> 6</span>     'basePath' => <span>dirname</span>(__DIR__),
<span> 7</span>     'bootstrap' =><span> [
</span><span> 8</span>         'log'
<span> 9</span>     ],
<span>10</span>     'modules' =><span> [
</span><span>11</span>         'v1' =><span> [
</span><span>12</span>             'class' => 'api\modules\v1\Module'
<span>13</span>         ],
<span>14</span>         'v2' =><span> [
</span><span>15</span>             'class' => 'api\modules\v2\Module'
<span>16</span><span>        ]
</span><span>17</span>     ],
<span>18</span>     'controllerNamespace' => 'api\controllers',
<span>19</span>     'components' =><span> [
</span><span>20</span>         'user' =><span> [
</span><span>21</span>             'identityClass' => 'common\models\User',
<span>22</span>             'enableAutoLogin' => <span>false</span>,
<span>23</span>             'enableSession' => <span>false</span>,
<span>24</span>             'loginUrl' => <span>null</span><span>25</span>         ],
<span>26</span>         'urlManager' =><span> [
</span><span>27</span>             'enablePrettyUrl' => <span>true</span>, <span>//</span><span> 启用美化URL</span><span>28</span>             'enableStrictParsing' => <span>true</span>, <span>//</span><span> 是否执行严格的url解析</span><span>29</span>             'showScriptName' => <span>false</span>, <span>//</span><span> 在URL路径中是否显示脚本入口文件</span><span>30</span>             'rules' =><span> [
</span><span>31</span><span>                [
</span><span>32</span>                     'class' => 'yii\rest\UrlRule',
<span>33</span>                     'controller' =><span> [
</span><span>34</span>                         'v1/site'
<span>35</span><span>                    ]
</span><span>36</span>                 ],
<span>37</span><span>                [
</span><span>38</span>                     'class' => 'yii\rest\UrlRule',
<span>39</span>                     'controller' =><span> [
</span><span>40</span>                         'v2/site'
<span>41</span><span>                    ]
</span><span>42</span><span>                ]
</span><span>43</span><span>            ]
</span><span>44</span>         ],
<span>45</span>         'log' =><span> [
</span><span>46</span>             'traceLevel' => YII_DEBUG ? 3 : 0,
<span>47</span>             'targets' =><span> [
</span><span>48</span><span>                [
</span><span>49</span>                     'class' => 'yii\log\FileTarget',
<span>50</span>                     'levels' =><span> [
</span><span>51</span>                         'error',
<span>52</span>                         'warning'
<span>53</span><span>                    ]
</span><span>54</span><span>                ]
</span><span>55</span><span>            ]
</span><span>56</span>         ],
<span>57</span>         'errorHandler' =><span> [
</span><span>58</span>             'errorAction' => 'site/error'
<span>59</span><span>        ]
</span><span>60</span>     ],
<span>61</span>     'params' => <span>$params</span><span>62</span> ];
ログイン後にコピー
main.php

10〜17行目と20〜44行目のコンポーネント構成に注目してください。注意して読んでください。ここでは詳細は説明しません。コードの 33 行目から 35 行目に特に注意してください。これは、インターフェイス コントローラーの数が増加するにつれて、それらを直接追加できます。配列に。この記事では、RESTful アーキテクチャの実装を迅速に構成することを目的としています。

(3) v2 と v3 は将来のバージョン変更を表しており、構成は v1 フォルダーと同様です。

2. モデルを作成します

データベースに mxq_guide という名前のデータテーブルを準備します

<span>CREATE TABLE `mxq_guide` (
  `id` int(</span>11) NOT <span>NULL</span> AUTO_INCREMENT,<span>  `imgurl` varchar(</span>255) <span>DEFAULT</span><span>NULL </span>COMMENT '图片路径'<span>,</span><span><br>  `status` int(</span><span>11) </span><span>DEFAULT</span><span>NULL</span><span> COMMENT '1启用 0禁用',<br></span><span>  `flag` int(</span><span>11) </span><span>DEFAULT</span><span>NULL</span><span> COMMENT '1安卓 2苹果',</span><span><br>   PRIMARY </span><span>KEY</span><span> (`id`) <br>   ) ENGINE</span><span>=MyISAM AUTO_INCREMENT=24 </span><span>DEFAULT</span><span> CHARSET=utf8 COMMENT='APP导航图';</span>
ログイン後にコピー

作成後、時間内にいくつかのデータ情報をデータベースに追加するように注意してください。

スキャフォールディング gii を使用して guide.php モデルを作成します (使用手順については、yii2 権威ガイドを参照してください)。生成されたファイルの書き換えに注意し、RESTful のニーズを満たすように次の形式に変更します。次に、models フォルダーから v1/models フォルダーに移動し、名前空間の変更に注意してください。

<span> 1</span> <?<span>php
</span><span> 2</span><span>namespace api\modules\v1\models;
</span><span> 3</span><span> 4</span><span>use</span><span> Yii;
</span><span> 5</span><span>use</span><span> yii\db\ActiveRecord;
</span><span> 6</span><span>use</span><span> yii\web\IdentityInterface;
</span><span> 7</span><span> 8</span><span>/*</span><span>*
</span><span> 9</span><span> * This is the model class for table "{{%guide}}".
</span><span>10</span><span> *
</span><span>11</span><span> * @property integer $id
</span><span>12</span><span> * @property string $imgurl
</span><span>13</span><span> * @property integer $status
</span><span>14</span><span> * @property integer $flag
</span><span>15</span><span>*/</span><span>16</span><span>class</span> Guide <span>extends</span> ActiveRecord <span>implements</span><span> IdentityInterface
</span><span>17</span><span>{
</span><span>18</span><span>19</span><span>public</span><span>static</span><span>function</span> findIdentityByAccessToken(<span>$token</span>, <span>$type</span> = <span>null</span><span>)
</span><span>20</span><span>    {
</span><span>21</span><span>return</span><span>static</span>::<span>findOne([
</span><span>22</span>             'access_token' => <span>$token</span><span>23</span><span>        ]);
</span><span>24</span><span>    }
</span><span>25</span><span>26</span><span>public</span><span>function</span><span> getId()
</span><span>27</span><span>    {
</span><span>28</span><span>return</span><span>$this</span>-><span>id;
</span><span>29</span><span>    }
</span><span>30</span><span>31</span><span>public</span><span>function</span><span> getAuthKey()
</span><span>32</span><span>    {
</span><span>33</span><span>return</span><span>$this</span>-><span>authKey;
</span><span>34</span><span>    }
</span><span>35</span><span>36</span><span>public</span><span>function</span> validateAuthKey(<span>$authKey</span><span>)
</span><span>37</span><span>    {
</span><span>38</span><span>return</span><span>$this</span>->authKey === <span>$authKey</span><span>;
</span><span>39</span><span>    }
</span><span>40</span><span>41</span><span>public</span><span>static</span><span>function</span> findIdentity(<span>$id</span><span>)
</span><span>42</span><span>    {
</span><span>43</span><span>return</span><span>static</span>::findOne(<span>$id</span><span>);
</span><span>44</span><span>    }
</span><span>45</span><span>46</span><span>public</span><span>static</span><span>function</span><span> tableName()
</span><span>47</span><span>    {
</span><span>48</span><span>return</span> '{{%guide}}'<span>;
</span><span>49</span><span>    }
</span><span>50</span><span>51</span><span>public</span><span>function</span><span> rules()
</span><span>52</span><span>    {
</span><span>53</span><span>return</span><span> [
</span><span>54</span><span>            [
</span><span>55</span><span>                [
</span><span>56</span>                     'imgurl',
<span>57</span>                     'status',
<span>58</span>                     'flag'
<span>59</span>                 ],
<span>60</span>                 'required'
<span>61</span>             ],
<span>62</span><span>            [
</span><span>63</span><span>                [
</span><span>64</span>                     'status',
<span>65</span>                     'flag'
<span>66</span>                 ],
<span>67</span>                 'integer'
<span>68</span>             ],
<span>69</span><span>            [
</span><span>70</span><span>                [
</span><span>71</span>                     'imgurl'
<span>72</span>                 ],
<span>73</span>                 'string',
<span>74</span>                 'max' => 255
<span>75</span><span>            ]
</span><span>76</span><span>        ];
</span><span>77</span><span>    }
</span><span>78</span><span>79</span><span>public</span><span>function</span><span> attributeLabels()
</span><span>80</span><span>    {
</span><span>81</span><span>return</span><span> [
</span><span>82</span>             'id' => Yii::t('app', 'ID'),
<span>83</span>             'imgurl' => Yii::t('app', 'imgurl'),
<span>84</span>             'status' => Yii::t('app', 'status'),
<span>85</span>             'flag' => Yii::t('app', 'flag'<span>)
</span><span>86</span><span>        ];
</span><span>87</span><span>    }
</span><span>88</span> }
ログイン後にコピー
guide.php

3.コントローラーを作成します

<span> 1</span> <?<span>php
</span><span> 2</span><span>namespace api\modules\v1\controllers;
</span><span> 3</span><span> 4</span><span>use</span><span> Yii;
</span><span> 5</span><span>use</span><span> yii\rest\ActiveController;
</span><span> 6</span><span>use</span><span> yii\filters\auth\CompositeAuth;
</span><span> 7</span><span>use</span><span> yii\filters\auth\QueryParamAuth;
</span><span> 8</span><span>use</span><span> yii\data\ActiveDataProvider;
</span><span> 9</span><span>10</span><span>class</span> SiteController <span>extends</span><span> ActiveController
</span><span>11</span><span>{
</span><span>12</span><span>13</span><span>public</span><span>$modelClass</span> = 'api\modules\v1\models\guide'<span>;
</span><span>14</span><span>15</span><span>public</span><span>$serializer</span> =<span> [
</span><span>16</span>         'class' => 'yii\rest\Serializer',
<span>17</span>         'collectionEnvelope' => 'items'
<span>18</span><span>    ];
</span><span>19</span><span>20</span><span>//</span><span> public function behaviors()
</span><span>21</span><span>    // {
</span><span>22</span><span>    // $behaviors = parent::behaviors();
</span><span>23</span><span>    // $behaviors['authenticator'] = [
</span><span>24</span><span>    // 'class' => CompositeAuth::className(),
</span><span>25</span><span>    // 'authMethods' => [
</span><span>26</span><span>    // QueryParamAuth::className()
</span><span>27</span><span>    // ]
</span><span>28</span><span>    // ];
</span><span>29</span><span>    // return $behaviors;
</span><span>30</span><span>    // }</span><span>31</span><span>public</span><span>function</span><span> actions()
</span><span>32</span><span>    {
</span><span>33</span><span>$actions</span> = parent::<span>actions();
</span><span>34</span><span>//</span><span> 注销系统自带的实现方法</span><span>35</span><span>unset</span>(<span>$actions</span>['index'], <span>$actions</span>['update'], <span>$actions</span>['create'], <span>$actions</span>['delete'], <span>$actions</span>['view'<span>]);
</span><span>36</span><span>return</span><span>$actions</span><span>;
</span><span>37</span><span>    }
</span><span>38</span><span>39</span><span>public</span><span>function</span><span> actionIndex()
</span><span>40</span><span>    {
</span><span>41</span><span>$modelClass</span> = <span>$this</span>-><span>modelClass;
</span><span>42</span><span>$query</span> = <span>$modelClass</span>::<span>find();
</span><span>43</span><span>return</span><span>new</span><span> ActiveDataProvider([
</span><span>44</span>             'query' => <span>$query</span><span>45</span><span>        ]);
</span><span>46</span><span>    }
</span><span>47</span><span>48</span><span>public</span><span>function</span><span> actionCreate()
</span><span>49</span><span>    {
</span><span>50</span><span>$model</span> = <span>new</span><span>$this</span>-><span>modelClass();
</span><span>51</span><span>//</span><span> $model->load(Yii::$app->getRequest()
</span><span>52</span><span>        // ->getBodyParams(), '');</span><span>53</span><span>$model</span>->attributes = Yii::<span>$app</span>->request-><span>post();
</span><span>54</span><span>if</span> (! <span>$model</span>-><span>save()) {
</span><span>55</span><span>return</span><span>array_values</span>(<span>$model</span>->getFirstErrors())[0<span>];
</span><span>56</span><span>        }
</span><span>57</span><span>return</span><span>$model</span><span>;
</span><span>58</span><span>    }
</span><span>59</span><span>60</span><span>public</span><span>function</span> actionUpdate(<span>$id</span><span>)
</span><span>61</span><span>    {
</span><span>62</span><span>$model</span> = <span>$this</span>->findModel(<span>$id</span><span>);
</span><span>63</span><span>$model</span>->attributes = Yii::<span>$app</span>->request-><span>post();
</span><span>64</span><span>if</span> (! <span>$model</span>-><span>save()) {
</span><span>65</span><span>return</span><span>array_values</span>(<span>$model</span>->getFirstErrors())[0<span>];
</span><span>66</span><span>        }
</span><span>67</span><span>return</span><span>$model</span><span>;
</span><span>68</span><span>    }
</span><span>69</span><span>70</span><span>public</span><span>function</span> actionDelete(<span>$id</span><span>)
</span><span>71</span><span>    {
</span><span>72</span><span>return</span><span>$this</span>->findModel(<span>$id</span>)-><span>delete();
</span><span>73</span><span>    }
</span><span>74</span><span>75</span><span>public</span><span>function</span> actionView(<span>$id</span><span>)
</span><span>76</span><span>    {
</span><span>77</span><span>return</span><span>$this</span>->findModel(<span>$id</span><span>);
</span><span>78</span><span>    }
</span><span>79</span><span>80</span><span>protected</span><span>function</span> findModel(<span>$id</span><span>)
</span><span>81</span><span>    {
</span><span>82</span><span>$modelClass</span> = <span>$this</span>-><span>modelClass;
</span><span>83</span><span>if</span> ((<span>$model</span> = <span>$modelClass</span>::findOne(<span>$id</span>)) !== <span>null</span><span>) {
</span><span>84</span><span>return</span><span>$model</span><span>;
</span><span>85</span>         } <span>else</span><span> {
</span><span>86</span><span>throw</span><span>new</span> NotFoundHttpException('The requested page does not exist.'<span>);
</span><span>87</span><span>        }
</span><span>88</span><span>    }
</span><span>89</span><span>90</span><span>public</span><span>function</span> checkAccess(<span>$action</span>, <span>$model</span> = <span>null</span>, <span>$params</span> =<span> [])
</span><span>91</span><span>    {
</span><span>92</span><span>//</span><span> 检查用户能否访问 $action 和 $model
</span><span>93</span><span>        // 访问被拒绝应抛出ForbiddenHttpException
</span><span>94</span><span>        // var_dump($params);exit;</span><span>95</span><span>    }
</span><span>96</span> }
ログイン後にコピー
SiteController.php

modules/controllersフォルダーの下にコントローラーを作成し、名前空間の変更に注意してくださいs 。

ここでのコントローラーは、Controllerを継承する通常のコントローラーとは異なり、ActiveControllerクラスを継承する必要があることに注意してください。

20~30 行のコメント付きコードは、RESTful アーキテクチャの access_token 認証に基づいています。まだテストされていないため、後で追加されます。

この時点で、YII2 に基づくすべての設定は基本的に完了しました。次に、API インターフェイスのテスト ツールとメソッドを紹介します。

RESTful テストツール PostMAN:

まず、リクエストをシミュレートする Google Chrome ベースの実用的なプラグインである postman プラグインを紹介します。具体的な使用方法には、次のテスト プロセス中のスクリーンショットが含まれます。初めて使用するので、不備があることをご容赦ください。

以降の自分で作成した API インターフェースのパッケージ化を容易にするために、上記の APP バージョンを使用することをお勧めします。 以下は Web バージョンです。

YII2 は、情報を表示する GET、情報を作成する POST、情報を更新する PUT、情報を削除する DELETE の 4 つの RESTful リクエスト メソッドをサポートします。

以下は、データをリクエストする 4 つの方法のデモです。 (これは、効果を示すための単なるスクリーンショットです。具体的な使用方法については、自分で調べる必要があります。)

ここで実証されているのは、データベースからデータをリクエストする GET メソッドです。 modules/controllers/SiteController/actionIndex メソッドに対応します。

デフォルトでは、REST はコントローラー http://api.mxq.com/v1/sites に複数のリクエストを送信します。REST のデフォルトのルールは次のとおりです。

* でマークされた位置は正常な結果を示します。エラーが発生した場合は、YII 権威ガイド - エラー に移動してエラーの原因を確認できます。

YII2 の ActiveController はデフォルトでデータ ページング効果を実装します。

ここで示されているのは、POST メソッドによって作成された新しいデータベースのデータです。 modules/controllers/SiteController/actionCreate メソッドに相当します。

データベースのデータ層にデータ検証ルールを記述すると、ここで送信されたデータが要件を満たしていない場合、対応するエラーが表示されます。これも REST の利点の 1 つです。たとえば、次の状況では、フラグを int 型として定義します。

次のデモは、データベース内のデータを更新する PUT メソッドです。 modules/controllers/SiteController/actionUpdate メソッドに対応します。

もう一度トップのURLに注目してください: http://api.mxq.com/v1/sites/15 ここで、15はデータベースID 15のデータを表しており、データベースIDを15のデータ情報に更新することを意味します。注目してください。 RESTful がデータの更新および削除操作を使用する場合、ID はフォームの形式で送信できず、URL に従う必要があります。

次のデモは、データベースからデータを削除する DELETE メソッドです。 modules/controllers/SiteController/actionDelete メソッドに対応します。

戻り値が1の場合、削除操作が正常に実行されたことを意味します。具体的な原理については、sitecontroller コントローラーの機能をよく観察してください。


上記は、yii2をベースにしたRESTfulの簡単な紹介、実装方法、テスト結果です。間違いや漏れがございましたら、ご自由に追加してください。今後の更新はこれに基づいて行われます。 yii2 フレームワークと RESTful アーキテクチャに触れるのは初めてです。説明に間違いがある場合はご容赦ください。

上記では、RESTful アーキテクチャに基づいた Yii2 アドバンスト バージョンの API インターフェイス開発の構成、実装、テストについて、その側面も含めて紹介しました。PHP チュートリアルに興味のある友人の参考になれば幸いです。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート