環境設定:
サーバー擬似静的を有効にする
この記事では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>
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> ];
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> }
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> }
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 チュートリアルに興味のある友人の参考になれば幸いです。