환경 구성:
서버 의사 정적 활성화
이 문서에서는 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 폴더 아래에 새로운 컨트롤러 폴더(controller), 모델 폴더(model), 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> }
버전 확장(v1->v2...)에 따라 2행과 7행이 변경됩니다.
(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. 여기에 표현된 것은 v1/site 컨트롤러이며, 인터페이스 컨트롤러의 수가 증가함에 따라 어레이에 직접 추가될 수 있습니다. 이 기사에서는 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>
생성한 후 여러 개를 추가하는 데 주의하세요. 데이터 정보를 데이터베이스에 저장합니다.
scaffolding 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> }
컨트롤러 만들기
<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> }
module/controllers 폴더에 컨트롤러를 생성하시고 네임스페이스 수정에 주의하시기 바랍니다.
여기서 컨트롤러는 Controller를 상속하는 일반 컨트롤러와 다르다는 점에 유의해야 합니다. ActiveController 클래스를 상속해야 합니다.
코멘트된 20~30줄의 코드는 RESTful 아키텍처 기반의 access_token 인증입니다. 아직 테스트되지 않았으며 추후 추가될 예정입니다.
이제 YII2를 기반으로 한 모든 구성이 기본적으로 완료되었습니다. 다음으로 API 인터페이스 테스트 도구 및 방법을 소개합니다.
RESTful 테스트 도구 PostMAN:
먼저 요청을 시뮬레이션하는 Google Chrome 기반의 실용적인 플러그인인 Postman 플러그인을 소개하겠습니다. . 구체적인 용도는 다음 테스트 과정 중 스크린샷과 관련이 있습니다. 처음 사용하는 것이므로 부족한 점 양해 부탁드립니다.
직접 작성한 API 인터페이스의 후속 패키징을 용이하게 하기 위해 위의 APP 버전을 사용하는 것이 좋습니다. 다음은 웹 버전입니다.
YII2는 정보 보기를 위한 GET, 정보 생성을 위한 POST, 정보 업데이트를 위한 PUT, 정보 삭제를 위한 DELETE의 네 가지 요청 방식으로 RESTful을 지원합니다.
다음은 데이터를 요청하는 네 가지 방법을 보여줍니다. (효과를 보여주기 위한 스크린샷일 뿐입니다. 구체적인 용도는 직접 살펴봐야 합니다.)
여기서 보여주는 것은 데이터 베이스. module/controllers/SiteController/actionIndex 메소드에 해당합니다.
상단 상자의 URL 주소에 주의하세요. 기본적으로 REST는 컨트롤러 http://api.mxq.com/v1/sites에 복수 요청을 합니다. .
* 표시가 있는 위치는 정상적인 결과를 나타냅니다. 오류가 발생하면 YII Authoritative Guide - Error에서 오류 원인을 확인할 수 있습니다.
YII2의 ActiveController는 기본적으로 데이터 페이징 효과를 구현합니다.
여기서 보여드리는 것은 POST 방식으로 생성된 새로운 데이터베이스의 데이터입니다. 모듈/컨트롤러/SiteController/actionCreate 메소드에 해당합니다.
데이터 검증 규칙이 데이터베이스의 데이터 계층에 작성된 경우 여기에 제출된 데이터가 요구 사항을 충족하지 않으면 해당 오류가 표시됩니다. 이것도 REST의 장점 중 하나입니다. 예를 들어 다음 상황에서는 플래그를 int 유형으로 정의합니다.
다음 데모는 데이터베이스의 데이터를 업데이트하는 PUT 메서드입니다. 모듈/컨트롤러/SiteController/actionUpdate 메소드에 해당합니다.
다시한번 상위 URL에 주목해주세요: http://api.mxq.com/v1/sites/15 여기서 15는 15의 데이터를 나타냅니다. 데이터베이스 ID 15로 데이터 정보를 업데이트한다는 의미입니다. 주의하시기 바랍니다. RESTful이 데이터 업데이트 및 삭제 작업을 사용하는 경우 ID는 양식 형식으로 제출할 수 없으며 URL을 따라야 합니다.
다음 데모는 데이터베이스에서 데이터를 삭제하는 DELETE 메서드입니다. module/controllers/SiteController/actionDelete 메소드에 해당합니다.
반환 값이 1이면 삭제 작업이 성공적으로 수행되었음을 의미합니다. 특정 원리에 대해서는 사이트 컨트롤러 컨트롤러의 기능을 주의 깊게 관찰하십시오.
위는 yii2를 기반으로 한 RESTful의 간략한 소개와 구현 방법, 테스트 결과이다. 오류나 누락된 부분이 있으면 자유롭게 추가해주세요. 이후 업데이트는 이를 토대로 이루어질 예정입니다. yii2 프레임워크와 RESTful 아키텍처를 접한 것은 이번이 처음입니다. 설명에 실수가 있으면 양해해 주시기 바랍니다.
위 내용은 RESTful 아키텍처를 기반으로 한 Yii2 고급 버전 API 인터페이스 개발의 구성, 구현 및 테스트를 소개하며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.