Entwicklung der API-Schnittstelle der erweiterten Version von Yii2. Konfiguration, Implementierung und Tests basierend auf der RESTful-Architektur

WBOY
Freigeben: 2016-08-08 09:24:15
Original
1160 Leute haben es durchsucht

Umgebungskonfiguration:

Server-Pseudostatik aktivieren

Dieser Artikel verwendet Apache als Beispiel. Überprüfen Sie httpd.conf im conf-Verzeichnis von Apache und finden Sie den folgenden Code

LoadModule rewrite_module modules/mod_rewrite.so
Nach dem Login kopieren

Entfernen Sie das # davor und fügen Sie es hinzu, wenn es nicht gefunden wird.

Suchen Sie den Code

<Directory "C:/phpStudy/Apache/cgi-bin"><span>    AllowOverride All
    Options None
    </span><span>Require</span><span> all granted
</span></Directory>
Nach dem Login kopieren

Ändern Sie das ursprüngliche AllowOverride None in AllowOverride All.

Erstellen Sie dann eine .htaccess-Datei im Stammverzeichnis der Site mit folgendem Inhalt:

<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>
Nach dem Login kopieren
.htaccess

Die Konfiguration von yii2 wird hier nicht beschrieben. Bei Bedarf können Sie auf das YII2-Praxishandbuch zurückgreifen.

YII2 eigentlicher Vorgang:

1. URL-Regeln und Module konfigurieren

(1) Erstellen Sie einen neuen Modulordner und implementieren Sie die API Schnittstellenversionskontrolle. Zum Beispiel V1-Version, V2-Version ...

Erstellen Sie einen neuen Controller-Ordner (Controller), einen Modellordner (Model) und eine Module.php-Konfigurationsdatei unter dem v1-Ordner.

Module.php-Datei lautet wie folgt:

<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> }
Nach dem Login kopieren

Zeilen 2 und 7 ändern sich mit der Versionserweiterung (v1->v2...).

(2) Konfigurieren Sie die Datei main.php im Konfigurationsordner

<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> ];
Nach dem Login kopieren
main.php

Achten Sie auf die Komponentenkonfiguration der Zeilen 10–17 und 20–44, wenn Sie sie sorgfältig lesen. Ich werde hier nicht besonders auf den Code der Zeilen eingehen 33~35. Was hier dargestellt wird, ist der v1/Site-Controller. Wenn die Anzahl der Schnittstellencontroller zunimmt, kann er direkt zum Array hinzugefügt werden. Ziel dieses Artikels ist es, die Implementierung der RESTful-Architektur schnell zu konfigurieren.

(3) v2 und v3 stellen zukünftige Versionsänderungen dar und die Konfiguration ähnelt dem v1-Ordner.

2. Erstellen Sie ein Modell

Bereiten Sie eine Datentabelle mit dem Namen mxq_guide in der Datenbank vor

<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>
Nach dem Login kopieren

Nach der Erstellung achten Sie bitte darauf, mehrere hinzuzufügen Daten rechtzeitig in die Datenbank übertragen.

Erstellen Sie das guide.php-Modell über Scaffolding Gii (zur Verwendung siehe yii2 maßgeblicher Leitfaden). Achten Sie darauf, die generierte Datei neu zu schreiben und sie in die folgende Form zu ändern, um den RESTful-Anforderungen gerecht zu werden. Wechseln Sie dann vom Ordner „models“ in den Ordner „v1/models“ und achten Sie auf die Änderung des Namespace.

<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> }
Nach dem Login kopieren
guide.php

3. Erstellen Sie einen Controller

<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> }
Nach dem Login kopieren
SiteController.php

Bitte erstellen Sie den Controller im Ordner „modules/controllers“ und achten Sie auf die Änderung des Namespace.

Es ist zu beachten, dass sich der Controller hier von dem normalen Controller unterscheidet, der die ActiveController-Klasse erbt.

Bei den 20 bis 30 Zeilen kommentierten Codes handelt es sich um eine Access_token-Authentifizierung, die auf der RESTful-Architektur basiert. Sie wurde noch nicht getestet und wird später hinzugefügt.

Zu diesem Zeitpunkt sind alle auf YII2 basierenden Konfigurationen im Wesentlichen abgeschlossen. Als Nächstes werden die Tools und Methoden zum Testen der API-Schnittstelle vorgestellt.

RESTful-Testtool PostMAN:

Zunächst stellen wir das Postman-Plugin vor, ein praktisches Plug-in auf Basis von Google Chrome, das Anfragen simuliert . Die konkrete Verwendung umfasst Screenshots während des Tests unten. Bitte entschuldigen Sie etwaige Mängel in der Einleitung. Dies ist meine erste Verwendung.

Es wird empfohlen, die obige APP-Version zu verwenden, um das anschließende Packen der von Ihnen selbst geschriebenen API-Schnittstelle zu erleichtern.

YII2 unterstützt RESTful mit vier Anforderungsmethoden: GET zum Anzeigen von Informationen, POST zum Erstellen von Informationen, PUT zum Aktualisieren von Informationen und DELETE zum Löschen von Informationen.

Im Folgenden werden zunächst die vier Möglichkeiten zur Datenanforderung demonstriert. (Dies ist nur ein Screenshot, um den Effekt zu veranschaulichen. Sie müssen die spezifische Verwendung noch selbst erkunden.)

Was hier gezeigt wird, ist die GET-Methode, die Daten von anfordert Datenbank. Entspricht der Methode „modules/controllers/SiteController/actionIndex“.

Bitte achten Sie auf die URL-Adresse im oberen Feld. Standardmäßig stellt REST mehrere Anfragen an den Controller http://api.mxq.com/v1/sites. Hier sind die Standardregeln von REST .

Die mit * markierten Positionen zeigen normale Ergebnisse. Wenn ein Fehler auftritt, können Sie zu YII Authoritative Guide – Fehler gehen, um die Fehlerursache zu überprüfen.

YII2s ActiveController implementiert standardmäßig den Daten-Paging-Effekt.

Was hier gezeigt wird, sind die Daten der neuen Datenbank, die durch die POST-Methode erstellt wurde. Entspricht der Methode „modules/controllers/SiteController/actionCreate“.

Wenn die Datenüberprüfungsregeln in der Datenschicht der Datenbank geschrieben sind, werden entsprechende Fehler angezeigt, wenn die hier übermittelten Daten nicht den Anforderungen entsprechen. Dies ist auch einer der Vorteile von REST. In der folgenden Situation definiere ich beispielsweise das Flag als int-Typ:

Die nächste Demonstration ist die PUT-Methode zum Aktualisieren der Daten in der Datenbank. Entspricht der Methode „modules/controllers/SiteController/actionUpdate“.

Bitte achten Sie noch einmal auf die Top-URL: http://api.mxq.com/v1/sites/15 Hier stellt 15 die Datenbank-ID dar. Die Daten von 15 bedeutet, die Dateninformationen mit der Datenbank-ID 15 zu aktualisieren. Bitte achten Sie darauf. Wenn RESTful Datenaktualisierungs- und Löschvorgänge verwendet, kann die ID nicht in einem Formular übermittelt werden und muss der URL folgen.

Die nächste Demonstration ist die DELETE-Methode zum Löschen von Daten aus der Datenbank. Entspricht der Methode „modules/controllers/SiteController/actionDelete“.

Wenn der Rückgabewert 1 ist, bedeutet dies, dass der Löschvorgang erfolgreich ausgeführt wurde. Für das spezifische Prinzip beachten Sie bitte sorgfältig die Funktionen im Sitecontroller-Controller.


Das Obige ist eine kurze Einführung, Implementierungsmethode und Testergebnisse von RESTful basierend auf yii2. Sollten Fehler oder Auslassungen vorhanden sein, können Sie diese gerne ergänzen. Nachfolgende Aktualisierungen werden auf dieser Grundlage vorgenommen. Dies ist das erste Mal, dass ich mit dem yii2-Framework und der RESTful-Architektur in Kontakt komme. Bitte verzeihen Sie mir, wenn meine Beschreibung Fehler enthält.

Das Obige stellt die Konfiguration, Implementierung und das Testen der API-Schnittstellenentwicklung der erweiterten Version von Yii2 basierend auf der RESTful-Architektur vor, einschließlich einiger Aspekte davon. Ich hoffe, dass es für Freunde, die an PHP-Tutorials interessiert sind, hilfreich sein wird.

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage