<!DOCTYPE html>
<html lang="zh-Hans">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="renderer" content="webkit">
    <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=5">
    <title>在 Windwos 10、PHP 7.1.12 下 基于 Yii 2 Starter Kit，复制后台应用为接口应用，实现 RESTful Web 服务的流程 | 云图网</title>
    <meta name="description" content="1、在 Windows PowerShll 中，进入 E:/wwwroot/cmcp-api 目录，如图1图12、新建应用api，复制backend目录为api，如图2图23、编辑 /.env.dist，新增 api 相关的配置，此为提交至Git版本控制的配置文件，如图3 API_HOST_INFO = http://…">
<meta property="og:type" content="article">
<meta property="og:url" content="https://blog.ytso.com/tech/webdev/180869.html">
<meta property="og:site_name" content="云图网">
<meta property="og:title" content="在 Windwos 10、PHP 7.1.12 下 基于 Yii 2 Starter Kit，复制后台应用为接口应用，实现 RESTful Web 服务的流程">
<meta property="og:image" content="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135747235.png">
<meta property="og:description" content="1、在 Windows PowerShll 中，进入 E:/wwwroot/cmcp-api 目录，如图1图12、新建应用api，复制backend目录为api，如图2图23、编辑 /.env.dist，新增 api 相关的配置，此为提交至Git版本控制的配置文件，如图3 API_HOST_INFO = http://…">
<link rel="canonical" href="https://blog.ytso.com/tech/webdev/180869.html">
<meta name="applicable-device" content="pc,mobile">
<meta http-equiv="Cache-Control" content="no-transform">
<link rel="shortcut icon" href="https://imgcdn.ytso.com/wp-content/uploads/2024/10/20241015181503433.jpg">
<link rel='dns-prefetch' href='//cdnjs.cloudflare.com' />
<style id='wp-img-auto-sizes-contain-inline-css' type='text/css'>
img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px}
/*# sourceURL=wp-img-auto-sizes-contain-inline-css */
</style>
<link rel='stylesheet' id='stylesheet-css' href='https://blog.ytso.com/wp-content/themes/justnews/css/style.css?ver=6.21.5' type='text/css' media='all' />
<link rel='stylesheet' id='material-icons-css' href='https://blog.ytso.com/wp-content/themes/justnews/themer/assets/css/material-icons.css?ver=6.21.5' type='text/css' media='all' />
<link rel='stylesheet' id='remixicon-css' href='https://cdnjs.cloudflare.com/ajax/libs/remixicon/4.2.0/remixicon.min.css?ver=6.9.4' type='text/css' media='all' />
<link rel='stylesheet' id='font-awesome-css' href='https://blog.ytso.com/wp-content/themes/justnews/themer/assets/css/font-awesome.css?ver=6.21.5' type='text/css' media='all' />
<style id='wp-block-library-inline-css' type='text/css'>
:root{--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:var(--wp-block-synced-color);--wp-editor-canvas-background:#ddd;--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,160.5;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-element-button{cursor:pointer}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}:root{--wp--preset--font-size--normal:16px;--wp--preset--font-size--huge:42px}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}.has-text-align-center{text-align:center}.has-text-align-left{text-align:left}.has-text-align-right{text-align:right}.has-fit-text{white-space:nowrap!important}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.screen-reader-text:focus{background-color:#ddd;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style*=border-top-color]){border-top-style:solid}html :where([style*=border-right-color]){border-right-style:solid}html :where([style*=border-bottom-color]){border-bottom-style:solid}html :where([style*=border-left-color]){border-left-style:solid}html :where([style*=border-width]){border-style:solid}html :where([style*=border-top-width]){border-top-style:solid}html :where([style*=border-right-width]){border-right-style:solid}html :where([style*=border-bottom-width]){border-bottom-style:solid}html :where([style*=border-left-width]){border-left-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}}
/*wp_block_styles_on_demand_placeholder:69cffae519120*/
/*# sourceURL=wp-block-library-inline-css */
</style>
<style id='classic-theme-styles-inline-css' type='text/css'>
/*! This file is auto-generated */
.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
/*# sourceURL=/wp-includes/css/classic-themes.min.css */
</style>
<link rel='stylesheet' id='wpcom-member-css' href='https://blog.ytso.com/wp-content/plugins/wpcom-member/css/style.css?ver=1.7.19' type='text/css' media='all' />
<script type="text/javascript" src="https://blog.ytso.com/wp-includes/js/jquery/jquery.min.js?ver=3.7.1" id="jquery-core-js"></script>
<script type="text/javascript" src="https://blog.ytso.com/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.4.1" id="jquery-migrate-js"></script>
<link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://blog.ytso.com/xmlrpc.php?rsd" />
<meta name='description' content='1、在 Windows PowerShll 中，进入 E:/wwwroot/cmcp-api 目录，如图1 图1 2、新建应用api，复制backend目录为api，如图2 图2 3、编辑 /.env.dist，新增 api 相关的配置，此为提交至Git版本控制的配置文件，如图3 AP…' />
<style>:root{--theme-color: #08c; --theme-hover: #07c; --logo-height: 32px; --logo-height-mobile: 26px; --menu-item-gap: 28px; --member-login-bg: url('https://blog.ytso.com/loginwall.jpg'); --header-bg-color: #fff; --header-bg-image: none; --theme-border-radius-s: 3px; --theme-border-radius-m: 5px; --theme-border-radius-l: 8px; --theme-border-radius-xl: 12px; --thumb-ratio-default: 480 / 300; --thumb-ratio-post: 480 / 300; --post-video-ratio: 860 / 482;}</style>
<link rel="icon" href="https://imgcdn.ytso.com/wp-content/uploads/2024/10/20241015181503433.jpg" sizes="32x32" />
<link rel="icon" href="https://imgcdn.ytso.com/wp-content/uploads/2024/10/20241015181503433.jpg" sizes="192x192" />
<link rel="apple-touch-icon" href="https://imgcdn.ytso.com/wp-content/uploads/2024/10/20241015181503433.jpg" />
<meta name="msapplication-TileImage" content="https://imgcdn.ytso.com/wp-content/uploads/2024/10/20241015181503433.jpg" />
    <!--[if lte IE 11]><script src="https://blog.ytso.com/wp-content/themes/justnews/js/update.js"></script><![endif]-->
</head>
<body class="wp-singular post-template-default single single-post postid-180869 single-format-standard wp-theme-justnews lang-cn el-boxed header-fixed">
<header class="header header-fluid">
    <div class="container">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse" aria-label="menu">
                <span class="icon-bar icon-bar-1"></span>
                <span class="icon-bar icon-bar-2"></span>
                <span class="icon-bar icon-bar-3"></span>
            </button>
                        <div class="logo">
                <a href="https://blog.ytso.com/" rel="home">
                    <img src="https://imgcdn.ytso.com/wp-content/uploads/2021/12/20211207181156143.png" alt="云图网">
                </a>
            </div>
        </div>
        <div class="collapse navbar-collapse mobile-style-0">
            <nav class="primary-menu"><ul id="menu-justnews-footer-menu" class="nav navbar-nav wpcom-adv-menu"><li class="menu-item"><a href="https://blog.ytso.com/category/industrynews">业界资讯</a></li>
<li class="menu-item current-post-ancestor active menu-item-style menu-item-style-1 dropdown"><a target="_blank" href="https://blog.ytso.com/category/tech" class="dropdown-toggle">技术专区</a>
<ul class="dropdown-menu menu-item-wrap menu-item-col-5">
	<li class="menu-item"><a href="https://blog.ytso.com/category/tech/cloud">云计算</a></li>
	<li class="menu-item"><a href="https://blog.ytso.com/category/tech/ai">人工智能</a></li>
	<li class="menu-item"><a href="https://blog.ytso.com/category/tech/safety">信息安全</a></li>
	<li class="menu-item current-post-ancestor current-post-parent active"><a href="https://blog.ytso.com/category/tech/bigdata">大数据</a></li>
	<li class="menu-item current-post-ancestor current-post-parent active"><a href="https://blog.ytso.com/category/tech/dev">研发管理</a></li>
	<li class="menu-item current-post-ancestor current-post-parent active"><a href="https://blog.ytso.com/category/tech/webdev">大前端</a></li>
	<li class="menu-item"><a href="https://blog.ytso.com/category/tech/opensource">开源</a></li>
	<li class="menu-item"><a href="https://blog.ytso.com/category/tech/aiops">智能运维</a></li>
	<li class="menu-item current-post-ancestor current-post-parent active"><a href="https://blog.ytso.com/category/tech/pnotes">编程笔记</a></li>
	<li class="menu-item"><a href="https://blog.ytso.com/category/tech/wp">WordPress</a></li>
</ul>
</li>
<li class="menu-item"><a href="https://blog.ytso.com/category/enterprise-strategic-planning">企业战略规划</a></li>
<li class="menu-item"><a href="https://blog.ytso.com/category/download">下载专区</a></li>
<li class="menu-item"><a href="https://blog.ytso.com/category/it%e6%b1%9f%e6%b9%96%e5%8f%b2">江湖史</a></li>
<li class="menu-item"><a href="https://blog.ytso.com/category/notes">随笔记录</a></li>
</ul></nav>            <div class="navbar-action">
                <div class="navbar-search-icon j-navbar-search"><i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-search"></use></svg></i></div><form class="navbar-search" action="https://blog.ytso.com/" method="get" role="search"><div class="navbar-search-inner"><i class="wpcom-icon wi navbar-search-close"><svg aria-hidden="true"><use xlink:href="#wi-close"></use></svg></i><input type="text" name="s" class="navbar-search-input" autocomplete="off" maxlength="100" placeholder="输入关键词搜索..." value=""><button class="navbar-search-btn" type="submit" aria-label="搜索"><i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-search"></use></svg></i></button></div></form>                    <div id="j-user-wrap">
                        <a class="login" href="https://blog.ytso.com/login">登录</a>
                        <a class="login register" href="https://blog.ytso.com/register">注册</a>
                    </div>
                                            <a class="wpcom-btn btn-primary btn-xs publish" href="https://blog.ytso.com/contribute">
                            <i class="fa fa-edit"></i> 投稿                        </a>
                                </div>
        </div>
    </div><!-- /.container -->
</header>

<div id="wrap">    <div class="wrap container">
        <ol class="breadcrumb" vocab="https://schema.org/" typeof="BreadcrumbList"><li class="home" property="itemListElement" typeof="ListItem"><a href="https://blog.ytso.com" property="item" typeof="WebPage"><span property="name" class="hide">云图网</span>首页</a><meta property="position" content="1"></li><li property="itemListElement" typeof="ListItem"><i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-arrow-right-3"></use></svg></i><a href="https://blog.ytso.com/category/tech" property="item" typeof="WebPage"><span property="name">技术专区</span></a><meta property="position" content="2"></li><li property="itemListElement" typeof="ListItem"><i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-arrow-right-3"></use></svg></i><a href="https://blog.ytso.com/category/tech/webdev" property="item" typeof="WebPage"><span property="name">大前端</span></a><meta property="position" content="3"></li></ol>        <main class="main">
                            <article id="post-180869" class="post-180869 post type-post status-publish format-standard hentry category-webdev category-bigdata category-dev category-pnotes entry">
                    <div class="entry-main">
                                                                        <div class="entry-head">
                            <h1 class="entry-title">在 Windwos 10、PHP 7.1.12 下 基于 Yii 2 Starter Kit，复制后台应用为接口应用，实现 RESTful Web 服务的流程</h1>
                            <div class="entry-info">
                                                                <time class="entry-date published" datetime="2021-10-31T14:32:49+08:00" pubdate>
                                    2021年10月31日 14:32                                </time>
                                <span class="dot">•</span>
                                <a href="https://blog.ytso.com/category/tech/webdev" rel="category tag">大前端</a>, <a href="https://blog.ytso.com/category/tech/bigdata" rel="category tag">大数据</a>, <a href="https://blog.ytso.com/category/tech/dev" rel="category tag">研发管理</a>, <a href="https://blog.ytso.com/category/tech/pnotes" rel="category tag">编程笔记</a>                                                            </div>
                        </div>
                        
                                                <div class="entry-content text-indent text-justify">
                            <p>1、在 Windows PowerShll 中，进入 E:/wwwroot/cmcp-api 目录，如图1</p>
<div id="attachment_2207" style="width: 1483px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135747235.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2207" loading="lazy" class="size-full wp-image-2207" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135747235.png" alt="在 Windows PowerShll 中，进入 E:/wwwroot/cmcp-api 目录" width="1473" height="903" sizes="auto, (max-width: 1473px) 100vw, 1473px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2207" loading="lazy" class="size-full wp-image-2207 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135747235.png" alt="在 Windows PowerShll 中，进入 E:/wwwroot/cmcp-api 目录" width="1473" height="903" sizes="auto, (max-width: 1473px) 100vw, 1473px" /></a></p>
<p id="caption-attachment-2207" class="wp-caption-text">图1</p>
</div>
<p>2、新建应用api，复制backend目录为api，如图2</p>
<div id="attachment_2208" style="width: 735px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135748948.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2208" loading="lazy" class="size-full wp-image-2208" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135748948.png" alt="新建应用api，复制backend目录为api" width="725" height="776" sizes="auto, (max-width: 725px) 100vw, 725px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2208" loading="lazy" class="size-full wp-image-2208 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135748948.png" alt="新建应用api，复制backend目录为api" width="725" height="776" sizes="auto, (max-width: 725px) 100vw, 725px" /></a></p>
<p id="caption-attachment-2208" class="wp-caption-text">图2</p>
</div>
<p>3、编辑 /.env.dist，新增 api 相关的配置，此为提交至Git版本控制的配置文件，如图3</p>
<pre class="brush: plain; title: ; notranslate" title="">
API_HOST_INFO         = http://api.yii2-starter-kit.dev
#API_HOST_INFO         = http://yii2-starter-kit.dev
#API_BASE_URL          = /api/web
API_COOKIE_VALIDATION_KEY = &lt;generated_key&gt;
</pre>
<div id="attachment_2209" style="width: 1136px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135749168.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2209" loading="lazy" class="size-full wp-image-2209" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135749168.png" alt="编辑 /.env.dist，新增 api 相关的配置，此为提交至Git版本控制的配置文件" width="1126" height="907" sizes="auto, (max-width: 1126px) 100vw, 1126px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2209" loading="lazy" class="size-full wp-image-2209 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135749168.png" alt="编辑 /.env.dist，新增 api 相关的配置，此为提交至Git版本控制的配置文件" width="1126" height="907" sizes="auto, (max-width: 1126px) 100vw, 1126px" /></a></p>
<p id="caption-attachment-2209" class="wp-caption-text">图3</p>
</div>
<p>4、编辑 /.env，新增 api 相关的配置，此为实际生效的配置文件，如图4</p>
<pre class="brush: plain; title: ; notranslate" title="">
API_HOST_INFO         = http://www.cmcp-api.localhost
#API_HOST_INFO         = http://yii2-starter-kit.dev
#API_BASE_URL          = /api/web
API_COOKIE_VALIDATION_KEY = &lt;generated_key&gt;
</pre>
<div id="attachment_2210" style="width: 1139px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135751810.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2210" loading="lazy" class="size-full wp-image-2210" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135751810.png" alt="编辑 /.env，新增 api 相关的配置，此为实际生效的配置文件" width="1129" height="909" sizes="auto, (max-width: 1129px) 100vw, 1129px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2210" loading="lazy" class="size-full wp-image-2210 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135751810.png" alt="编辑 /.env，新增 api 相关的配置，此为实际生效的配置文件" width="1129" height="909" sizes="auto, (max-width: 1129px) 100vw, 1129px" /></a></p>
<p id="caption-attachment-2210" class="wp-caption-text">图4</p>
</div>
<p>5、编辑 /common/config/bootstrap.php，配置接口应用的别名，如图5</p>
<pre class="brush: php; title: ; notranslate" title="">
Yii::setAlias('@api', realpath(__DIR__.'/../../api'));
Yii::setAlias('@apiUrl', env('API_HOST_INFO') . env('API_BASE_URL') );
</pre>
<div id="attachment_2211" style="width: 1231px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135752271.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2211" loading="lazy" class="size-full wp-image-2211" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135752271.png" alt="编辑 /common/config/bootstrap.php，配置接口应用的别名" width="1221" height="754" sizes="auto, (max-width: 1221px) 100vw, 1221px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2211" loading="lazy" class="size-full wp-image-2211 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135752271.png" alt="编辑 /common/config/bootstrap.php，配置接口应用的别名" width="1221" height="754" sizes="auto, (max-width: 1221px) 100vw, 1221px" /></a></p>
<p id="caption-attachment-2211" class="wp-caption-text">图5</p>
</div>
<p>6、编辑 /common/config/base.php，配置接口应用的语言包文件，如图6</p>
<pre class="brush: php; title: ; notranslate" title="">
'api'=&gt;'api.php',
</pre>
<div id="attachment_2212" style="width: 952px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135753479.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2212" loading="lazy" class="size-full wp-image-2212" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135753479.png" alt="编辑 /common/config/base.php，配置接口应用的语言包文件" width="942" height="597" sizes="auto, (max-width: 942px) 100vw, 942px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2212" loading="lazy" class="size-full wp-image-2212 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135753479.png" alt="编辑 /common/config/base.php，配置接口应用的语言包文件" width="942" height="597" sizes="auto, (max-width: 942px) 100vw, 942px" /></a></p>
<p id="caption-attachment-2212" class="wp-caption-text">图6</p>
</div>
<p>7、新建接口应用的中文语言包文件，复制 /common/messages/zh/backend.php 为 /common/messages/zh/api.php(如果需要支持其他的语言，可以在其他的语言目录下新建)，如图7</p>
<div id="attachment_2213" style="width: 713px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135754610.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2213" loading="lazy" class="size-full wp-image-2213" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135754610.png" alt="新建接口应用的中文语言包文件，复制 /common/messages/zh/backend.php 为 /common/messages/zh/api.php(如果需要支持其他的语言，可以在其他的语言目录下新建)" width="703" height="236" sizes="auto, (max-width: 703px) 100vw, 703px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2213" loading="lazy" class="size-full wp-image-2213 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135754610.png" alt="新建接口应用的中文语言包文件，复制 /common/messages/zh/backend.php 为 /common/messages/zh/api.php(如果需要支持其他的语言，可以在其他的语言目录下新建)" width="703" height="236" sizes="auto, (max-width: 703px) 100vw, 703px" /></a></p>
<p id="caption-attachment-2213" class="wp-caption-text">图7</p>
</div>
<p>8、编辑 /common/config/base.php，配置接口应用的URL的解析与生成，如图8</p>
<pre class="brush: php; title: ; notranslate" title="">
        'urlManagerApi' =&gt; /yii/helpers/ArrayHelper::merge(
            [
                'hostInfo' =&gt; env('API_HOST_INFO'),
                'baseUrl' =&gt; env('API_BASE_URL'),
            ],
            require(Yii::getAlias('@api/config/_urlManager.php'))
        ),
</pre>
<div id="attachment_2214" style="width: 1064px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135755508.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2214" loading="lazy" class="size-full wp-image-2214" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135755508.png" alt="编辑 /common/config/base.php，配置接口应用的URL的解析与生成" width="1054" height="653" sizes="auto, (max-width: 1054px) 100vw, 1054px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2214" loading="lazy" class="size-full wp-image-2214 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135755508.png" alt="编辑 /common/config/base.php，配置接口应用的URL的解析与生成" width="1054" height="653" sizes="auto, (max-width: 1054px) 100vw, 1054px" /></a></p>
<p id="caption-attachment-2214" class="wp-caption-text">图8</p>
</div>
<p>9、编辑 /console/controllers/AppController.php，搜索此文件有6处backend，则相应复制3份为api，如图9</p>
<pre class="brush: php; title: ; notranslate" title="">
    public $writablePaths = [
        '@common/runtime',
        '@frontend/runtime',
        '@frontend/web/assets',
        '@backend/runtime',
        '@backend/web/assets',
        '@api/runtime',
        '@api/web/assets',
        '@storage/cache',
        '@storage/web/source'
    ];

    public $executablePaths = [
        '@backend/yii',
        '@api/yii',
        '@frontend/yii',
        '@console/yii',
    ];
</pre>
<div id="attachment_2215" style="width: 929px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135756242.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2215" loading="lazy" class="size-full wp-image-2215" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135756242.png" alt="编辑 /console/controllers/AppController.php，搜索此文件有6处backend，则相应复制3份为api" width="919" height="861" sizes="auto, (max-width: 919px) 100vw, 919px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2215" loading="lazy" class="size-full wp-image-2215 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135756242.png" alt="编辑 /console/controllers/AppController.php，搜索此文件有6处backend，则相应复制3份为api" width="919" height="861" sizes="auto, (max-width: 919px) 100vw, 919px" /></a></p>
<p id="caption-attachment-2215" class="wp-caption-text">图9</p>
</div>
<p>10、编辑 /autocompletion.php，新增接口应用相关的配置，如图10</p>
<pre class="brush: php; title: ; notranslate" title="">
 * @property yii/web/UrlManager $urlManagerApi UrlManager for api application.
</pre>
<div id="attachment_2216" style="width: 1247px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135757998.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2216" loading="lazy" class="size-full wp-image-2216" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135757998.png" alt="编辑 /autocompletion.php，新增接口应用相关的配置" width="1237" height="674" sizes="auto, (max-width: 1237px) 100vw, 1237px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2216" loading="lazy" class="size-full wp-image-2216 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135757998.png" alt="编辑 /autocompletion.php，新增接口应用相关的配置" width="1237" height="674" sizes="auto, (max-width: 1237px) 100vw, 1237px" /></a></p>
<p id="caption-attachment-2216" class="wp-caption-text">图10</p>
</div>
<p>11、在目录api中搜索backend/、backend/、=&gt; &#8216;backend&#8217;、BACKEND，严格匹配大小写，将其分别替换为api/、api/、=&gt; &#8216;api&#8217;、API，如图11</p>
<pre class="brush: plain; title: ; notranslate" title="">
backend/ 替换为： api/
backend/ 替换为： api/
=&gt; 'backend' 替换为： =&gt; 'api'
BACKEND 替换为： =&gt; API
</pre>
<div id="attachment_2217" style="width: 1129px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135758983.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2217" loading="lazy" class="size-full wp-image-2217" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135758983.png" alt="在目录api中搜索backend/、backend/、=&gt; 'backend'、BACKEND，严格匹配大小写，将其分别替换为api/、api/、=&gt; 'api'、API" width="1119" height="615" sizes="auto, (max-width: 1119px) 100vw, 1119px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2217" loading="lazy" class="size-full wp-image-2217 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135758983.png" alt="在目录api中搜索backend/、backend/、=&gt; 'backend'、BACKEND，严格匹配大小写，将其分别替换为api/、api/、=&gt; 'api'、API" width="1119" height="615" sizes="auto, (max-width: 1119px) 100vw, 1119px" /></a></p>
<p id="caption-attachment-2217" class="wp-caption-text">图11</p>
</div>
<p>12、在 /tests 目录中，还有相应的与新增接口应用相关的配置，此部分暂缓一下，到需要进行自动化测试的时候，再来进行配置了。查看 /api/web/index-test.php，如图12</p>
<div id="attachment_2218" style="width: 1705px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135759455.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2218" loading="lazy" class="size-full wp-image-2218" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135759455.png" alt="在 /tests 目录中，还有相应的与新增接口应用相关的配置，此部分暂缓一下，到需要进行自动化测试的时候，再来进行配置了。查看 /api/web/index-test.php" width="1695" height="918" sizes="auto, (max-width: 1695px) 100vw, 1695px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2218" loading="lazy" class="size-full wp-image-2218 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135759455.png" alt="在 /tests 目录中，还有相应的与新增接口应用相关的配置，此部分暂缓一下，到需要进行自动化测试的时候，再来进行配置了。查看 /api/web/index-test.php" width="1695" height="918" sizes="auto, (max-width: 1695px) 100vw, 1695px" /></a></p>
<p id="caption-attachment-2218" class="wp-caption-text">图12</p>
</div>
<p>13、在 Windows PowerShll 中，进入 E:/wwwroot/cmcp-api 目录，再次运行命令：php console/yii app/setup，设置可写、可执行权限，如图13</p>
<div id="attachment_2219" style="width: 1483px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135800661.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2219" loading="lazy" class="size-full wp-image-2219" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135800661.png" alt="在 Windows PowerShll 中，进入 E:/wwwroot/cmcp-api 目录，再次运行命令：php console/yii app/setup，设置可写、可执行权限" width="1473" height="903" sizes="auto, (max-width: 1473px) 100vw, 1473px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2219" loading="lazy" class="size-full wp-image-2219 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135800661.png" alt="在 Windows PowerShll 中，进入 E:/wwwroot/cmcp-api 目录，再次运行命令：php console/yii app/setup，设置可写、可执行权限" width="1473" height="903" sizes="auto, (max-width: 1473px) 100vw, 1473px" /></a></p>
<p id="caption-attachment-2219" class="wp-caption-text">图13</p>
</div>
<p>14、在 Nginx 配置文件中新增虚拟主机，重启Nginx，如图14</p>
<pre class="brush: plain; title: ; notranslate" title="">
## API ##
server {
    listen 80; ## 监听 ipv4 上的 80 端口
    # listen [::]:80 default_server ipv6only=on; ## 监听 ipv6 上的 80 端口

    root E:/wwwroot/cmcp-api/api/web;
    index index.php index.html;

    server_name www.cmcp-api.localhost;

    charset utf-8;

	access_log logs/www.cmcp-api.localhost.access.log;
	error_log logs/www.cmcp-api.localhost.error.log;

    client_max_body_size 128M;

    # There is a VirtualBox bug related to sendfile that can lead to
    # corrupted files, if not turned-off on Vagrant based setup
    # sendfile off;

    location / {
		# 如果找不到真实存在的文件，把请求分发至 index.php
        try_files $uri $uri/ /index.php?$args;
    }

    # location ~* ^.+/.(jpg|jpeg|gif|png|ico|css|pdf|ppt|txt|bmp|rtf|js)$ {
    #     access_log off;
    #     expires max;
    # }

    location ~ /.php$ {
        fastcgi_split_path_info ^(.+/.php)(/.+)$;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass php-fpm;
        fastcgi_index index.php;
        include fastcgi_params;
    }

	location ~ //.(ht|svn|git) {
        deny all;
    }

}
</pre>
<div id="attachment_2220" style="width: 1422px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135802592.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2220" loading="lazy" class="size-full wp-image-2220" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135802592.png" alt="在 Nginx 配置文件中新增虚拟主机，重启Nginx" width="1412" height="908" sizes="auto, (max-width: 1412px) 100vw, 1412px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2220" loading="lazy" class="size-full wp-image-2220 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135802592.png" alt="在 Nginx 配置文件中新增虚拟主机，重启Nginx" width="1412" height="908" sizes="auto, (max-width: 1412px) 100vw, 1412px" /></a></p>
<p id="caption-attachment-2220" class="wp-caption-text">图14</p>
</div>
<p>15、在 hosts 文件中新增配置，如图15</p>
<pre class="brush: plain; title: ; notranslate" title="">
# 内容管控平台接口
127.0.0.1 cmcp-api.localhost www.cmcp-api.localhost frontend.cmcp-api.localhost backend.cmcp-api.localhost storage.cmcp-api.localhost
</pre>
<div id="attachment_2221" style="width: 1769px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135803793.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2221" loading="lazy" class="size-full wp-image-2221" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135803793.png" alt="在 hosts 文件中新增配置" width="1759" height="749" sizes="auto, (max-width: 1759px) 100vw, 1759px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2221" loading="lazy" class="size-full wp-image-2221 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135803793.png" alt="在 hosts 文件中新增配置" width="1759" height="749" sizes="auto, (max-width: 1759px) 100vw, 1759px" /></a></p>
<p id="caption-attachment-2221" class="wp-caption-text">图15</p>
</div>
<p>16、打开 http://www.cmcp-api.localhost， 如果出现样式文件加载响应404的情况，可以删除 /api/web/assets 下的所有子目录，如图16</p>
<div id="attachment_2222" style="width: 1376px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135804665.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2222" loading="lazy" class="size-full wp-image-2222" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135804665.png" alt="打开 http://www.cmcp-api.localhost， 如果出现样式文件加载响应404的情况，可以删除 /api/web/assets 下的所有子目录" width="1366" height="1004" sizes="auto, (max-width: 1366px) 100vw, 1366px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2222" loading="lazy" class="size-full wp-image-2222 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135804665.png" alt="打开 http://www.cmcp-api.localhost， 如果出现样式文件加载响应404的情况，可以删除 /api/web/assets 下的所有子目录" width="1366" height="1004" sizes="auto, (max-width: 1366px) 100vw, 1366px" /></a></p>
<p id="caption-attachment-2222" class="wp-caption-text">图16</p>
</div>
<p>17、准备将创建页面的功能基于接口实现，如图17</p>
<div id="attachment_2223" style="width: 702px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135805290.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2223" loading="lazy" class="size-full wp-image-2223" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135805290.png" alt="准备将创建页面的功能基于接口实现" width="692" height="976" sizes="auto, (max-width: 692px) 100vw, 692px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2223" loading="lazy" class="size-full wp-image-2223 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135805290.png" alt="准备将创建页面的功能基于接口实现" width="692" height="976" sizes="auto, (max-width: 692px) 100vw, 692px" /></a></p>
<p id="caption-attachment-2223" class="wp-caption-text">图17</p>
</div>
<p>18、调整 Page 模型的相关结构，实现模型分层，参考网址：http://www.shuijingwanwq.com/2017/08/15/1713/ ，如图18</p>
<div id="attachment_2224" style="width: 1376px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135806149.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2224" loading="lazy" class="size-full wp-image-2224" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135806149.png" alt="调整 Page 模型的相关结构，实现模型分层，参考网址：http://www.shuijingwanwq.com/2017/08/15/1713/" width="1366" height="1004" sizes="auto, (max-width: 1366px) 100vw, 1366px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2224" loading="lazy" class="size-full wp-image-2224 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135806149.png" alt="调整 Page 模型的相关结构，实现模型分层，参考网址：http://www.shuijingwanwq.com/2017/08/15/1713/" width="1366" height="1004" sizes="auto, (max-width: 1366px) 100vw, 1366px" /></a></p>
<p id="caption-attachment-2224" class="wp-caption-text">图18</p>
</div>
<p>19、打开网址：http://frontend.cmcp-api.localhost/gii ，如图19</p>
<div id="attachment_2225" style="width: 1376px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135807348.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2225" loading="lazy" class="size-full wp-image-2225" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135807348.png" alt="打开网址：http://frontend.cmcp-api.localhost/gii" width="1366" height="1004" sizes="auto, (max-width: 1366px) 100vw, 1366px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2225" loading="lazy" class="size-full wp-image-2225 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135807348.png" alt="打开网址：http://frontend.cmcp-api.localhost/gii" width="1366" height="1004" sizes="auto, (max-width: 1366px) 100vw, 1366px" /></a></p>
<p id="caption-attachment-2225" class="wp-caption-text">图19</p>
</div>
<p>20、基于数据库表 ca_page 建立相应模型，如图20</p>
<div id="attachment_2226" style="width: 955px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135808875.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2226" loading="lazy" class="size-full wp-image-2226" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135808875.png" alt="基于数据库表 ca_page 建立相应模型" width="945" height="442" sizes="auto, (max-width: 945px) 100vw, 945px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2226" loading="lazy" class="size-full wp-image-2226 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135808875.png" alt="基于数据库表 ca_page 建立相应模型" width="945" height="442" sizes="auto, (max-width: 945px) 100vw, 945px" /></a></p>
<p id="caption-attachment-2226" class="wp-caption-text">图20</p>
</div>
<p>21、在common目录中新建logics目录，用于MySQL模型的逻辑层所在目录，如图21</p>
<div id="attachment_2227" style="width: 508px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135809824.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2227" loading="lazy" class="size-full wp-image-2227" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135809824.png" alt="在common目录中新建logics目录，用于MySQL模型的逻辑层所在目录" width="498" height="768" sizes="auto, (max-width: 498px) 100vw, 498px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2227" loading="lazy" class="size-full wp-image-2227 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135809824.png" alt="在common目录中新建logics目录，用于MySQL模型的逻辑层所在目录" width="498" height="768" sizes="auto, (max-width: 498px) 100vw, 498px" /></a></p>
<p id="caption-attachment-2227" class="wp-caption-text">图21</p>
</div>
<p>22、复制 /common/models/Page.php 至 /common/logics/Page.php，如图22</p>
<pre class="brush: php; title: ; notranslate" title="">
&lt;?php namespace common/models; use Yii; use yii/behaviors/SluggableBehavior; use yii/behaviors/TimestampBehavior; use yii/db/ActiveRecord; /** * This is the model class for table &quot;page&quot;. * * @property integer $id * @property string $slug * @property string $title * @property string $body * @property string $view * @property integer $status * @property integer $created_at * @property integer $updated_at */ class Page extends ActiveRecord { const STATUS_DRAFT = 0; const STATUS_PUBLISHED = 1; /** * @inheritdoc */ public static function tableName() { return '{{%page}}'; } /** * @inheritdoc */ public function behaviors() { return [ TimestampBehavior::className(), 'slug' =&gt; [
                'class' =&gt; SluggableBehavior::className(),
                'attribute' =&gt; 'title',
                'ensureUnique' =&gt; true,
                'immutable' =&gt; true
            ]
        ];
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['title', 'body'], 'required'],
            [['body'], 'string'],
            [['status'], 'integer'],
            [['slug'], 'unique'],
            [['slug'], 'string', 'max' =&gt; 2048],
            [['title'], 'string', 'max' =&gt; 512],
            [['view'], 'string', 'max' =&gt; 255]
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' =&gt; Yii::t('common', 'ID'),
            'slug' =&gt; Yii::t('common', 'Slug'),
            'title' =&gt; Yii::t('common', 'Title'),
            'body' =&gt; Yii::t('common', 'Body'),
            'view' =&gt; Yii::t('common', 'Page View'),
            'status' =&gt; Yii::t('common', 'Active'),
            'created_at' =&gt; Yii::t('common', 'Created At'),
            'updated_at' =&gt; Yii::t('common', 'Updated At'),
        ];
    }
}

</pre>
<div id="attachment_2228" style="width: 506px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135810974.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2228" loading="lazy" class="size-full wp-image-2228" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135810974.png" alt="复制 /common/models/Page.php 至 /common/logics/Page.php" width="496" height="726" sizes="auto, (max-width: 496px) 100vw, 496px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2228" loading="lazy" class="size-full wp-image-2228 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135810974.png" alt="复制 /common/models/Page.php 至 /common/logics/Page.php" width="496" height="726" sizes="auto, (max-width: 496px) 100vw, 496px" /></a></p>
<p id="caption-attachment-2228" class="wp-caption-text">图22</p>
</div>
<p>23、基于 diff ，编辑 /common/logics/Page.php，如图23</p>
<div id="attachment_2229" style="width: 825px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135811645.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2229" loading="lazy" class="size-full wp-image-2229" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135811645.png" alt="基于 diff ，编辑 /common/logics/Page.php" width="815" height="879" sizes="auto, (max-width: 815px) 100vw, 815px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2229" loading="lazy" class="size-full wp-image-2229 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135811645.png" alt="基于 diff ，编辑 /common/logics/Page.php" width="815" height="879" sizes="auto, (max-width: 815px) 100vw, 815px" /></a></p>
<p id="caption-attachment-2229" class="wp-caption-text">图23</p>
</div>
<p>24、在common/logics目录中的MySQL模型文件为业务逻辑相关，继承至 /common/models/Page 数据层，如图24</p>
<pre class="brush: php; title: ; notranslate" title="">
&lt;?php namespace common/logics; use Yii; use yii/behaviors/SluggableBehavior; use yii/behaviors/TimestampBehavior; class Page extends /common/models/Page { const STATUS_DRAFT = 0; const STATUS_PUBLISHED = 1; /** * @inheritdoc */ public function behaviors() { return [ TimestampBehavior::className(), 'slug' =&gt; [
                'class' =&gt; SluggableBehavior::className(),
                'attribute' =&gt; 'title',
                'ensureUnique' =&gt; true,
                'immutable' =&gt; true
            ]
        ];
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['title', 'body'], 'required'],
            [['body'], 'string'],
            [['status'], 'integer'],
            [['slug'], 'unique'],
            [['slug'], 'string', 'max' =&gt; 2048],
            [['title'], 'string', 'max' =&gt; 512],
            [['view'], 'string', 'max' =&gt; 255],
        ];
    }

}

</pre>
<div id="attachment_2230" style="width: 1030px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135812942.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2230" loading="lazy" class="size-full wp-image-2230" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135812942.png" alt="在common/logics目录中的MySQL模型文件为业务逻辑相关，继承至 /common/models/Page 数据层" width="1020" height="865" sizes="auto, (max-width: 1020px) 100vw, 1020px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2230" loading="lazy" class="size-full wp-image-2230 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135812942.png" alt="在common/logics目录中的MySQL模型文件为业务逻辑相关，继承至 /common/models/Page 数据层" width="1020" height="865" sizes="auto, (max-width: 1020px) 100vw, 1020px" /></a></p>
<p id="caption-attachment-2230" class="wp-caption-text">图24</p>
</div>
<p>25、点击Model Generator下的Start按钮，生成模型Page，命名空间为common/models，此时需支持国际化，覆盖/common/models/Page.php，如图25</p>
<div id="attachment_2231" style="width: 884px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135814711.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2231" loading="lazy" class="size-full wp-image-2231" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135814711.png" alt="点击Model Generator下的Start按钮，生成模型Page，命名空间为common/models，此时需支持国际化，覆盖/common/models/Page.php" width="874" height="908" sizes="auto, (max-width: 874px) 100vw, 874px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2231" loading="lazy" class="size-full wp-image-2231 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135814711.png" alt="点击Model Generator下的Start按钮，生成模型Page，命名空间为common/models，此时需支持国际化，覆盖/common/models/Page.php" width="874" height="908" sizes="auto, (max-width: 874px) 100vw, 874px" /></a></p>
<p id="caption-attachment-2231" class="wp-caption-text">图25</p>
</div>
<p>26、编辑 /common/config/base.php，当源语言和目标语言相同时，是否强制进行消息翻译，默认为假，设置为真，如图26</p>
<pre class="brush: php; title: ; notranslate" title="">
                '*'=&gt; [
                    'class' =&gt; 'yii/i18n/PhpMessageSource',
                    'forceTranslation' =&gt; true,
                    'basePath'=&gt;'@common/messages',
                    'fileMap'=&gt;[
                        'common'=&gt;'common.php',
                        'backend'=&gt;'backend.php',
                        'api'=&gt;'api.php',
                        'frontend'=&gt;'frontend.php',
                    ],
                    'on missingTranslation' =&gt; ['/backend/modules/i18n/Module', 'missingTranslation']
                ],
</pre>
<div id="attachment_2232" style="width: 1159px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135814989.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2232" loading="lazy" class="size-full wp-image-2232" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135814989.png" alt="编辑 /common/config/base.php，当源语言和目标语言相同时，是否强制进行消息翻译，默认为假，设置为真" width="1149" height="867" sizes="auto, (max-width: 1149px) 100vw, 1149px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2232" loading="lazy" class="size-full wp-image-2232 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135814989.png" alt="编辑 /common/config/base.php，当源语言和目标语言相同时，是否强制进行消息翻译，默认为假，设置为真" width="1149" height="867" sizes="auto, (max-width: 1149px) 100vw, 1149px" /></a></p>
<p id="caption-attachment-2232" class="wp-caption-text">图26</p>
</div>
<p>27、新建 /common/messages/en/model/page.php，支持目标语言为英语美国时的消息翻译，如图27</p>
<pre class="brush: php; title: ; notranslate" title="">
return [
    'ID' =&gt; 'ID',
    'Slug' =&gt; 'Slug',
    'Title' =&gt; 'Title',
    'Body' =&gt; 'Body',
    'View' =&gt; 'Page View',
    'Status' =&gt; 'Active',
    'Created At' =&gt; 'Created At',
    'Updated At' =&gt; 'Updated At',
];
</pre>
<div id="attachment_2233" style="width: 1683px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135816675.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2233" loading="lazy" class="size-full wp-image-2233" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135816675.png" alt="新建 /common/messages/en/model/page.php，支持目标语言为英语美国时的消息翻译" width="1673" height="529" sizes="auto, (max-width: 1673px) 100vw, 1673px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2233" loading="lazy" class="size-full wp-image-2233 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135816675.png" alt="新建 /common/messages/en/model/page.php，支持目标语言为英语美国时的消息翻译" width="1673" height="529" sizes="auto, (max-width: 1673px) 100vw, 1673px" /></a></p>
<p id="caption-attachment-2233" class="wp-caption-text">图27</p>
</div>
<p>28、新建 /common/messages/zh/model/page.php，支持目标语言为简体中文时的消息翻译，如图28</p>
<pre class="brush: php; title: ; notranslate" title="">
return [
    'ID' =&gt; 'ID',
    'Slug' =&gt; '别名',
    'Title' =&gt; '标题',
    'Body' =&gt; '内容',
    'View' =&gt; '页面浏览',
    'Status' =&gt; '活动',
    'Created At' =&gt; '创建时间',
    'Updated At' =&gt; '更新时间',
];
</pre>
<div id="attachment_2234" style="width: 1022px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135817707.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2234" loading="lazy" class="size-full wp-image-2234" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135817707.png" alt="新建 /common/messages/zh/model/page.php，支持目标语言为简体中文时的消息翻译" width="1012" height="741" sizes="auto, (max-width: 1012px) 100vw, 1012px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2234" loading="lazy" class="size-full wp-image-2234 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135817707.png" alt="新建 /common/messages/zh/model/page.php，支持目标语言为简体中文时的消息翻译" width="1012" height="741" sizes="auto, (max-width: 1012px) 100vw, 1012px" /></a></p>
<p id="caption-attachment-2234" class="wp-caption-text">图28</p>
</div>
<p>29、新建 /api/models/Page.php，在api/models目录中的MySQL模型文件为业务逻辑相关(仅与api相关)，继承至 /common/logics/Page 逻辑层，如图29</p>
<div id="attachment_2235" style="width: 1393px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135818801.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2235" loading="lazy" class="size-full wp-image-2235" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135818801.png" alt="新建 /api/models/Page.php，在api/models目录中的MySQL模型文件为业务逻辑相关(仅与api相关)，继承至 /common/logics/Page 逻辑层" width="1383" height="414" sizes="auto, (max-width: 1383px) 100vw, 1383px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2235" loading="lazy" class="size-full wp-image-2235 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135818801.png" alt="新建 /api/models/Page.php，在api/models目录中的MySQL模型文件为业务逻辑相关(仅与api相关)，继承至 /common/logics/Page 逻辑层" width="1383" height="414" sizes="auto, (max-width: 1383px) 100vw, 1383px" /></a></p>
<p id="caption-attachment-2235" class="wp-caption-text">图29</p>
</div>
<p>30、复制/api/models/Page.php 至 /frontend/models/Page.php、/backend/models/Page.php，调整为各自的命名空间，如图30</p>
<div id="attachment_2236" style="width: 1466px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135819254.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2236" loading="lazy" class="size-full wp-image-2236" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135819254.png" alt="复制/api/models/Page.php 至 /frontend/models/Page.php、/backend/models/Page.php，调整为各自的命名空间" width="1456" height="807" sizes="auto, (max-width: 1456px) 100vw, 1456px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2236" loading="lazy" class="size-full wp-image-2236 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135819254.png" alt="复制/api/models/Page.php 至 /frontend/models/Page.php、/backend/models/Page.php，调整为各自的命名空间" width="1456" height="807" sizes="auto, (max-width: 1456px) 100vw, 1456px" /></a></p>
<p id="caption-attachment-2236" class="wp-caption-text">图30</p>
</div>
<p>31、在 api 应用中搜索 use common/models/Page;，替换为：use api/models/Page;，在前台、后台应用中同样类似处理，如图31</p>
<div id="attachment_2237" style="width: 1129px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135820483.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2237" loading="lazy" class="size-full wp-image-2237" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135820483.png" alt="在 api 应用中搜索 use common/models/Page;，替换为：use api/models/Page;，在前台、后台应用中同样类似处理" width="1119" height="613" sizes="auto, (max-width: 1119px) 100vw, 1119px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2237" loading="lazy" class="size-full wp-image-2237 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135820483.png" alt="在 api 应用中搜索 use common/models/Page;，替换为：use api/models/Page;，在前台、后台应用中同样类似处理" width="1119" height="613" sizes="auto, (max-width: 1119px) 100vw, 1119px" /></a></p>
<p id="caption-attachment-2237" class="wp-caption-text">图31</p>
</div>
<p>32、当本地设置为简体中文时，打开 http://backend.cmcp-api.localhost/page/create ，翻译功能可用，如图32</p>
<div id="attachment_2238" style="width: 769px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135821187.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2238" loading="lazy" class="size-full wp-image-2238" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135821187.png" alt="当本地设置为简体中文时，打开 http://backend.cmcp-api.localhost/page/create ，翻译功能可用" width="759" height="965" sizes="auto, (max-width: 759px) 100vw, 759px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2238" loading="lazy" class="size-full wp-image-2238 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135821187.png" alt="当本地设置为简体中文时，打开 http://backend.cmcp-api.localhost/page/create ，翻译功能可用" width="759" height="965" sizes="auto, (max-width: 759px) 100vw, 759px" /></a></p>
<p id="caption-attachment-2238" class="wp-caption-text">图32</p>
</div>
<p>33、编辑个人信息，设置本地为英语美国，如图33</p>
<div id="attachment_2239" style="width: 606px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135822695.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2239" loading="lazy" class="size-full wp-image-2239" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135822695.png" alt="编辑个人信息，设置本地为英语美国" width="596" height="922" sizes="auto, (max-width: 596px) 100vw, 596px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2239" loading="lazy" class="size-full wp-image-2239 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135822695.png" alt="编辑个人信息，设置本地为英语美国" width="596" height="922" sizes="auto, (max-width: 596px) 100vw, 596px" /></a></p>
<p id="caption-attachment-2239" class="wp-caption-text">图33</p>
</div>
<p>34、当本地设置为英语美国时，再次打开 http://backend.cmcp-api.localhost/page/create ，翻译功能可用，如图34</p>
<div id="attachment_2240" style="width: 604px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135822223.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2240" loading="lazy" class="size-full wp-image-2240" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135822223.png" alt="当本地设置为英语美国时，再次打开 http://backend.cmcp-api.localhost/page/create ，翻译功能可用" width="594" height="988" sizes="auto, (max-width: 594px) 100vw, 594px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2240" loading="lazy" class="size-full wp-image-2240 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135822223.png" alt="当本地设置为英语美国时，再次打开 http://backend.cmcp-api.localhost/page/create ，翻译功能可用" width="594" height="988" sizes="auto, (max-width: 594px) 100vw, 594px" /></a></p>
<p id="caption-attachment-2240" class="wp-caption-text">图34</p>
</div>
<p>35、开始实现 RESTful Web 服务，参考网址：http://www.shuijingwanwq.com/2016/11/28/1457/ ，如图35</p>
<div id="attachment_2241" style="width: 1376px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135824237.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2241" loading="lazy" class="size-full wp-image-2241" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135824237.png" alt="开始实现 RESTful Web 服务，参考网址：http://www.shuijingwanwq.com/2016/11/28/1457/" width="1366" height="1004" sizes="auto, (max-width: 1366px) 100vw, 1366px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2241" loading="lazy" class="size-full wp-image-2241 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135824237.png" alt="开始实现 RESTful Web 服务，参考网址：http://www.shuijingwanwq.com/2016/11/28/1457/" width="1366" height="1004" sizes="auto, (max-width: 1366px) 100vw, 1366px" /></a></p>
<p id="caption-attachment-2241" class="wp-caption-text">图35</p>
</div>
<p>36、打开网址：http://backend.cmcp-api.localhost/article/create ，创建文章，如图36</p>
<div id="attachment_2242" style="width: 765px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135825915.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2242" loading="lazy" class="size-full wp-image-2242" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135825915.png" alt="打开网址：http://backend.cmcp-api.localhost/article/create ，创建文章" width="755" height="1031" sizes="auto, (max-width: 755px) 100vw, 755px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2242" loading="lazy" class="size-full wp-image-2242 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135825915.png" alt="打开网址：http://backend.cmcp-api.localhost/article/create ，创建文章" width="755" height="1031" sizes="auto, (max-width: 755px) 100vw, 755px" /></a></p>
<p id="caption-attachment-2242" class="wp-caption-text">图36</p>
</div>
<p>37、在 Postman 中，GET http://frontend.cmcp-api.localhost/api/v1/articles ，此为自带的RESTful Web 服务，响应结果，如图37</p>
<pre class="brush: plain; title: ; notranslate" title="">
{
    &quot;items&quot;: [
        {
            &quot;id&quot;: 1,
            &quot;slug&quot;: &quot;biao-ti20180104-0&quot;,
            &quot;category_id&quot;: 1,
            &quot;title&quot;: &quot;标题20180104-0&quot;,
            &quot;body&quot;: &quot;

内容

&quot;,
            &quot;published_at&quot;: 1515031309,
            &quot;_links&quot;: {
                &quot;self&quot;: {
                    &quot;href&quot;: &quot;http://frontend.cmcp-api.localhost/api/v1/articles/1&quot;
                }
            }
        }
    ],
    &quot;_links&quot;: {
        &quot;self&quot;: {
            &quot;href&quot;: &quot;http://frontend.cmcp-api.localhost/api/v1/articles?page=1&quot;
        }
    },
    &quot;_meta&quot;: {
        &quot;totalCount&quot;: 1,
        &quot;pageCount&quot;: 1,
        &quot;currentPage&quot;: 1,
        &quot;perPage&quot;: 20
    }
}
</pre>
<div id="attachment_2243" style="width: 935px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135826758.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2243" loading="lazy" class="size-full wp-image-2243" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135826758.png" alt="在 Postman 中，GET http://frontend.cmcp-api.localhost/api/v1/articles ，此为自带的RESTful Web 服务，响应结果" width="925" height="899" sizes="auto, (max-width: 925px) 100vw, 925px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2243" loading="lazy" class="size-full wp-image-2243 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135826758.png" alt="在 Postman 中，GET http://frontend.cmcp-api.localhost/api/v1/articles ，此为自带的RESTful Web 服务，响应结果" width="925" height="899" sizes="auto, (max-width: 925px) 100vw, 925px" /></a></p>
<p id="caption-attachment-2243" class="wp-caption-text">图37</p>
</div>
<p>38、RESTful Web 服务，建议基于一个单独的接口应用来实现，而不是基于前台应用中的一个api模块来实现，这样可以更为方便地维护你的WEB应用程序，如图38</p>
<div id="attachment_2244" style="width: 1520px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135827778.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2244" loading="lazy" class="size-full wp-image-2244" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135827778.png" alt="RESTful Web 服务，建议基于一个单独的接口应用来实现，而不是基于前台应用中的一个api模块来实现，这样可以更为方便地维护你的WEB应用程序" width="1510" height="786" sizes="auto, (max-width: 1510px) 100vw, 1510px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2244" loading="lazy" class="size-full wp-image-2244 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135827778.png" alt="RESTful Web 服务，建议基于一个单独的接口应用来实现，而不是基于前台应用中的一个api模块来实现，这样可以更为方便地维护你的WEB应用程序" width="1510" height="786" sizes="auto, (max-width: 1510px) 100vw, 1510px" /></a></p>
<p id="caption-attachment-2244" class="wp-caption-text">图38</p>
</div>
<p>39、新建目录：/api/rests，此目录将做为 RESTful Web 服务的操作方法类目录，如图39</p>
<div id="attachment_2245" style="width: 352px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135828673.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2245" loading="lazy" class="size-full wp-image-2245" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135828673.png" alt="新建目录：/api/rests，此目录将做为 RESTful Web 服务的操作方法类目录" width="342" height="368" sizes="auto, (max-width: 342px) 100vw, 342px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2245" loading="lazy" class="size-full wp-image-2245 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135828673.png" alt="新建目录：/api/rests，此目录将做为 RESTful Web 服务的操作方法类目录" width="342" height="368" sizes="auto, (max-width: 342px) 100vw, 342px" /></a></p>
<p id="caption-attachment-2245" class="wp-caption-text">图39</p>
</div>
<p>40、编辑控制器类 /api/controllers/PageController.php ，控制器类扩展自 [[yii/rest/ActiveController]]。 通过指定 [[yii/rest/ActiveController::modelClass|modelClass]] 作为 api/models/Page， 控制器就能知道使用哪个模型去获取和处理数据。如图40</p>
<pre class="brush: php; title: ; notranslate" title="">
namespace api/controllers;

use yii/rest/ActiveController;

class PageController extends ActiveController
{
    public $modelClass = 'api/models/Page';
}
</pre>
<p><div id="attachment_2246" style="width: 1021px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135829777.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2246" loading="lazy" class="size-full wp-image-2246" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135829777.png" alt="编辑控制器类 /api/controllers/PageController.php ，控制器类扩展自 [[yii/rest/ActiveController]]。 通过指定 [[yii/rest/ActiveController::modelClass|modelClass]] 作为 api/models/Page， 控制器就能知道使用哪个模型去获取和处理数据。" width="1011" height="453" sizes="auto, (max-width: 1011px) 100vw, 1011px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2246" loading="lazy" class="size-full wp-image-2246 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135829777.png" alt="编辑控制器类 /api/controllers/PageController.php ，控制器类扩展自 [[yii/rest/ActiveController]]。 通过指定 [[yii/rest/ActiveController::modelClass|modelClass]] 作为 api/models/Page， 控制器就能知道使用哪个模型去获取和处理数据。" width="1011" height="453" sizes="auto, (max-width: 1011px) 100vw, 1011px" /></a></p>
<p id="caption-attachment-2246" class="wp-caption-text">图40</p>
</div>
<p>41、配置URL规则，修改有关在应用程序配置的urlManager组件的配置，编辑：/api/config/_urlManager.php，如图41</p>
<pre class="brush: php; title: ; notranslate" title="">
return [
    'class' =&gt; yii/web/UrlManager::class,
    'enablePrettyUrl' =&gt; true,
    'showScriptName' =&gt; false,
    'rules' =&gt; [
        [
            'class' =&gt; 'yii/rest/UrlRule',
            'controller' =&gt; ['page'],
        ],
    ],
];
</pre>
<div id="attachment_2247" style="width: 1015px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135830546.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2247" loading="lazy" class="size-full wp-image-2247" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135830546.png" alt="配置URL规则，修改有关在应用程序配置的urlManager组件的配置，编辑：/api/config/_urlManager.php" width="1005" height="535" sizes="auto, (max-width: 1005px) 100vw, 1005px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2247" loading="lazy" class="size-full wp-image-2247 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135830546.png" alt="配置URL规则，修改有关在应用程序配置的urlManager组件的配置，编辑：/api/config/_urlManager.php" width="1005" height="535" sizes="auto, (max-width: 1005px) 100vw, 1005px" /></a></p>
<p id="caption-attachment-2247" class="wp-caption-text">图41</p>
</div>
<p>42、在 Postman 中，GET http://www.cmcp-api.localhost/pages ，403响应，如图42</p>
<pre class="brush: plain; title: ; notranslate" title="">
{
    &quot;name&quot;: &quot;Forbidden&quot;,
    &quot;message&quot;: &quot;Login Required&quot;,
    &quot;code&quot;: 0,
    &quot;status&quot;: 403,
    &quot;type&quot;: &quot;yii//web//ForbiddenHttpException&quot;
}
</pre>
<div id="attachment_2248" style="width: 711px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135831794.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2248" loading="lazy" class="size-full wp-image-2248" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135831794.png" alt="在 Postman 中，GET http://www.cmcp-api.localhost/pages ，403响应" width="701" height="526" sizes="auto, (max-width: 701px) 100vw, 701px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2248" loading="lazy" class="size-full wp-image-2248 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135831794.png" alt="在 Postman 中，GET http://www.cmcp-api.localhost/pages ，403响应" width="701" height="526" sizes="auto, (max-width: 701px) 100vw, 701px" /></a></p>
<p id="caption-attachment-2248" class="wp-caption-text">图42</p>
</div>
<p>43、编辑 /api/config/web.php，注释附加的行为globalAccess，有待后期调整(验证、授权)，如图43</p>
<pre class="brush: php; title: ; notranslate" title="">
    /*
    'as globalAccess' =&gt; [
        'class' =&gt; common/behaviors/GlobalAccessBehavior::class,
        'rules' =&gt; [
            [
                'controllers' =&gt; ['sign-in'],
                'allow' =&gt; true,
                'roles' =&gt; ['?'],
                'actions' =&gt; ['login']
            ],
            [
                'controllers' =&gt; ['sign-in'],
                'allow' =&gt; true,
                'roles' =&gt; ['@'],
                'actions' =&gt; ['logout']
            ],
            [
                'controllers' =&gt; ['site'],
                'allow' =&gt; true,
                'roles' =&gt; ['?', '@'],
                'actions' =&gt; ['error']
            ],
            [
                'controllers' =&gt; ['debug/default'],
                'allow' =&gt; true,
                'roles' =&gt; ['?'],
            ],
            [
                'controllers' =&gt; ['user'],
                'allow' =&gt; true,
                'roles' =&gt; ['administrator'],
            ],
            [
                'controllers' =&gt; ['user'],
                'allow' =&gt; false,
            ],
            [
                'allow' =&gt; true,
                'roles' =&gt; ['manager'],
            ]
        ]
    ]
    */
</pre>
<div id="attachment_2249" style="width: 1281px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135832420.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2249" loading="lazy" class="size-full wp-image-2249" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135832420.png" alt="编辑 /api/config/web.php，注释附加的行为globalAccess，有待后期调整(验证、授权)" width="1271" height="770" sizes="auto, (max-width: 1271px) 100vw, 1271px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2249" loading="lazy" class="size-full wp-image-2249 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135832420.png" alt="编辑 /api/config/web.php，注释附加的行为globalAccess，有待后期调整(验证、授权)" width="1271" height="770" sizes="auto, (max-width: 1271px) 100vw, 1271px" /></a></p>
<p id="caption-attachment-2249" class="wp-caption-text">图43</p>
</div>
<p>44、在 Postman 中，GET http://www.cmcp-api.localhost/pages ，200响应，如图44</p>
<pre class="brush: plain; title: ; notranslate" title="">
[
    {
        &quot;id&quot;: 1,
        &quot;slug&quot;: &quot;about&quot;,
        &quot;title&quot;: &quot;About&quot;,
        &quot;body&quot;: &quot;Lorem ipsum dolor sit amet, consectetur adipiscing elit.&quot;,
        &quot;view&quot;: null,
        &quot;status&quot;: 1,
        &quot;created_at&quot;: 1514860785,
        &quot;updated_at&quot;: 1514860785
    }
]
</pre>
<div id="attachment_2250" style="width: 847px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135833577.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2250" loading="lazy" class="size-full wp-image-2250" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135833577.png" alt="在 Postman 中，GET http://www.cmcp-api.localhost/pages ，200响应" width="837" height="599" sizes="auto, (max-width: 837px) 100vw, 837px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2250" loading="lazy" class="size-full wp-image-2250 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135833577.png" alt="在 Postman 中，GET http://www.cmcp-api.localhost/pages ，200响应" width="837" height="599" sizes="auto, (max-width: 837px) 100vw, 837px" /></a></p>
<p id="caption-attachment-2250" class="wp-caption-text">图44</p>
</div>
<p>45、调用API服务后返回数据采用统一格式，返回的HTTP状态码为20x，代表调用成功；返回4xx或5xx的HTTP状态码代表调用失败。调整200响应的返回数据格式，与403响应一致，至少包含：&#8221;message&#8221;,&#8221;code&#8221;，新建语言包文件：/api/messages/zh/app.php(响应成功)、/api/messages/zh/error.php(响应失败)，如图45</p>
<pre class="brush: php; title: ; notranslate" title="">
return [
    10000 =&gt; 'success',
    10001 =&gt; '获取页面列表成功',
];
</pre>
<div id="attachment_2251" style="width: 1107px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135833490.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2251" loading="lazy" class="size-full wp-image-2251" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135833490.png" alt="调用API服务后返回数据采用统一格式，返回的HTTP状态码为20x，代表调用成功；返回4xx或5xx的HTTP状态码代表调用失败。调整200响应的返回数据格式，与403响应一致，至少包含：&quot;message&quot;,&quot;code&quot;，新建语言包文件：/api/messages/zh/app.php(响应成功)、/api/messages/zh/error.php(响应失败)" width="1097" height="454" sizes="auto, (max-width: 1097px) 100vw, 1097px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2251" loading="lazy" class="size-full wp-image-2251 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135833490.png" alt="调用API服务后返回数据采用统一格式，返回的HTTP状态码为20x，代表调用成功；返回4xx或5xx的HTTP状态码代表调用失败。调整200响应的返回数据格式，与403响应一致，至少包含：&quot;message&quot;,&quot;code&quot;，新建语言包文件：/api/messages/zh/app.php(响应成功)、/api/messages/zh/error.php(响应失败)" width="1097" height="454" sizes="auto, (max-width: 1097px) 100vw, 1097px" /></a></p>
<p id="caption-attachment-2251" class="wp-caption-text">图45</p>
</div>
<p>46、版本化的实现，参考网址：https://github.com/yiisoft/yii2/blob/master/docs/guide-zh-CN/rest-versioning.md ，编辑 /api/controllers/PageController.php，删除 modelClass，如图46</p>
<pre class="brush: php; title: ; notranslate" title="">
&lt;?php

namespace api/controllers;

use yii/rest/ActiveController;

class PageController extends ActiveController
{
}

</pre>
<div id="attachment_2252" style="width: 1135px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135834251.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2252" loading="lazy" class="size-full wp-image-2252" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135834251.png" alt="版本化的实现，参考网址：https://github.com/yiisoft/yii2/blob/master/docs/guide-zh-CN/rest-versioning.md ，编辑 /api/controllers/PageController.php，删除 modelClass" width="1125" height="536" sizes="auto, (max-width: 1125px) 100vw, 1125px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2252" loading="lazy" class="size-full wp-image-2252 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135834251.png" alt="版本化的实现，参考网址：https://github.com/yiisoft/yii2/blob/master/docs/guide-zh-CN/rest-versioning.md ，编辑 /api/controllers/PageController.php，删除 modelClass" width="1125" height="536" sizes="auto, (max-width: 1125px) 100vw, 1125px" /></a></p>
<p id="caption-attachment-2252" class="wp-caption-text">图46</p>
</div>
<p>47、把每个主要版本的 API 实现在一个单独的模块 ID 的主版本号，基于 Gii 生成模块 v1，打开网址：http://frontend.cmcp-api.localhost/gii/module ，如图47</p>
<div id="attachment_2253" style="width: 1163px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135835683.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2253" loading="lazy" class="size-full wp-image-2253" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135835683.png" alt="把每个主要版本的 API 实现在一个单独的模块 ID 的主版本号，基于 Gii 生成模块 v1，打开网址：http://frontend.cmcp-api.localhost/gii/module " width="1153" height="605" sizes="auto, (max-width: 1153px) 100vw, 1153px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2253" loading="lazy" class="size-full wp-image-2253 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135835683.png" alt="把每个主要版本的 API 实现在一个单独的模块 ID 的主版本号，基于 Gii 生成模块 v1，打开网址：http://frontend.cmcp-api.localhost/gii/module " width="1153" height="605" sizes="auto, (max-width: 1153px) 100vw, 1153px" /></a></p>
<p id="caption-attachment-2253" class="wp-caption-text">图47</p>
</div>
<p>48、新建 /api/modules/v1/models/Page.php，继承至 /api/models/Page.php，如图48<br />注：/api/modules/v1/models/Page(仅用于 v1 模块) &gt; /api/models/Page(仅用于 api 应用) &gt; /common/logics/Page.php(可用于 api、frontend 等多个应用) &gt; /common/models/Page.php(仅限于 Gii 生成) &gt; /yii/db/ActiveRecord</p>
<pre class="brush: php; title: ; notranslate" title="">
&lt;?php

namespace api/modules/v1/models;

class Page extends /api/models/Page
{

}

</pre>
<div id="attachment_2254" style="width: 1190px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135836533.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2254" loading="lazy" class="size-full wp-image-2254" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135836533.png" alt="新建 /api/modules/v1/models/Page.php，继承至 /api/models/Page.php" width="1180" height="496" sizes="auto, (max-width: 1180px) 100vw, 1180px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2254" loading="lazy" class="size-full wp-image-2254 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135836533.png" alt="新建 /api/modules/v1/models/Page.php，继承至 /api/models/Page.php" width="1180" height="496" sizes="auto, (max-width: 1180px) 100vw, 1180px" /></a></p>
<p id="caption-attachment-2254" class="wp-caption-text">图48</p>
</div>
<p>49、/api/modules/v1/controllers/DefaultController.php 重命名为 /api/modules/v1/controllers/PageController.php，编辑代码，如图49<br />注：/api/modules/v1/controllers/PageController.php(仅用于 v1 模块) &gt; /api/controllers/PageController.php(仅用于 api 应用) &gt; /yii/rest/ActiveController</p>
<pre class="brush: php; title: ; notranslate" title="">
&lt;?php

namespace api/modules/v1/controllers;

/**
 * Page controller for the `v1` module
 */
class PageController extends /api/controllers/PageController
{
    public $modelClass = 'api/modules/v1/models/Page';
}

</pre>
<div id="attachment_2255" style="width: 1188px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135837620.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2255" loading="lazy" class="size-full wp-image-2255" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135837620.png" alt="/api/modules/v1/controllers/DefaultController.php 重命名为 /api/modules/v1/controllers/PageController.php，编辑代码" width="1178" height="496" sizes="auto, (max-width: 1178px) 100vw, 1178px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2255" loading="lazy" class="size-full wp-image-2255 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135837620.png" alt="/api/modules/v1/controllers/DefaultController.php 重命名为 /api/modules/v1/controllers/PageController.php，编辑代码" width="1178" height="496" sizes="auto, (max-width: 1178px) 100vw, 1178px" /></a></p>
<p id="caption-attachment-2255" class="wp-caption-text">图49</p>
</div>
<p>50、要在应用中使用模块，只需要将模块加入到应用主体配置的[[yii/base/Application::modules|modules]]属性的列表中， 如下代码的应用主体配置 使用 v1 模块，编辑 /api/config/web.php，如图50</p>
<pre class="brush: php; title: ; notranslate" title="">
    'modules' =&gt; [
        'v1' =&gt; [
            'class' =&gt; api/modules/v1/Module::class,
        ],
        'i18n' =&gt; [
            'class' =&gt; api/modules/i18n/Module::class,
            'defaultRoute' =&gt; 'i18n-message/index'
        ]
    ],
</pre>
<p><div id="attachment_2256" style="width: 1435px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135839929.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2256" loading="lazy" class="size-full wp-image-2256" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135839929.png" alt="要在应用中使用模块，只需要将模块加入到应用主体配置的[[yii/base/Application::modules|modules]]属性的列表中， 如下代码的应用主体配置 使用 v1 模块，编辑 /api/config/web.php" width="1425" height="786" sizes="auto, (max-width: 1425px) 100vw, 1425px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2256" loading="lazy" class="size-full wp-image-2256 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135839929.png" alt="要在应用中使用模块，只需要将模块加入到应用主体配置的[[yii/base/Application::modules|modules]]属性的列表中， 如下代码的应用主体配置 使用 v1 模块，编辑 /api/config/web.php" width="1425" height="786" sizes="auto, (max-width: 1425px) 100vw, 1425px" /></a></p>
<p id="caption-attachment-2256" class="wp-caption-text">图50</p>
</div>
<p>51、配置URL规则，修改有关在应用程序配置的urlManager组件的配置，以支持 v1 模块，编辑：/api/config/_urlManager.php，如图51<br />注：通过配置 only 选项来明确列出哪些行为支持，v1/page 仅支持：&#8217;index&#8217;, &#8216;update&#8217;, &#8216;delete&#8217;, &#8216;options&#8217;</p>
<pre class="brush: php; title: ; notranslate" title="">
&lt;?php return [ 'class' =&gt; yii/web/UrlManager::class,
    'enablePrettyUrl' =&gt; true,
    'enableStrictParsing' =&gt; true,
    'showScriptName' =&gt; false,
    'rules' =&gt; [
        [
            'class' =&gt; 'yii/rest/UrlRule',
            'controller' =&gt; ['v1/page'],
            'only' =&gt; ['index', 'update', 'delete', 'options'],
        ],
    ],
];

</pre>
<div id="attachment_2257" style="width: 1401px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135840859.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2257" loading="lazy" class="size-full wp-image-2257" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135840859.png" alt="配置URL规则，修改有关在应用程序配置的urlManager组件的配置，以支持 v1 模块，编辑：/api/config/_urlManager.php" width="1391" height="619" sizes="auto, (max-width: 1391px) 100vw, 1391px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2257" loading="lazy" class="size-full wp-image-2257 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135840859.png" alt="配置URL规则，修改有关在应用程序配置的urlManager组件的配置，以支持 v1 模块，编辑：/api/config/_urlManager.php" width="1391" height="619" sizes="auto, (max-width: 1391px) 100vw, 1391px" /></a></p>
<p id="caption-attachment-2257" class="wp-caption-text">图51</p>
</div>
<p>52、在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages ，200响应，如图52</p>
<pre class="brush: plain; title: ; notranslate" title="">
[
    {
        &quot;id&quot;: 1,
        &quot;slug&quot;: &quot;about&quot;,
        &quot;title&quot;: &quot;About&quot;,
        &quot;body&quot;: &quot;Lorem ipsum dolor sit amet, consectetur adipiscing elit.&quot;,
        &quot;view&quot;: null,
        &quot;status&quot;: 1,
        &quot;created_at&quot;: 1514860785,
        &quot;updated_at&quot;: 1514860785
    }
]
</pre>
<div id="attachment_2258" style="width: 892px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135841562.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2258" loading="lazy" class="size-full wp-image-2258" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135841562.png" alt="在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages ，200响应" width="882" height="601" sizes="auto, (max-width: 882px) 100vw, 882px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2258" loading="lazy" class="size-full wp-image-2258 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135841562.png" alt="在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages ，200响应" width="882" height="601" sizes="auto, (max-width: 882px) 100vw, 882px" /></a></p>
<p id="caption-attachment-2258" class="wp-caption-text">图52</p>
</div>
<p>53、测试 only 选项，在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages/1 ，405响应(不被允许的方法。因为 &#8216;view&#8217; 行为不被支持)，测试通过，如图53</p>
<div id="attachment_2259" style="width: 1525px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135842218.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2259" loading="lazy" class="size-full wp-image-2259" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135842218.png" alt="测试 only 选项，在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages/1 ，405响应(不被允许的方法。因为 'view' 行为不被支持)，测试通过" width="1515" height="356" sizes="auto, (max-width: 1515px) 100vw, 1515px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2259" loading="lazy" class="size-full wp-image-2259 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135842218.png" alt="测试 only 选项，在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages/1 ，405响应(不被允许的方法。因为 'view' 行为不被支持)，测试通过" width="1515" height="356" sizes="auto, (max-width: 1515px) 100vw, 1515px" /></a></p>
<p id="caption-attachment-2259" class="wp-caption-text">图53</p>
</div>
<p>54、配置URL规则，修改有关在应用程序配置的urlManager组件的配置，以支持 v1 模块，编辑：/api/config/_urlManager.php，如图54<br />注：取消配置 only 选项，以后续支持所有行为</p>
<pre class="brush: php; title: ; notranslate" title="">
&lt;?php return [ 'class' =&gt; yii/web/UrlManager::class,
    'enablePrettyUrl' =&gt; true,
    'enableStrictParsing' =&gt; true,
    'showScriptName' =&gt; false,
    'rules' =&gt; [
        [
            'class' =&gt; 'yii/rest/UrlRule',
            'controller' =&gt; ['v1/page'],
        ],
    ],
];

</pre>
<div id="attachment_2260" style="width: 1233px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135842219.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2260" loading="lazy" class="size-full wp-image-2260" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135842219.png" alt="配置URL规则，修改有关在应用程序配置的urlManager组件的配置，以支持 v1 模块，编辑：/api/config/_urlManager.php" width="1223" height="557" sizes="auto, (max-width: 1223px) 100vw, 1223px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2260" loading="lazy" class="size-full wp-image-2260 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135842219.png" alt="配置URL规则，修改有关在应用程序配置的urlManager组件的配置，以支持 v1 模块，编辑：/api/config/_urlManager.php" width="1223" height="557" sizes="auto, (max-width: 1223px) 100vw, 1223px" /></a></p>
<p id="caption-attachment-2260" class="wp-caption-text">图54</p>
</div>
<p>55、在 Postman 中，GET http://www.cmcp-api.localhost/v1 ，404响应，格式为HMTL，如图55</p>
<pre class="brush: xml; title: ; notranslate" title="">
&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en-US&quot;&gt;
    &lt;head&gt;
        &lt;meta charset=&quot;UTF-8&quot;&gt;
        &lt;meta content='width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no' name='viewport'&gt;
        &lt;meta name=&quot;csrf-param&quot; content=&quot;_csrf&quot;&gt;
        &lt;meta name=&quot;csrf-token&quot; content=&quot;MtUm8pVxEHfmqhYMruxdUyScsktaMyFDc350jW_XR7dzmGqaoDRyT7bPc13M2W0AVNuGISJSbQUYOFn9LKNzgQ==&quot;&gt;
        &lt;title&gt;Not Found (#404)&lt;/title&gt;
        &lt;link href=&quot;/assets/95b60493/themes/smoothness/jquery-ui.css?v=1514958071&quot; rel=&quot;stylesheet&quot;&gt;
        &lt;link href=&quot;/assets/7635f0fe/css/bootstrap.css?v=1512021376&quot; rel=&quot;stylesheet&quot;&gt;
        &lt;link href=&quot;/assets/1ee3df8/css/font-awesome.min.css?v=1512021376&quot; rel=&quot;stylesheet&quot;&gt;
        &lt;link href=&quot;/assets/541f775b/css/AdminLTE.min.css?v=1512021373&quot; rel=&quot;stylesheet&quot;&gt;
        &lt;link href=&quot;/assets/541f775b/css/skins/_all-skins.min.css?v=1512021373&quot; rel=&quot;stylesheet&quot;&gt;
        &lt;link href=&quot;/css/style.css?v=1512021342&quot; rel=&quot;stylesheet&quot;&gt;

    &lt;/head&gt;
    &lt;body class=&quot; skin-blue &quot;&gt;
    &lt;/body&gt;
&lt;/html&gt;
</pre>
<div id="attachment_2261" style="width: 1473px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135844191.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2261" loading="lazy" class="size-full wp-image-2261" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135844191.png" alt="在 Postman 中，GET http://www.cmcp-api.localhost/v1 ，404响应，格式为HMTL" width="1463" height="755" sizes="auto, (max-width: 1463px) 100vw, 1463px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2261" loading="lazy" class="size-full wp-image-2261 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135844191.png" alt="在 Postman 中，GET http://www.cmcp-api.localhost/v1 ，404响应，格式为HMTL" width="1463" height="755" sizes="auto, (max-width: 1463px) 100vw, 1463px" /></a></p>
<p id="caption-attachment-2261" class="wp-caption-text">图55</p>
</div>
<p>56、对于404响应格式为HTML的解决，编辑 /api/config/web.php，设置默认的响应格式为JSON，如图56</p>
<pre class="brush: php; title: ; notranslate" title="">
        'response' =&gt; [
            'format' =&gt; yii/web/Response::FORMAT_JSON,
        ],
</pre>
<div id="attachment_2262" style="width: 1429px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135845166.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2262" loading="lazy" class="size-full wp-image-2262" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135845166.png" alt="对于404响应格式为HTML的解决，编辑 /api/config/web.php，设置默认的响应格式为JSON" width="1419" height="770" sizes="auto, (max-width: 1419px) 100vw, 1419px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2262" loading="lazy" class="size-full wp-image-2262 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135845166.png" alt="对于404响应格式为HTML的解决，编辑 /api/config/web.php，设置默认的响应格式为JSON" width="1419" height="770" sizes="auto, (max-width: 1419px) 100vw, 1419px" /></a></p>
<p id="caption-attachment-2262" class="wp-caption-text">图56</p>
</div>
<p>57、在 Postman 中，GET http://www.cmcp-api.localhost/v1 ，404响应，格式为JSON，如图57</p>
<pre class="brush: plain; title: ; notranslate" title="">
{
    &quot;name&quot;: &quot;Not Found&quot;,
    &quot;message&quot;: &quot;Page not found.&quot;,
    &quot;code&quot;: 0,
    &quot;status&quot;: 404,
    &quot;type&quot;: &quot;yii//web//NotFoundHttpException&quot;
}
</pre>
<div id="attachment_2263" style="width: 718px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135846918.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2263" loading="lazy" class="size-full wp-image-2263" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135846918.png" alt="在 Postman 中，GET http://www.cmcp-api.localhost/v1 ，404响应，格式为JSON" width="708" height="538" sizes="auto, (max-width: 708px) 100vw, 708px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2263" loading="lazy" class="size-full wp-image-2263 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135846918.png" alt="在 Postman 中，GET http://www.cmcp-api.localhost/v1 ，404响应，格式为JSON" width="708" height="538" sizes="auto, (max-width: 708px) 100vw, 708px" /></a></p>
<p id="caption-attachment-2263" class="wp-caption-text">图57</p>
</div>
<p>58、数据序列化的实现，在响应主体内包含分页信息来简化客户端的开发工作，编辑 /api/controllers/PageController.php，如图58</p>
<pre class="brush: php; title: ; notranslate" title="">
&lt;?php namespace api/controllers; use yii/rest/ActiveController; class PageController extends ActiveController { public $serializer = [ 'class' =&gt; 'yii/rest/Serializer',
        'collectionEnvelope' =&gt; 'items',
    ];
}

</pre>
<div id="attachment_2264" style="width: 1053px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135847429.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2264" loading="lazy" class="size-full wp-image-2264" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135847429.png" alt="数据序列化的实现，在响应主体内包含分页信息来简化客户端的开发工作，编辑 /api/controllers/PageController.php" width="1043" height="538" sizes="auto, (max-width: 1043px) 100vw, 1043px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2264" loading="lazy" class="size-full wp-image-2264 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135847429.png" alt="数据序列化的实现，在响应主体内包含分页信息来简化客户端的开发工作，编辑 /api/controllers/PageController.php" width="1043" height="538" sizes="auto, (max-width: 1043px) 100vw, 1043px" /></a></p>
<p id="caption-attachment-2264" class="wp-caption-text">图58</p>
</div>
<p>59、在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages ，200响应，在响应主体内包含分页信息，如图59</p>
<pre class="brush: plain; title: ; notranslate" title="">
{
    &quot;items&quot;: [
        {
            &quot;id&quot;: 1,
            &quot;slug&quot;: &quot;about&quot;,
            &quot;title&quot;: &quot;About&quot;,
            &quot;body&quot;: &quot;Lorem ipsum dolor sit amet, consectetur adipiscing elit.&quot;,
            &quot;view&quot;: null,
            &quot;status&quot;: 1,
            &quot;created_at&quot;: 1514860785,
            &quot;updated_at&quot;: 1514860785
        }
    ],
    &quot;_links&quot;: {
        &quot;self&quot;: {
            &quot;href&quot;: &quot;http://www.cmcp-api.localhost/v1/pages?page=1&quot;
        }
    },
    &quot;_meta&quot;: {
        &quot;totalCount&quot;: 1,
        &quot;pageCount&quot;: 1,
        &quot;currentPage&quot;: 1,
        &quot;perPage&quot;: 20
    }
}
</pre>
<div id="attachment_2265" style="width: 1038px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135848371.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2265" loading="lazy" class="size-full wp-image-2265" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135848371.png" alt="在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages ，200响应，在响应主体内包含分页信息" width="1028" height="734" sizes="auto, (max-width: 1028px) 100vw, 1028px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2265" loading="lazy" class="size-full wp-image-2265 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135848371.png" alt="在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages ，200响应，在响应主体内包含分页信息" width="1028" height="734" sizes="auto, (max-width: 1028px) 100vw, 1028px" /></a></p>
<p id="caption-attachment-2265" class="wp-caption-text">图59</p>
</div>
<p>60、RESTful APIs 通常是无状态的，因此，配置 user 应用组件，编辑 /api/config/web.php，如图60<br />注：配置user 应用组件:<br />设置 [[yii/web/User::enableSession|enableSession]] 属性为 false.<br />设置 [[yii/web/User::loginUrl|loginUrl]] 属性为null 显示一个HTTP 403 错误而不是跳转到登录界面.</p>
<pre class="brush: php; title: ; notranslate" title="">
        'user' =&gt; [
            'class' =&gt; yii/web/User::class,
            'identityClass' =&gt; common/models/User::class,
            'enableSession' =&gt; false,
            'loginUrl' =&gt; null,
            'enableAutoLogin' =&gt; false,
            'as afterLogin' =&gt; common/behaviors/LoginTimestampBehavior::class
        ],
</pre>
<div id="attachment_2266" style="width: 1608px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135849528.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2266" loading="lazy" class="size-full wp-image-2266" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135849528.png" alt="RESTful APIs 通常是无状态的，因此，配置 user 应用组件，编辑 /api/config/web.php" width="1598" height="665" sizes="auto, (max-width: 1598px) 100vw, 1598px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2266" loading="lazy" class="size-full wp-image-2266 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135849528.png" alt="RESTful APIs 通常是无状态的，因此，配置 user 应用组件，编辑 /api/config/web.php" width="1598" height="665" sizes="auto, (max-width: 1598px) 100vw, 1598px" /></a></p>
<p id="caption-attachment-2266" class="wp-caption-text">图60</p>
</div>
<p>61、复制目录 /vendor/yiisoft/yii2/rest 下的 Action.php、IndexAction.php、ViewAction.php、CreateAction.php、UpdateAction.php、DeleteAction.php、Serializer.php 至目录 /api/rests/page，如图61</p>
<div id="attachment_2267" style="width: 466px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135850540.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2267" loading="lazy" class="size-full wp-image-2267" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135850540.png" alt="复制目录 /vendor/yiisoft/yii2/rest 下的 Action.php、IndexAction.php、ViewAction.php、CreateAction.php、UpdateAction.php、DeleteAction.php、Serializer.php 至目录 /api/rests/page" width="456" height="639" sizes="auto, (max-width: 456px) 100vw, 456px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2267" loading="lazy" class="size-full wp-image-2267 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135850540.png" alt="复制目录 /vendor/yiisoft/yii2/rest 下的 Action.php、IndexAction.php、ViewAction.php、CreateAction.php、UpdateAction.php、DeleteAction.php、Serializer.php 至目录 /api/rests/page" width="456" height="639" sizes="auto, (max-width: 456px) 100vw, 456px" /></a></p>
<p id="caption-attachment-2267" class="wp-caption-text">图61</p>
</div>
<p>62、如果为多个单词组合的目录，建议目录使用小写+下划线，参考网址：https://github.com/hfcorriez/fig-standards/blob/master/accepted/zh_CN/PSR-0.md ，编辑 /api/controllers/PageController.php，如图62</p>
<pre class="brush: php; title: ; notranslate" title="">
&lt;?php namespace api/controllers; use yii/rest/ActiveController; class PageController extends ActiveController { public $serializer = [ 'class' =&gt; 'api/rests/page/Serializer',
        'collectionEnvelope' =&gt; 'items',
    ];

    /**
     * @inheritdoc
     */
    public function actions()
    {
        return [
            'index' =&gt; [
                'class' =&gt; 'api/rests/page/IndexAction',
                'modelClass' =&gt; $this-&gt;modelClass,
                'checkAccess' =&gt; [$this, 'checkAccess'],
            ],
            'view' =&gt; [
                'class' =&gt; 'api/rests/page/ViewAction',
                'modelClass' =&gt; $this-&gt;modelClass,
                'checkAccess' =&gt; [$this, 'checkAccess'],
            ],
            'create' =&gt; [
                'class' =&gt; 'api/rests/page/CreateAction',
                'modelClass' =&gt; $this-&gt;modelClass,
                'checkAccess' =&gt; [$this, 'checkAccess'],
                'scenario' =&gt; $this-&gt;createScenario,
            ],
            'update' =&gt; [
                'class' =&gt; 'api/rests/page/UpdateAction',
                'modelClass' =&gt; $this-&gt;modelClass,
                'checkAccess' =&gt; [$this, 'checkAccess'],
                'scenario' =&gt; $this-&gt;updateScenario,
            ],
            'delete' =&gt; [
                'class' =&gt; 'api/rests/page/DeleteAction',
                'modelClass' =&gt; $this-&gt;modelClass,
                'checkAccess' =&gt; [$this, 'checkAccess'],
            ],
            'options' =&gt; [
                'class' =&gt; 'yii/rest/OptionsAction',
            ],
        ];
    }
}

</pre>
<p>注：如果仅支持较少的行为，可以选择下面的方案，例</p>
<pre class="brush: php; title: ; notranslate" title="">
    public function actions()
    {
        $actions = parent::actions();
        
        $actions['view']['class'] = 'api/rests/page/ViewAction';

        return $actions;
    }
</pre>
<div id="attachment_2268" style="width: 1271px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135851571.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2268" loading="lazy" class="size-full wp-image-2268" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135851571.png" alt="如果为多个单词组合的目录，建议目录使用小写+下划线，参考网址：https://github.com/hfcorriez/fig-standards/blob/master/accepted/zh_CN/PSR-0.md ，编辑 /api/controllers/PageController.php" width="1261" height="914" sizes="auto, (max-width: 1261px) 100vw, 1261px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2268" loading="lazy" class="size-full wp-image-2268 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135851571.png" alt="如果为多个单词组合的目录，建议目录使用小写+下划线，参考网址：https://github.com/hfcorriez/fig-standards/blob/master/accepted/zh_CN/PSR-0.md ，编辑 /api/controllers/PageController.php" width="1261" height="914" sizes="auto, (max-width: 1261px) 100vw, 1261px" /></a></p>
<p id="caption-attachment-2268" class="wp-caption-text">图62</p>
</div>
<p>63、编辑 /api/rests/page/IndexAction.php，调整命名空间、继承关系、查询条件等，如图63</p>
<pre class="brush: php; title: ; notranslate" title="">
&lt;?php
/**
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */

namespace api/rests/page;

use Yii;
use yii/data/ActiveDataProvider;

/**
 * IndexAction implements the API endpoint for listing multiple models.
 *
 * For more details and usage information on IndexAction, see the [guide article on rest controllers](guide:rest-controllers).
 *
 * @author Qiang Wang &lt;shuijingwanwq@163.com&gt;
 * @since 1.0
 */
class IndexAction extends /yii/rest/IndexAction
{
    const STATUS_INACTIVE = 0; //状态：不活跃
    const STATUS_ACTIVE = 1; //状态：活跃

    /**
     * Prepares the data provider that should return the requested collection of the models.
     * @return ActiveDataProvider
     */
    protected function prepareDataProvider()
    {
        $requestParams = Yii::$app-&gt;getRequest()-&gt;getBodyParams();
        if (empty($requestParams)) {
            $requestParams = Yii::$app-&gt;getRequest()-&gt;getQueryParams();
        }

        $filter = null;
        if ($this-&gt;dataFilter !== null) {
            $this-&gt;dataFilter = Yii::createObject($this-&gt;dataFilter);
            if ($this-&gt;dataFilter-&gt;load($requestParams)) {
                $filter = $this-&gt;dataFilter-&gt;build();
                if ($filter === false) {
                    return $this-&gt;dataFilter;
                }
            }
        }

        if ($this-&gt;prepareDataProvider !== null) {
            return call_user_func($this-&gt;prepareDataProvider, $this, $filter);
        }

        /* @var $modelClass /yii/db/BaseActiveRecord */
        $modelClass = $this-&gt;modelClass;

        $query = $modelClass::find()-&gt;where(['status' =&gt; self::STATUS_ACTIVE]);
        if (!empty($filter)) {
            $query-&gt;andWhere($filter);
        }

        return Yii::createObject([
            'class' =&gt; ActiveDataProvider::className(),
            'query' =&gt; $query,
            'pagination' =&gt; [
                'params' =&gt; $requestParams,
            ],
            'sort' =&gt; [
                'params' =&gt; $requestParams,
            ],
        ]);
    }
}

</pre>
<div id="attachment_2269" style="width: 1449px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135852579.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2269" loading="lazy" class="size-full wp-image-2269" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135852579.png" alt="编辑 /api/rests/page/IndexAction.php，调整命名空间、继承关系、查询条件等" width="1439" height="894" sizes="auto, (max-width: 1439px) 100vw, 1439px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2269" loading="lazy" class="size-full wp-image-2269 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135852579.png" alt="编辑 /api/rests/page/IndexAction.php，调整命名空间、继承关系、查询条件等" width="1439" height="894" sizes="auto, (max-width: 1439px) 100vw, 1439px" /></a></p>
<p id="caption-attachment-2269" class="wp-caption-text">图63</p>
</div>
<p>64、编辑 /api/rests/page/Serializer.php，调整命名空间、继承关系、响应结构(响应成功：&#8221;code&#8221;: 10000,&#8221;message&#8221;,&#8221;data&#8221;；响应失败：&#8221;code&#8221;: 不等于10000的其他数字,&#8221;message&#8221;)等，如图64</p>
<pre class="brush: php; title: ; notranslate" title="">
&lt;?php
/**
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */

namespace api/rests/page;

use Yii;
use yii/data/DataProviderInterface;

/**
 * Serializer converts resource objects and collections into array representation.
 *
 * Serializer is mainly used by REST controllers to convert different objects into array representation
 * so that they can be further turned into different formats, such as JSON, XML, by response formatters.
 *
 * The default implementation handles resources as [[Model]] objects and collections as objects
 * implementing [[DataProviderInterface]]. You may override [[serialize()]] to handle more types.
 *
 * @author Qiang Wang &lt;shuijingwanwq@163.com&gt;
 * @since 1.0
 */
class Serializer extends /yii/rest/Serializer
{
    /**
     * Serializes a data provider.
     * @param DataProviderInterface $dataProvider
     * @return array the array representation of the data provider.
     */
    protected function serializeDataProvider($dataProvider)
    {
        if ($this-&gt;preserveKeys) {
            $models = $dataProvider-&gt;getModels();
        } else {
            $models = array_values($dataProvider-&gt;getModels());
        }
        $models = $this-&gt;serializeModels($models);

        if (($pagination = $dataProvider-&gt;getPagination()) !== false) {
            $this-&gt;addPaginationHeaders($pagination);
        }

        if ($this-&gt;request-&gt;getIsHead()) {
            return null;
        } elseif ($this-&gt;collectionEnvelope === null) {
            return $models;
        }

        $result = [
            $this-&gt;collectionEnvelope =&gt; $models,
        ];

        if (empty($result['items'])) {
            return ['code' =&gt; 20001, 'message' =&gt; Yii::t('error', '20001')];
        }

        if ($pagination !== false) {
            return ['code' =&gt; 10000, 'message' =&gt; Yii::t('app', '10001'), 'data' =&gt; array_merge($result, $this-&gt;serializePagination($pagination))];
        }

        return ['code' =&gt; 10000, 'message' =&gt; Yii::t('app', '10001'), 'data' =&gt; $result];
    }
}

</pre>
<div id="attachment_2270" style="width: 1728px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135854709.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2270" loading="lazy" class="size-full wp-image-2270" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135854709.png" alt="编辑 /api/rests/page/Serializer.php，调整命名空间、继承关系、响应结构(响应成功：&quot;code&quot;: 10000,&quot;message&quot;,&quot;data&quot;；响应失败：&quot;code&quot;: 不等于10000的其他数字,&quot;message&quot;)等" width="1718" height="890" sizes="auto, (max-width: 1718px) 100vw, 1718px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2270" loading="lazy" class="size-full wp-image-2270 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135854709.png" alt="编辑 /api/rests/page/Serializer.php，调整命名空间、继承关系、响应结构(响应成功：&quot;code&quot;: 10000,&quot;message&quot;,&quot;data&quot;；响应失败：&quot;code&quot;: 不等于10000的其他数字,&quot;message&quot;)等" width="1718" height="890" sizes="auto, (max-width: 1718px) 100vw, 1718px" /></a></p>
<p id="caption-attachment-2270" class="wp-caption-text">图64</p>
</div>
<p>65、编辑 /api/config/base.php，配置接口应用的 i18n 应用组件 ，如图65</p>
<pre class="brush: php; title: ; notranslate" title="">
        'i18n' =&gt; [
            'translations' =&gt; [
                'model/*'=&gt; [
                    'class' =&gt; 'yii/i18n/PhpMessageSource',
                    'forceTranslation' =&gt; true,
                    'basePath'=&gt;'@common/messages',
                    'fileMap'=&gt;[
                    ],
                ],
                'app'=&gt; [
                    'class' =&gt; 'yii/i18n/PhpMessageSource',
                    'forceTranslation' =&gt; true,
                    'basePath'=&gt;'@api/messages',
                    'fileMap'=&gt;[
                    ],
                ],
                '*'=&gt; [
                    'class' =&gt; 'yii/i18n/PhpMessageSource',
                    'forceTranslation' =&gt; true,
                    'basePath'=&gt;'@api/messages',
                    'fileMap'=&gt;[
                    ],
                ],
            ],
        ],
</pre>
<div id="attachment_2312" style="width: 1272px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135855503.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2312" loading="lazy" class="size-full wp-image-2312" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135855503.png" alt="编辑 /api/config/base.php，配置接口应用的 i18n 应用组件" width="1262" height="920" sizes="auto, (max-width: 1262px) 100vw, 1262px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2312" loading="lazy" class="size-full wp-image-2312 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135855503.png" alt="编辑 /api/config/base.php，配置接口应用的 i18n 应用组件" width="1262" height="920" sizes="auto, (max-width: 1262px) 100vw, 1262px" /></a></p>
<p id="caption-attachment-2312" class="wp-caption-text">图65</p>
</div>
<p>66、新建语言包文件：/api/messages/zh/error.php(简体中文、响应失败)，如图66</p>
<pre class="brush: php; title: ; notranslate" title="">
return [
    20000 =&gt; 'error',
    20001 =&gt; '页面列表为空',
];
</pre>
<div id="attachment_2272" style="width: 795px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135856857.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2272" loading="lazy" class="size-full wp-image-2272" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135856857.png" alt="新建语言包文件：/api/messages/zh/error.php(简体中文、响应失败)" width="785" height="429" sizes="auto, (max-width: 785px) 100vw, 785px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2272" loading="lazy" class="size-full wp-image-2272 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031135856857.png" alt="新建语言包文件：/api/messages/zh/error.php(简体中文、响应失败)" width="785" height="429" sizes="auto, (max-width: 785px) 100vw, 785px" /></a></p>
<p id="caption-attachment-2272" class="wp-caption-text">图66</p>
</div>
<p>67、新建语言包文件：/api/messages/en/app.php(英语美国、响应成功)，如图67</p>
<pre class="brush: php; title: ; notranslate" title="">
return [
    10000 =&gt; 'success',
    10001 =&gt; 'Get page list is successful',
];
</pre>
<div id="attachment_2273" style="width: 1177px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143816272.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2273" loading="lazy" class="size-full wp-image-2273" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143816272.png" alt="新建语言包文件：/api/messages/en/app.php(英语美国、响应成功)" width="1167" height="600" sizes="auto, (max-width: 1167px) 100vw, 1167px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2273" loading="lazy" class="size-full wp-image-2273 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143816272.png" alt="新建语言包文件：/api/messages/en/app.php(英语美国、响应成功)" width="1167" height="600" sizes="auto, (max-width: 1167px) 100vw, 1167px" /></a></p>
<p id="caption-attachment-2273" class="wp-caption-text">图67</p>
</div>
<p>68、新建语言包文件：/api/messages/en/error.php(英语美国、响应失败)，如图68</p>
<pre class="brush: php; title: ; notranslate" title="">
return [
    20000 =&gt; 'error',
    20001 =&gt; 'Page list is empty',
];
</pre>
<div id="attachment_2274" style="width: 1175px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143818253.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2274" loading="lazy" class="size-full wp-image-2274" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143818253.png" alt="新建语言包文件：/api/messages/en/error.php(英语美国、响应失败)" width="1165" height="603" sizes="auto, (max-width: 1165px) 100vw, 1165px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2274" loading="lazy" class="size-full wp-image-2274 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143818253.png" alt="新建语言包文件：/api/messages/en/error.php(英语美国、响应失败)" width="1165" height="603" sizes="auto, (max-width: 1165px) 100vw, 1165px" /></a></p>
<p id="caption-attachment-2274" class="wp-caption-text">图68</p>
</div>
<p>69、打开网址：http://backend.cmcp-api.localhost/page/update?id=1 ，编辑文章，活跃复选框取消选中，如图69</p>
<div id="attachment_2275" style="width: 485px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143818281.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2275" loading="lazy" class="size-full wp-image-2275" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143818281.png" alt="打开网址：http://backend.cmcp-api.localhost/page/update?id=1 ，编辑文章，活跃复选框取消选中" width="475" height="816" sizes="auto, (max-width: 475px) 100vw, 475px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2275" loading="lazy" class="size-full wp-image-2275 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143818281.png" alt="打开网址：http://backend.cmcp-api.localhost/page/update?id=1 ，编辑文章，活跃复选框取消选中" width="475" height="816" sizes="auto, (max-width: 475px) 100vw, 475px" /></a></p>
<p id="caption-attachment-2275" class="wp-caption-text">图69</p>
</div>
<p>70、在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages ，200响应，状态为活跃的页面列表为空，如图70<br />注：<br />Accept application/json; version=0.0</p>
<pre class="brush: plain; title: ; notranslate" title="">
{
    &quot;code&quot;: 20001,
    &quot;message&quot;: &quot;Page list is empty&quot;
}
</pre>
<div id="attachment_2276" style="width: 827px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143819491.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2276" loading="lazy" class="size-full wp-image-2276" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143819491.png" alt="在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages ，200响应，状态为活跃的页面列表为空" width="817" height="373" sizes="auto, (max-width: 817px) 100vw, 817px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2276" loading="lazy" class="size-full wp-image-2276 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143819491.png" alt="在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages ，200响应，状态为活跃的页面列表为空" width="817" height="373" sizes="auto, (max-width: 817px) 100vw, 817px" /></a></p>
<p id="caption-attachment-2276" class="wp-caption-text">图70</p>
</div>
<p>71、在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages ，200响应，状态为活跃的页面列表为空，如图71<br />注：<br />Accept application/json; version=0.0<br />Accept-Language zh-CN</p>
<pre class="brush: plain; title: ; notranslate" title="">
{
    &quot;code&quot;: 20001,
    &quot;message&quot;: &quot;页面列表为空&quot;
}
</pre>
<div id="attachment_2277" style="width: 769px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143820994.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2277" loading="lazy" class="size-full wp-image-2277" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143820994.png" alt="在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages ，200响应，状态为活跃的页面列表为空" width="759" height="490" sizes="auto, (max-width: 759px) 100vw, 759px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2277" loading="lazy" class="size-full wp-image-2277 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143820994.png" alt="在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages ，200响应，状态为活跃的页面列表为空" width="759" height="490" sizes="auto, (max-width: 759px) 100vw, 759px" /></a></p>
<p id="caption-attachment-2277" class="wp-caption-text">图71</p>
</div>
<p>72、打开网址：http://backend.cmcp-api.localhost/page/update?id=1 ，编辑文章，活跃复选框勾选，如图72</p>
<div id="attachment_2278" style="width: 480px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143821651.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2278" loading="lazy" class="size-full wp-image-2278" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143821651.png" alt="打开网址：http://backend.cmcp-api.localhost/page/update?id=1 ，编辑文章，活跃复选框勾选" width="470" height="858" sizes="auto, (max-width: 470px) 100vw, 470px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2278" loading="lazy" class="size-full wp-image-2278 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143821651.png" alt="打开网址：http://backend.cmcp-api.localhost/page/update?id=1 ，编辑文章，活跃复选框勾选" width="470" height="858" sizes="auto, (max-width: 470px) 100vw, 470px" /></a></p>
<p id="caption-attachment-2278" class="wp-caption-text">图72</p>
</div>
<p>73、在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages ，200响应，状态为活跃的页面列表不为空，如图73<br />注：<br />Accept application/json; version=0.0<br />Accept-Language en-US</p>
<pre class="brush: plain; title: ; notranslate" title="">
{
    &quot;code&quot;: 10000,
    &quot;message&quot;: &quot;Get page list is successful&quot;,
    &quot;data&quot;: {
        &quot;items&quot;: [
            {
                &quot;id&quot;: 1,
                &quot;slug&quot;: &quot;about&quot;,
                &quot;title&quot;: &quot;About&quot;,
                &quot;body&quot;: &quot;

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

&quot;,
                &quot;view&quot;: &quot;&quot;,
                &quot;status&quot;: 1,
                &quot;created_at&quot;: 1514860785,
                &quot;updated_at&quot;: 1515482758
            }
        ],
        &quot;_links&quot;: {
            &quot;self&quot;: {
                &quot;href&quot;: &quot;http://www.cmcp-api.localhost/v1/pages?page=1&quot;
            }
        },
        &quot;_meta&quot;: {
            &quot;totalCount&quot;: 1,
            &quot;pageCount&quot;: 1,
            &quot;currentPage&quot;: 1,
            &quot;perPage&quot;: 20
        }
    }
}
</pre>
<div id="attachment_2279" style="width: 1176px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143822229.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2279" loading="lazy" class="size-full wp-image-2279" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143822229.png" alt="在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages ，200响应，状态为活跃的页面列表不为空" width="1166" height="916" sizes="auto, (max-width: 1166px) 100vw, 1166px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2279" loading="lazy" class="size-full wp-image-2279 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143822229.png" alt="在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages ，200响应，状态为活跃的页面列表不为空" width="1166" height="916" sizes="auto, (max-width: 1166px) 100vw, 1166px" /></a></p>
<p id="caption-attachment-2279" class="wp-caption-text">图73</p>
</div>
<p>74、在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages ，200响应，状态为活跃的页面列表不为空，如图74<br />注：<br />Accept application/json; version=0.0<br />Accept-Language zh-CN</p>
<pre class="brush: plain; title: ; notranslate" title="">
{
    &quot;code&quot;: 10000,
    &quot;message&quot;: &quot;获取页面列表成功&quot;,
    &quot;data&quot;: {
        &quot;items&quot;: [
            {
                &quot;id&quot;: 1,
                &quot;slug&quot;: &quot;about&quot;,
                &quot;title&quot;: &quot;About&quot;,
                &quot;body&quot;: &quot;

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

&quot;,
                &quot;view&quot;: &quot;&quot;,
                &quot;status&quot;: 1,
                &quot;created_at&quot;: 1514860785,
                &quot;updated_at&quot;: 1515482758
            }
        ],
        &quot;_links&quot;: {
            &quot;self&quot;: {
                &quot;href&quot;: &quot;http://www.cmcp-api.localhost/v1/pages?page=1&quot;
            }
        },
        &quot;_meta&quot;: {
            &quot;totalCount&quot;: 1,
            &quot;pageCount&quot;: 1,
            &quot;currentPage&quot;: 1,
            &quot;perPage&quot;: 20
        }
    }
}
</pre>
<div id="attachment_2280" style="width: 982px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143823913.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2280" loading="lazy" class="size-full wp-image-2280" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143823913.png" alt="在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages ，200响应，状态为活跃的页面列表不为空" width="972" height="920" sizes="auto, (max-width: 972px) 100vw, 972px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2280" loading="lazy" class="size-full wp-image-2280 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143823913.png" alt="在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages ，200响应，状态为活跃的页面列表不为空" width="972" height="920" sizes="auto, (max-width: 972px) 100vw, 972px" /></a></p>
<p id="caption-attachment-2280" class="wp-caption-text">图74</p>
</div>
<p>75、GET /pages/1: 返回页面 1 的详细信息，编辑 /api/rests/page/Action.php，调整命名空间、继承关系、响应结构等，如图75</p>
<pre class="brush: php; title: ; notranslate" title="">
&lt;?php
/**
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */

namespace api/rests/page;

use Yii;
use yii/db/ActiveRecordInterface;
use yii/web/NotFoundHttpException;

/**
 * Action is the base class for action classes that implement RESTful API.
 *
 * For more details and usage information on Action, see the [guide article on rest controllers](guide:rest-controllers).
 *
 * @author Qiang Wang &lt;shuijingwanwq@163.com&gt;
 * @since 1.0
 */
class Action extends /yii/rest/Action
{
    /**
     * Returns the data model based on the primary key given.
     * If the data model is not found, a 404 HTTP exception will be raised.
     * @param string $id the ID of the model to be loaded. If the model has a composite primary key,
     * the ID must be a string of the primary key values separated by commas.
     * The order of the primary key values should follow that returned by the `primaryKey()` method
     * of the model.
     * @return ActiveRecordInterface the model found
     * @throws NotFoundHttpException if the model cannot be found
     */
    public function findModel($id)
    {
        if ($this-&gt;findModel !== null) {
            return call_user_func($this-&gt;findModel, $id, $this);
        }

        /* @var $modelClass ActiveRecordInterface */
        $modelClass = $this-&gt;modelClass;
        $keys = $modelClass::primaryKey();
        if (count($keys) &gt; 1) {
            $values = explode(',', $id);
            if (count($keys) === count($values)) {
                $model = $modelClass::findOne(array_combine($keys, $values));
            }
        } elseif ($id !== null) {
            $model = $modelClass::findOne($id);
        }

        if (isset($model)) {
            return $model;
        }

        throw new NotFoundHttpException(Yii::t('error', Yii::t('error', Yii::t('error', '20002'), ['id' =&gt; $id])), 20002);
    }
}

</pre>
<div id="attachment_2281" style="width: 1734px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143824591.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2281" loading="lazy" class="size-full wp-image-2281" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143824591.png" alt="GET /pages/1: 返回页面 1 的详细信息，编辑 /api/rests/page/Action.php，调整命名空间、继承关系、响应结构等" width="1724" height="785" sizes="auto, (max-width: 1724px) 100vw, 1724px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2281" loading="lazy" class="size-full wp-image-2281 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143824591.png" alt="GET /pages/1: 返回页面 1 的详细信息，编辑 /api/rests/page/Action.php，调整命名空间、继承关系、响应结构等" width="1724" height="785" sizes="auto, (max-width: 1724px) 100vw, 1724px" /></a></p>
<p id="caption-attachment-2281" class="wp-caption-text">图75</p>
</div>
<p>76、编辑 /api/rests/page/ViewAction.php，调整命名空间、继承关系、响应结构等，如图76</p>
<pre class="brush: php; title: ; notranslate" title="">
&lt;?php
/**
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */

namespace api/rests/page;

use Yii;

/**
 * ViewAction implements the API endpoint for returning the detailed information about a model.
 *
 * For more details and usage information on ViewAction, see the [guide article on rest controllers](guide:rest-controllers).
 *
 * @author Qiang Wang &lt;shuijingwanwq@163.com&gt;
 * @since 1.0
 */
class ViewAction extends Action
{
    const STATUS_INACTIVE = 0; //状态：不活跃
    const STATUS_ACTIVE = 1; //状态：活跃

    /**
     * Displays a model.
     * @param string $id the primary key of the model.
     * @return /yii/db/ActiveRecordInterface the model being displayed
     */
    public function run($id)
    {
        $model = $this-&gt;findModel($id);
        if ($this-&gt;checkAccess) {
            call_user_func($this-&gt;checkAccess, $this-&gt;id, $model);
        }

        /* 判断状态，如果为不活跃，则返回失败 */
        if ($model-&gt;status === self::STATUS_INACTIVE) {
            return ['code' =&gt; 20003, 'message' =&gt; Yii::t('error', Yii::t('error', Yii::t('error', '20003'), ['id' =&gt; $id]))];
        }

        return ['code' =&gt; 10000, 'message' =&gt; Yii::t('app', '10002'), 'data' =&gt; $model];
    }
}

</pre>
<div id="attachment_2282" style="width: 1739px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143825775.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2282" loading="lazy" class="size-full wp-image-2282" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143825775.png" alt="编辑 /api/rests/page/ViewAction.php，调整命名空间、继承关系、响应结构等" width="1729" height="894" sizes="auto, (max-width: 1729px) 100vw, 1729px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2282" loading="lazy" class="size-full wp-image-2282 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143825775.png" alt="编辑 /api/rests/page/ViewAction.php，调整命名空间、继承关系、响应结构等" width="1729" height="894" sizes="auto, (max-width: 1729px) 100vw, 1729px" /></a></p>
<p id="caption-attachment-2282" class="wp-caption-text">图76</p>
</div>
<p>77、编辑语言包文件：/api/messages/zh/app.php(简体中文、响应成功)、/api/messages/zh/error.php(简体中文、响应失败)、/api/messages/en/app.php(英语美国、响应成功)、/api/messages/en/error.php(英语美国、响应失败)，如图77<br />/api/messages/zh/app.php</p>
<pre class="brush: php; title: ; notranslate" title="">
return [
    10000 =&gt; 'success',
    10001 =&gt; '获取页面列表成功',
    10002 =&gt; '获取页面详情成功',
];
</pre>
<p>/api/messages/zh/error.php</p>
<pre class="brush: php; title: ; notranslate" title="">
return [
    20000 =&gt; 'error',
    20001 =&gt; '页面列表为空',
    20002 =&gt; '页面ID：{id}，不存在',
    20003 =&gt; '页面ID：{id}，的状态不活跃',
];
</pre>
<p>/api/messages/en/app.php</p>
<pre class="brush: php; title: ; notranslate" title="">
return [
    10000 =&gt; 'success',
    10001 =&gt; 'Get page list is successful',
    10002 =&gt; 'Get page details succeeded',
];
</pre>
<p>/api/messages/en/error.php</p>
<pre class="brush: php; title: ; notranslate" title="">
return [
    20000 =&gt; 'error',
    20001 =&gt; 'Page list is empty',
    20002 =&gt; 'Page ID: {id}, does not exist',
    20003 =&gt; 'Page ID: {id}, the status is not active',
];
</pre>
<div id="attachment_2283" style="width: 971px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143826696.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2283" loading="lazy" class="size-full wp-image-2283" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143826696.png" alt="编辑语言包文件：/api/messages/zh/app.php(简体中文、响应成功)、/api/messages/zh/error.php(简体中文、响应失败)、/api/messages/en/app.php(英语美国、响应成功)、/api/messages/en/error.php(英语美国、响应失败)" width="961" height="348" sizes="auto, (max-width: 961px) 100vw, 961px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2283" loading="lazy" class="size-full wp-image-2283 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143826696.png" alt="编辑语言包文件：/api/messages/zh/app.php(简体中文、响应成功)、/api/messages/zh/error.php(简体中文、响应失败)、/api/messages/en/app.php(英语美国、响应成功)、/api/messages/en/error.php(英语美国、响应失败)" width="961" height="348" sizes="auto, (max-width: 961px) 100vw, 961px" /></a></p>
<p id="caption-attachment-2283" class="wp-caption-text">图77</p>
</div>
<p>78、在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages/1 ，200响应，其状态为活跃，如图78<br />注：<br />Accept application/json; version=0.0<br />Accept-Language zh-CN</p>
<pre class="brush: plain; title: ; notranslate" title="">
{
    &quot;code&quot;: 10000,
    &quot;message&quot;: &quot;获取页面详情成功&quot;,
    &quot;data&quot;: {
        &quot;id&quot;: 2,
        &quot;slug&quot;: &quot;contact&quot;,
        &quot;title&quot;: &quot;Contact&quot;,
        &quot;body&quot;: &quot;

Contact

&quot;,
        &quot;view&quot;: &quot;&quot;,
        &quot;status&quot;: 1,
        &quot;created_at&quot;: 1515488912,
        &quot;updated_at&quot;: 1515488912
    }
}
</pre>
<div id="attachment_2284" style="width: 815px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143827803.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2284" loading="lazy" class="size-full wp-image-2284" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143827803.png" alt="在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages/1 ，200响应，其状态为活跃" width="805" height="621" sizes="auto, (max-width: 805px) 100vw, 805px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2284" loading="lazy" class="size-full wp-image-2284 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143827803.png" alt="在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages/1 ，200响应，其状态为活跃" width="805" height="621" sizes="auto, (max-width: 805px) 100vw, 805px" /></a></p>
<p id="caption-attachment-2284" class="wp-caption-text">图78</p>
</div>
<p>79、在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages/1 ，200响应，其状态为活跃，如图79<br />注：<br />Accept application/json; version=0.0<br />Accept-Language en-US</p>
<pre class="brush: plain; title: ; notranslate" title="">
{
    &quot;code&quot;: 10000,
    &quot;message&quot;: &quot;Get page details succeeded&quot;,
    &quot;data&quot;: {
        &quot;id&quot;: 2,
        &quot;slug&quot;: &quot;contact&quot;,
        &quot;title&quot;: &quot;Contact&quot;,
        &quot;body&quot;: &quot;

Contact

&quot;,
        &quot;view&quot;: &quot;&quot;,
        &quot;status&quot;: 1,
        &quot;created_at&quot;: 1515488912,
        &quot;updated_at&quot;: 1515488912
    }
}
</pre>
<div id="attachment_2285" style="width: 756px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143828555.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2285" loading="lazy" class="size-full wp-image-2285" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143828555.png" alt="在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages/1 ，200响应，其状态为活跃" width="746" height="693" sizes="auto, (max-width: 746px) 100vw, 746px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2285" loading="lazy" class="size-full wp-image-2285 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143828555.png" alt="在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages/1 ，200响应，其状态为活跃" width="746" height="693" sizes="auto, (max-width: 746px) 100vw, 746px" /></a></p>
<p id="caption-attachment-2285" class="wp-caption-text">图79</p>
</div>
<p>80、在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages/2 ，200响应，其状态为不活跃，如图80<br />注：<br />Accept application/json; version=0.0<br />Accept-Language en-US</p>
<pre class="brush: plain; title: ; notranslate" title="">
{
    &quot;code&quot;: 20003,
    &quot;message&quot;: &quot;Page ID: 2, the status is not active&quot;
}
</pre>
<div id="attachment_2286" style="width: 768px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143829484.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2286" loading="lazy" class="size-full wp-image-2286" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143829484.png" alt="在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages/2 ，200响应，其状态为不活跃" width="758" height="428" sizes="auto, (max-width: 758px) 100vw, 758px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2286" loading="lazy" class="size-full wp-image-2286 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143829484.png" alt="在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages/2 ，200响应，其状态为不活跃" width="758" height="428" sizes="auto, (max-width: 758px) 100vw, 758px" /></a></p>
<p id="caption-attachment-2286" class="wp-caption-text">图80</p>
</div>
<p>81、在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages/3 ，404响应，页面不存在，如图81<br />注：<br />Accept application/json; version=0.0<br />Accept-Language zh-CN</p>
<pre class="brush: plain; title: ; notranslate" title="">
{
    &quot;name&quot;: &quot;Not Found&quot;,
    &quot;message&quot;: &quot;页面ID：3，不存在&quot;,
    &quot;code&quot;: 20002,
    &quot;status&quot;: 404,
    &quot;type&quot;: &quot;yii//web//NotFoundHttpException&quot;
}
</pre>
<div id="attachment_2287" style="width: 784px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143830671.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2287" loading="lazy" class="size-full wp-image-2287" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143830671.png" alt="在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages/3 ，404响应，页面不存在" width="774" height="516" sizes="auto, (max-width: 774px) 100vw, 774px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2287" loading="lazy" class="size-full wp-image-2287 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143830671.png" alt="在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages/3 ，404响应，页面不存在" width="774" height="516" sizes="auto, (max-width: 774px) 100vw, 774px" /></a></p>
<p id="caption-attachment-2287" class="wp-caption-text">图81</p>
</div>
<p>82、实现[[yii/web/Linkable]] 接口来支持HATEOAS，返回与本资源对象的相关链接，编辑资源类 /api/models/Page.php，如图82</p>
<pre class="brush: php; title: ; notranslate" title="">
&lt;?php namespace api/models; use yii/helpers/Url; use yii/web/Linkable; use yii/web/Link; class Page extends /common/logics/Page implements Linkable { /** * Returns a list of links. * * @return array the links */ public function getLinks() { return [ Link::REL_SELF =&gt; Url::to(['page/view', 'id' =&gt; $this-&gt;id], true),
            'index' =&gt; Url::to(['page/index'], true),
            'view' =&gt; Url::to(['page/view', 'id' =&gt; $this-&gt;id], true),
            'create' =&gt; Url::to(['page/index'], true),
            'update' =&gt; Url::to(['page/view', 'id' =&gt; $this-&gt;id], true),
            'delete' =&gt; Url::to(['page/view', 'id' =&gt; $this-&gt;id], true),
            'options' =&gt; Url::to(['page/index'], true),

        ];
    }
}

</pre>
<p><div id="attachment_2288" style="width: 1499px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143831497.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2288" loading="lazy" class="size-full wp-image-2288" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143831497.png" alt="实现[[yii/web/Linkable]] 接口来支持HATEOAS，返回与本资源对象的相关链接，编辑资源类 /api/models/Page.php" width="1489" height="891" sizes="auto, (max-width: 1489px) 100vw, 1489px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2288" loading="lazy" class="size-full wp-image-2288 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143831497.png" alt="实现[[yii/web/Linkable]] 接口来支持HATEOAS，返回与本资源对象的相关链接，编辑资源类 /api/models/Page.php" width="1489" height="891" sizes="auto, (max-width: 1489px) 100vw, 1489px" /></a></p>
<p id="caption-attachment-2288" class="wp-caption-text">图82</p>
</div>
<p>83、在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages/1 ，200响应，支持HATEOAS，如图83</p>
<p>注：<br />Accept application/json; version=0.0<br />Accept-Language zh-CN<br />Accept-Encoding gzip, deflate, br</p>
<pre class="brush: plain; title: ; notranslate" title="">
{
    &quot;code&quot;: 10000,
    &quot;message&quot;: &quot;获取页面详情成功&quot;,
    &quot;data&quot;: {
        &quot;id&quot;: 1,
        &quot;slug&quot;: &quot;about&quot;,
        &quot;title&quot;: &quot;About&quot;,
        &quot;body&quot;: &quot;

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

&quot;,
        &quot;view&quot;: &quot;&quot;,
        &quot;status&quot;: 1,
        &quot;created_at&quot;: 1514860785,
        &quot;updated_at&quot;: 1515548927,
        &quot;_links&quot;: {
            &quot;self&quot;: {
                &quot;href&quot;: &quot;http://www.cmcp-api.localhost/v1/pages/1&quot;
            },
            &quot;index&quot;: {
                &quot;href&quot;: &quot;http://www.cmcp-api.localhost/v1/pages&quot;
            },
            &quot;view&quot;: {
                &quot;href&quot;: &quot;http://www.cmcp-api.localhost/v1/pages/1&quot;
            },
            &quot;create&quot;: {
                &quot;href&quot;: &quot;http://www.cmcp-api.localhost/v1/pages&quot;
            },
            &quot;update&quot;: {
                &quot;href&quot;: &quot;http://www.cmcp-api.localhost/v1/pages/1&quot;
            },
            &quot;delete&quot;: {
                &quot;href&quot;: &quot;http://www.cmcp-api.localhost/v1/pages/1&quot;
            },
            &quot;options&quot;: {
                &quot;href&quot;: &quot;http://www.cmcp-api.localhost/v1/pages&quot;
            }
        }
    }
}
</pre>
<div id="attachment_2289" style="width: 898px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143832696.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2289" loading="lazy" class="size-full wp-image-2289" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143832696.png" alt="在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages/1 ，200响应，支持HATEOAS" width="888" height="882" sizes="auto, (max-width: 888px) 100vw, 888px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2289" loading="lazy" class="size-full wp-image-2289 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143832696.png" alt="在 Postman 中，GET http://www.cmcp-api.localhost/v1/pages/1 ，200响应，支持HATEOAS" width="888" height="882" sizes="auto, (max-width: 888px) 100vw, 888px" /></a></p>
<p id="caption-attachment-2289" class="wp-caption-text">图83</p>
</div>
<p>84、POST /pages: 创建一个新页面，编辑 /api/rests/page/CreateAction.php，如图84</p>
<pre class="brush: php; title: ; notranslate" title="">
&lt;?php
/**
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */

namespace api/rests/page;

use Yii;
use yii/base/Model;
use yii/helpers/Url;
use yii/web/ServerErrorHttpException;

/**
 * CreateAction implements the API endpoint for creating a new model from the given data.
 *
 * For more details and usage information on CreateAction, see the [guide article on rest controllers](guide:rest-controllers).
 *
 * @author Qiang Wang &lt;shuijingwanwq@163.com&gt;
 * @since 1.0
 */
class CreateAction extends Action
{
    /**
     * @var string the scenario to be assigned to the new model before it is validated and saved.
     */
    public $scenario = Model::SCENARIO_DEFAULT;
    /**
     * @var string the name of the view action. This property is need to create the URL when the model is successfully created.
     */
    public $viewAction = 'view';


    /**
     * Creates a new model.
     * @return /yii/db/ActiveRecordInterface the model newly created
     * @throws ServerErrorHttpException if there is any error when creating the model
     */
    public function run()
    {
        if ($this-&gt;checkAccess) {
            call_user_func($this-&gt;checkAccess, $this-&gt;id);
        }

        /* @var $model /yii/db/ActiveRecord */
        $model = new $this-&gt;modelClass([
            'scenario' =&gt; $this-&gt;scenario,
        ]);

        $model-&gt;load(Yii::$app-&gt;getRequest()-&gt;getBodyParams(), '');
        if ($model-&gt;save()) {
            $response = Yii::$app-&gt;getResponse();
            $response-&gt;setStatusCode(201);
            $id = implode(',', array_values($model-&gt;getPrimaryKey(true)));
            $response-&gt;getHeaders()-&gt;set('Location', Url::toRoute([$this-&gt;viewAction, 'id' =&gt; $id], true));
        } elseif ($model-&gt;hasErrors()) {
            $response = Yii::$app-&gt;getResponse();
            $response-&gt;setStatusCode(422, 'Data Validation Failed.');
            foreach ($model-&gt;getFirstErrors() as $message) {
                $firstErrors = $message;
            }
            return ['code' =&gt; 20004, 'message' =&gt; Yii::t('error', Yii::t('error', Yii::t('error', '20004'), ['firstErrors' =&gt; $firstErrors]))];
        } elseif (!$model-&gt;hasErrors()) {
            throw new ServerErrorHttpException('Failed to create the object for unknown reason.');
        }

        return ['code' =&gt; 10000, 'message' =&gt; Yii::t('app', '10003'), 'data' =&gt; $model];
    }
}

</pre>
<div id="attachment_2290" style="width: 1802px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143833917.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2290" loading="lazy" class="size-full wp-image-2290" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143833917.png" alt="POST /pages: 创建一个新页面，编辑 /api/rests/page/CreateAction.php" width="1792" height="811" sizes="auto, (max-width: 1792px) 100vw, 1792px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2290" loading="lazy" class="size-full wp-image-2290 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143833917.png" alt="POST /pages: 创建一个新页面，编辑 /api/rests/page/CreateAction.php" width="1792" height="811" sizes="auto, (max-width: 1792px) 100vw, 1792px" /></a></p>
<p id="caption-attachment-2290" class="wp-caption-text">图84</p>
</div>
<p>85、在 Postman 中，POST http://www.cmcp-api.localhost/v1/pages ，201响应，如图85<br />注：<br />Accept application/json; version=0.0<br />Accept-Language zh-CN<br />Accept-Encoding gzip, deflate, br<br />Content-Type application/x-www-form-urlencoded</p>
<pre class="brush: plain; title: ; notranslate" title="">
{
    &quot;code&quot;: 10000,
    &quot;message&quot;: &quot;创建页面成功&quot;,
    &quot;data&quot;: {
        &quot;slug&quot;: &quot;slug-20180110-4&quot;,
        &quot;title&quot;: &quot;title-20180110-4&quot;,
        &quot;body&quot;: &quot;body-20180110-4&quot;,
        &quot;view&quot;: &quot;view-20180110-4&quot;,
        &quot;status&quot;: &quot;0&quot;,
        &quot;created_at&quot;: 1515566824,
        &quot;updated_at&quot;: 1515566824,
        &quot;id&quot;: 7,
        &quot;_links&quot;: {
            &quot;self&quot;: {
                &quot;href&quot;: &quot;http://www.cmcp-api.localhost/v1/pages/7&quot;
            },
            &quot;index&quot;: {
                &quot;href&quot;: &quot;http://www.cmcp-api.localhost/v1/pages&quot;
            },
            &quot;view&quot;: {
                &quot;href&quot;: &quot;http://www.cmcp-api.localhost/v1/pages/7&quot;
            },
            &quot;create&quot;: {
                &quot;href&quot;: &quot;http://www.cmcp-api.localhost/v1/pages&quot;
            },
            &quot;update&quot;: {
                &quot;href&quot;: &quot;http://www.cmcp-api.localhost/v1/pages/7&quot;
            },
            &quot;delete&quot;: {
                &quot;href&quot;: &quot;http://www.cmcp-api.localhost/v1/pages/7&quot;
            },
            &quot;options&quot;: {
                &quot;href&quot;: &quot;http://www.cmcp-api.localhost/v1/pages&quot;
            }
        }
    }
}
</pre>
<div id="attachment_2291" style="width: 739px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143834237.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2291" loading="lazy" class="size-full wp-image-2291" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143834237.png" alt="在 Postman 中，POST http://www.cmcp-api.localhost/v1/pages ，201响应" width="729" height="883" sizes="auto, (max-width: 729px) 100vw, 729px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2291" loading="lazy" class="size-full wp-image-2291 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143834237.png" alt="在 Postman 中，POST http://www.cmcp-api.localhost/v1/pages ，201响应" width="729" height="883" sizes="auto, (max-width: 729px) 100vw, 729px" /></a></p>
<p id="caption-attachment-2291" class="wp-caption-text">图85</p>
</div>
<p>86、在 Postman 中，POST http://www.cmcp-api.localhost/v1/pages ，参数保持原样，422响应，如图86<br />注：<br />Accept application/json; version=0.0<br />Accept-Language zh-CN<br />Accept-Encoding gzip, deflate, br<br />Content-Type application/x-www-form-urlencoded</p>
<pre class="brush: plain; title: ; notranslate" title="">
{
    &quot;code&quot;: 20004,
    &quot;message&quot;: &quot;数据验证失败：Slug的值/&quot;slug-20180110-4/&quot;已经被占用了。&quot;
}
</pre>
<div id="attachment_2292" style="width: 1480px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143835489.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2292" loading="lazy" class="size-full wp-image-2292" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143835489.png" alt="在 Postman 中，POST http://www.cmcp-api.localhost/v1/pages ，参数保持原样，422响应" width="1470" height="555" sizes="auto, (max-width: 1470px) 100vw, 1470px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2292" loading="lazy" class="size-full wp-image-2292 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143835489.png" alt="在 Postman 中，POST http://www.cmcp-api.localhost/v1/pages ，参数保持原样，422响应" width="1470" height="555" sizes="auto, (max-width: 1470px) 100vw, 1470px" /></a></p>
<p id="caption-attachment-2292" class="wp-caption-text">图86</p>
</div>
<p>87、在 Postman 中，POST http://www.cmcp-api.localhost/v1/pages ，422响应(数据验证失败 (例如，响应一个 POST 请求)。 请检查响应体内详细的错误消息。)，如图87<br />注：<br />Accept application/json; version=0.0<br />Accept-Language zh-CN<br />Accept-Encoding gzip, deflate, br<br />Content-Type application/x-www-form-urlencoded</p>
<p>Body<br />缺少 title 参数</p>
<pre class="brush: plain; title: ; notranslate" title="">
{
    &quot;code&quot;: 20004,
    &quot;message&quot;: &quot;数据验证失败：Title不能为空。&quot;
}
</pre>
<div id="attachment_2293" style="width: 1475px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143836617.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2293" loading="lazy" class="size-full wp-image-2293" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143836617.png" alt="在 Postman 中，POST http://www.cmcp-api.localhost/v1/pages ，422响应(数据验证失败 (例如，响应一个 POST 请求)。 请检查响应体内详细的错误消息。)" width="1465" height="565" sizes="auto, (max-width: 1465px) 100vw, 1465px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2293" loading="lazy" class="size-full wp-image-2293 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143836617.png" alt="在 Postman 中，POST http://www.cmcp-api.localhost/v1/pages ，422响应(数据验证失败 (例如，响应一个 POST 请求)。 请检查响应体内详细的错误消息。)" width="1465" height="565" sizes="auto, (max-width: 1465px) 100vw, 1465px" /></a></p>
<p id="caption-attachment-2293" class="wp-caption-text">图87</p>
</div>
<p>88、在 Postman 中，POST http://www.cmcp-api.localhost/v1/pages ，422响应，如图88<br />注：<br />Accept application/json; version=0.0<br />Accept-Language en-US<br />Accept-Encoding gzip, deflate, br<br />Content-Type application/x-www-form-urlencoded</p>
<p>Body<br />缺少 title 参数</p>
<pre class="brush: plain; title: ; notranslate" title="">
{
    &quot;code&quot;: 20004,
    &quot;message&quot;: &quot;Data validation failed: Title cannot be blank.&quot;
}
</pre>
<div id="attachment_2294" style="width: 1475px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143837638.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2294" loading="lazy" class="size-full wp-image-2294" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143837638.png" alt="在 Postman 中，POST http://www.cmcp-api.localhost/v1/pages ，422响应" width="1465" height="494" sizes="auto, (max-width: 1465px) 100vw, 1465px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2294" loading="lazy" class="size-full wp-image-2294 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143837638.png" alt="在 Postman 中，POST http://www.cmcp-api.localhost/v1/pages ，422响应" width="1465" height="494" sizes="auto, (max-width: 1465px) 100vw, 1465px" /></a></p>
<p id="caption-attachment-2294" class="wp-caption-text">图88</p>
</div>
<p>89、PUT /pages/4: 更新一个页面，编辑 /api/rests/page/UpdateAction.php，如图89</p>
<pre class="brush: php; title: ; notranslate" title="">
&lt;?php
/**
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */

namespace api/rests/page;

use Yii;
use yii/base/Model;
use yii/db/ActiveRecord;
use yii/web/ServerErrorHttpException;

/**
 * UpdateAction implements the API endpoint for updating a model.
 *
 * For more details and usage information on UpdateAction, see the [guide article on rest controllers](guide:rest-controllers).
 *
 * @author Qiang Wang &lt;shuijingwanwq@163.com&gt;
 * @since 1.0
 */
class UpdateAction extends Action
{
    /**
     * @var string the scenario to be assigned to the model before it is validated and updated.
     */
    public $scenario = Model::SCENARIO_DEFAULT;


    /**
     * Updates an existing model.
     * @param string $id the primary key of the model.
     * @return /yii/db/ActiveRecordInterface the model being updated
     * @throws ServerErrorHttpException if there is any error when updating the model
     */
    public function run($id)
    {
        /* @var $model ActiveRecord */
        $model = $this-&gt;findModel($id);

        if ($this-&gt;checkAccess) {
            call_user_func($this-&gt;checkAccess, $this-&gt;id, $model);
        }

        $model-&gt;scenario = $this-&gt;scenario;
        $model-&gt;load(Yii::$app-&gt;getRequest()-&gt;getBodyParams(), '');
        if ($model-&gt;save() === false) {
            if ($model-&gt;hasErrors()) {
                $response = Yii::$app-&gt;getResponse();
                $response-&gt;setStatusCode(422, 'Data Validation Failed.');
                foreach ($model-&gt;getFirstErrors() as $message) {
                    $firstErrors = $message;
                }
                return ['code' =&gt; 20004, 'message' =&gt; Yii::t('error', Yii::t('error', Yii::t('error', '20004'), ['firstErrors' =&gt; $firstErrors]))];
            } elseif (!$model-&gt;hasErrors()) {
                throw new ServerErrorHttpException('Failed to update the object for unknown reason.');
            }
        }

        return ['code' =&gt; 10000, 'message' =&gt; Yii::t('app', '10004'), 'data' =&gt; $model];
    }
}

</pre>
<div id="attachment_2295" style="width: 1857px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143839736.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2295" loading="lazy" class="size-full wp-image-2295" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143839736.png" alt="PUT /pages/4: 更新一个页面，编辑 /api/rests/page/UpdateAction.php" width="1847" height="869" sizes="auto, (max-width: 1847px) 100vw, 1847px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2295" loading="lazy" class="size-full wp-image-2295 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143839736.png" alt="PUT /pages/4: 更新一个页面，编辑 /api/rests/page/UpdateAction.php" width="1847" height="869" sizes="auto, (max-width: 1847px) 100vw, 1847px" /></a></p>
<p id="caption-attachment-2295" class="wp-caption-text">图89</p>
</div>
<p>90、在 Postman 中，PUT http://www.cmcp-api.localhost/v1/pages/4 ，200响应，如图90</p>
<pre class="brush: plain; title: ; notranslate" title="">
{
    &quot;code&quot;: 10000,
    &quot;message&quot;: &quot;更新页面成功&quot;,
    &quot;data&quot;: {
        &quot;id&quot;: 4,
        &quot;slug&quot;: &quot;slug-20180110-44&quot;,
        &quot;title&quot;: &quot;title-20180110-44&quot;,
        &quot;body&quot;: &quot;body-20180110-44&quot;,
        &quot;view&quot;: &quot;view-20180110-44&quot;,
        &quot;status&quot;: &quot;1&quot;,
        &quot;created_at&quot;: 1515554512,
        &quot;updated_at&quot;: 1515569633,
        &quot;_links&quot;: {
            &quot;self&quot;: {
                &quot;href&quot;: &quot;http://www.cmcp-api.localhost/v1/pages/4&quot;
            },
            &quot;index&quot;: {
                &quot;href&quot;: &quot;http://www.cmcp-api.localhost/v1/pages&quot;
            },
            &quot;view&quot;: {
                &quot;href&quot;: &quot;http://www.cmcp-api.localhost/v1/pages/4&quot;
            },
            &quot;create&quot;: {
                &quot;href&quot;: &quot;http://www.cmcp-api.localhost/v1/pages&quot;
            },
            &quot;update&quot;: {
                &quot;href&quot;: &quot;http://www.cmcp-api.localhost/v1/pages/4&quot;
            },
            &quot;delete&quot;: {
                &quot;href&quot;: &quot;http://www.cmcp-api.localhost/v1/pages/4&quot;
            },
            &quot;options&quot;: {
                &quot;href&quot;: &quot;http://www.cmcp-api.localhost/v1/pages&quot;
            }
        }
    }
}
</pre>
<div id="attachment_2296" style="width: 1426px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143840731.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2296" loading="lazy" class="size-full wp-image-2296" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143840731.png" alt="在 Postman 中，PUT http://www.cmcp-api.localhost/v1/pages/4 ，200响应" width="1416" height="878" sizes="auto, (max-width: 1416px) 100vw, 1416px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2296" loading="lazy" class="size-full wp-image-2296 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143840731.png" alt="在 Postman 中，PUT http://www.cmcp-api.localhost/v1/pages/4 ，200响应" width="1416" height="878" sizes="auto, (max-width: 1416px) 100vw, 1416px" /></a></p>
<p id="caption-attachment-2296" class="wp-caption-text">图90</p>
</div>
<p>91、在 Postman 中，PUT http://www.cmcp-api.localhost/v1/pages/4 ，422响应，如图91<br />注：<br />Accept application/json; version=0.0<br />Accept-Language en-US<br />Accept-Encoding gzip, deflate, br<br />Content-Type application/x-www-form-urlencoded</p>
<p>Body<br />slug 的值已经被另一页面占用</p>
<pre class="brush: plain; title: ; notranslate" title="">
{
    &quot;code&quot;: 20004,
    &quot;message&quot;: &quot;Data validation failed: Slug /&quot;slug-20180110-5/&quot; has already been taken.&quot;
}
</pre>
<div id="attachment_2297" style="width: 1479px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143841715.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2297" loading="lazy" class="size-full wp-image-2297" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143841715.png" alt="在 Postman 中，PUT http://www.cmcp-api.localhost/v1/pages/4 ，422响应" width="1469" height="596" sizes="auto, (max-width: 1469px) 100vw, 1469px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2297" loading="lazy" class="size-full wp-image-2297 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143841715.png" alt="在 Postman 中，PUT http://www.cmcp-api.localhost/v1/pages/4 ，422响应" width="1469" height="596" sizes="auto, (max-width: 1469px) 100vw, 1469px" /></a></p>
<p id="caption-attachment-2297" class="wp-caption-text">图91</p>
</div>
<p>92、DELETE /pages/4: 删除页面4，编辑 /api/rests/page/DeleteAction.php，如图92</p>
<pre class="brush: php; title: ; notranslate" title="">
&lt;?php
/**
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */

namespace api/rests/page;

use Yii;
use yii/web/ServerErrorHttpException;

/**
 * DeleteAction implements the API endpoint for deleting a model.
 *
 * For more details and usage information on DeleteAction, see the [guide article on rest controllers](guide:rest-controllers).
 *
 * @author Qiang Wang &lt;shuijingwanwq@163.com&gt;
 * @since 1.0
 */
class DeleteAction extends Action
{
    /**
     * Deletes a model.
     * @param mixed $id id of the model to be deleted.
     * @throws ServerErrorHttpException on failure.
     */
    public function run($id)
    {
        $model = $this-&gt;findModel($id);

        if ($this-&gt;checkAccess) {
            call_user_func($this-&gt;checkAccess, $this-&gt;id, $model);
        }

        if ($model-&gt;delete() === false) {
            throw new ServerErrorHttpException('Failed to delete the object for unknown reason.');
        }

        return ['code' =&gt; 10000, 'message' =&gt; Yii::t('app', '10005')];
    }
}

</pre>
<div id="attachment_2298" style="width: 1761px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143842954.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2298" loading="lazy" class="size-full wp-image-2298" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143842954.png" alt="DELETE /pages/4: 删除页面4，编辑 /api/rests/page/DeleteAction.php" width="1751" height="764" sizes="auto, (max-width: 1751px) 100vw, 1751px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2298" loading="lazy" class="size-full wp-image-2298 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143842954.png" alt="DELETE /pages/4: 删除页面4，编辑 /api/rests/page/DeleteAction.php" width="1751" height="764" sizes="auto, (max-width: 1751px) 100vw, 1751px" /></a></p>
<p id="caption-attachment-2298" class="wp-caption-text">图92</p>
</div>
<p>93、在 Postman 中，DELETE http://www.cmcp-api.localhost/v1/pages/7 ，200响应，如图93<br />注：<br />Accept application/json; version=0.0<br />Accept-Language zh-CN<br />Accept-Encoding gzip, deflate, br</p>
<pre class="brush: plain; title: ; notranslate" title="">
{
    &quot;code&quot;: 10000,
    &quot;message&quot;: &quot;删除页面成功&quot;
}
</pre>
<div id="attachment_2299" style="width: 1479px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143843418.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2299" loading="lazy" class="size-full wp-image-2299" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143843418.png" alt="在 Postman 中，DELETE http://www.cmcp-api.localhost/v1/pages/7 ，200响应" width="1469" height="518" sizes="auto, (max-width: 1469px) 100vw, 1469px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2299" loading="lazy" class="size-full wp-image-2299 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143843418.png" alt="在 Postman 中，DELETE http://www.cmcp-api.localhost/v1/pages/7 ，200响应" width="1469" height="518" sizes="auto, (max-width: 1469px) 100vw, 1469px" /></a></p>
<p id="caption-attachment-2299" class="wp-caption-text">图93</p>
</div>
<p>94、展示一下语言包文件的最后内容，如图94<br />/api/messages/zh/app.php</p>
<pre class="brush: php; title: ; notranslate" title="">
return [
    10000 =&gt; 'success',
    10001 =&gt; '获取页面列表成功',
    10002 =&gt; '获取页面详情成功',
    10003 =&gt; '创建页面成功',
    10004 =&gt; '更新页面成功',
    10005 =&gt; '删除页面成功',
];
</pre>
<p>/api/messages/zh/error.php</p>
<pre class="brush: php; title: ; notranslate" title="">
return [
    20000 =&gt; 'error',
    20001 =&gt; '页面列表为空',
    20002 =&gt; '页面ID：{id}，不存在',
    20003 =&gt; '页面ID：{id}，的状态不活跃',
    20004 =&gt; '数据验证失败：{firstErrors}',
];
</pre>
<p>/api/messages/en/app.php</p>
<pre class="brush: php; title: ; notranslate" title="">
return [
    10000 =&gt; 'success',
    10001 =&gt; 'Get page list is successful',
    10002 =&gt; 'Get page details succeeded',
    10003 =&gt; 'Create a page success',
    10004 =&gt; 'Update page success',
    10005 =&gt; 'Delete page success',
];
</pre>
<p>/api/messages/en/error.php</p>
<pre class="brush: php; title: ; notranslate" title="">
return [
    20000 =&gt; 'error',
    20001 =&gt; 'Page list is empty',
    20002 =&gt; 'Page ID: {id}, does not exist',
    20003 =&gt; 'Page ID: {id}, the status is not active',
    20004 =&gt; 'Data validation failed: {firstErrors}',
];
</pre>
<div id="attachment_2300" style="width: 1150px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143844146.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2300" loading="lazy" class="size-full wp-image-2300" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143844146.png" alt="展示一下语言包文件的最后内容" width="1140" height="367" sizes="auto, (max-width: 1140px) 100vw, 1140px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2300" loading="lazy" class="size-full wp-image-2300 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143844146.png" alt="展示一下语言包文件的最后内容" width="1140" height="367" sizes="auto, (max-width: 1140px) 100vw, 1140px" /></a></p>
<p id="caption-attachment-2300" class="wp-caption-text">图94</p>
</div>
<p>95、OPTIONS /pages: 显示关于末端 /pages 支持的动词，在 Postman 中，OPTIONS http://www.cmcp-api.localhost/v1/pages ，200响应，如图95</p>
<div id="attachment_2301" style="width: 1490px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143845870.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2301" loading="lazy" class="size-full wp-image-2301" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143845870.png" alt="OPTIONS /pages: 显示关于末端 /pages 支持的动词，在 Postman 中，OPTIONS http://www.cmcp-api.localhost/v1/pages ，200响应" width="1480" height="818" sizes="auto, (max-width: 1480px) 100vw, 1480px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2301" loading="lazy" class="size-full wp-image-2301 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143845870.png" alt="OPTIONS /pages: 显示关于末端 /pages 支持的动词，在 Postman 中，OPTIONS http://www.cmcp-api.localhost/v1/pages ，200响应" width="1480" height="818" sizes="auto, (max-width: 1480px) 100vw, 1480px" /></a></p>
<p id="caption-attachment-2301" class="wp-caption-text">图95</p>
</div>
<p>96、OPTIONS /pages/1: 显示关于末端 /pages/1 支持的动词，在 Postman 中，OPTIONS http://www.cmcp-api.localhost/v1/pages/1 ，200响应，如图96</p>
<div id="attachment_2302" style="width: 1479px" class="wp-caption alignnone"><a href="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143846143.png"><noscript><img decoding="async" aria-describedby="caption-attachment-2302" loading="lazy" class="size-full wp-image-2302" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143846143.png" alt="OPTIONS /pages/1: 显示关于末端 /pages/1 支持的动词，在 Postman 中，OPTIONS http://www.cmcp-api.localhost/v1/pages/1 ，200响应" width="1469" height="815" sizes="auto, (max-width: 1469px) 100vw, 1469px" /></noscript><img decoding="async" aria-describedby="caption-attachment-2302" loading="lazy" class="size-full wp-image-2302 j-lazy" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143846143.png" alt="OPTIONS /pages/1: 显示关于末端 /pages/1 支持的动词，在 Postman 中，OPTIONS http://www.cmcp-api.localhost/v1/pages/1 ，200响应" width="1469" height="815" sizes="auto, (max-width: 1469px) 100vw, 1469px" /></a></p>
<p id="caption-attachment-2302" class="wp-caption-text">图96</p>
</div>
<p>97、总结：现在支持的行为：index、view、create、update、delete、options，除 options 之外，基本上是继承之后，再次覆写实现具体的需求了的。</p>
<p>&nbsp;</p>
<nav class="pagination group">
                      </nav>
<div class="entry-readmore"><div class="entry-readmore-btn"></div></div>                                                        <div class="entry-copyright"><p>原创文章，作者：Maggie-Hunter，如若转载，请注明出处：https://blog.ytso.com/tech/webdev/180869.html</p></div>                        </div>

                        <div class="entry-tag"></div>
                        <div class="entry-action">
                            <div class="btn-zan" data-id="180869"><i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-thumb-up-fill"></use></svg></i> 赞 <span class="entry-action-num">(0)</span></div>
                                                    </div>

                        <div class="entry-bar">
                            <div class="entry-bar-inner">
                                                                <div class="entry-bar-info entry-bar-info2">
                                    <div class="info-item meta">
                                                                                    <a class="meta-item j-heart" href="javascript:;" data-id="180869"><i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-star"></use></svg></i> <span class="data">0</span></a>                                        <a class="meta-item" href="#comments"><i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-comment"></use></svg></i> <span class="data">0</span></a>                                                                            </div>
                                    <div class="info-item share">
                                                                                    <a class="meta-item mobile j-mobile-share" href="javascript:;" data-id="180869" data-qrcode="https://blog.ytso.com/tech/webdev/180869.html">
                                                <i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-share"></use></svg></i> 生成海报                                            </a>
                                                                                    <a class="meta-item wechat" data-share="wechat" target="_blank" rel="nofollow noopener noreferrer" href="#">
                                                <i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-wechat"></use></svg></i>                                            </a>
                                                                                    <a class="meta-item weibo" data-share="weibo" target="_blank" rel="nofollow noopener noreferrer" href="#">
                                                <i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-weibo"></use></svg></i>                                            </a>
                                                                                    <a class="meta-item qq" data-share="qq" target="_blank" rel="nofollow noopener noreferrer" href="#">
                                                <i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-qq"></use></svg></i>                                            </a>
                                                                                    <a class="meta-item qzone" data-share="qzone" target="_blank" rel="nofollow noopener noreferrer" href="#">
                                                <i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-qzone"></use></svg></i>                                            </a>
                                                                                    <a class="meta-item douban" data-share="douban" target="_blank" rel="nofollow noopener noreferrer" href="#">
                                                <i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-douban"></use></svg></i>                                            </a>
                                                                                    <a class="meta-item linkedin" data-share="linkedin" target="_blank" rel="nofollow noopener noreferrer" href="#">
                                                <i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-linkedin"></use></svg></i>                                            </a>
                                                                                    <a class="meta-item facebook" data-share="facebook" target="_blank" rel="nofollow noopener noreferrer" href="#">
                                                <i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-facebook"></use></svg></i>                                            </a>
                                                                                    <a class="meta-item twitter" data-share="twitter" target="_blank" rel="nofollow noopener noreferrer" href="#">
                                                <i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-twitter"></use></svg></i>                                            </a>
                                                                            </div>
                                    <div class="info-item act">
                                        <a href="javascript:;" id="j-reading"><i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-article"></use></svg></i></a>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                                            <div class="entry-page">
                    <div class="entry-page-prev j-lazy" style="background-image: url('https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png');" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031131805160.png">
                <a href="https://blog.ytso.com/tech/webdev/180836.html" title="执行：composer update 时，提示：No valid bower.json was found in any branch or tag of https://github.com/blueimp/JavaScript-Canvas-to-Blob.git, cou ld not load a package from it. 的解决" rel="prev">
                    <span>执行：composer update 时，提示：No valid bower.json was found in any branch or tag of https://github.com/blueimp/JavaScript-Canvas-to-Blob.git, cou ld not load a package from it. 的解决</span>
                </a>
                <div class="entry-page-info">
                    <span class="pull-left"><i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-arrow-left-double"></use></svg></i> 上一篇</span>
                    <span class="pull-right">2021年10月31日 13:51</span>
                </div>
            </div>
                            <div class="entry-page-next j-lazy" style="background-image: url('https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png');" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2021/10/31/20211031143853322.png">
                <a href="https://blog.ytso.com/tech/webdev/180870.html" title="如何在开发 RESTful 应用程序时使用 Yii2 调试器？" rel="next">
                    <span>如何在开发 RESTful 应用程序时使用 Yii2 调试器？</span>
                </a>
                <div class="entry-page-info">
                    <span class="pull-right">下一篇 <i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-arrow-right-double"></use></svg></i></span>
                    <span class="pull-left">2021年10月31日 14:33</span>
                </div>
            </div>
            </div>
                                                                <div class="entry-related-posts">
                            <h3 class="entry-related-title">相关推荐</h3><ul class="entry-related cols-3 post-loop post-loop-list"><li class="item">
    <a href="https://blog.ytso.com/tech/dev/21126.html" target="_blank" rel="bookmark">
        <span>GoF 的 23 种设计模式的分类和功能</span>
    </a>
    <span class="date">2021年7月20日</span>
</li><li class="item">
    <a href="https://blog.ytso.com/tech/bigdata/4351.html" target="_blank" rel="bookmark">
        <span>ftp 命令详解数据库</span>
    </a>
    <span class="date">2021年7月16日</span>
</li><li class="item">
    <a href="https://blog.ytso.com/tech/bigdata/233686.html" target="_blank" rel="bookmark">
        <span>sqlserver 多表关联时在where语句中慎用trim()方法</span>
    </a>
    <span class="date">2022年1月23日</span>
</li><li class="item">
    <a href="https://blog.ytso.com/tech/pnotes/116089.html" target="_blank" rel="bookmark">
        <span>如何使用 Fail2Ban 保护服务器免受暴力攻击</span>
    </a>
    <span class="date">2021年8月27日</span>
</li><li class="item">
    <a href="https://blog.ytso.com/tech/pnotes/260805.html" target="_blank" rel="bookmark">
        <span>如何判断一个网站是否为自适应或响应</span>
    </a>
    <span class="date">2022年5月24日</span>
</li><li class="item">
    <a href="https://blog.ytso.com/tech/pnotes/116717.html" target="_blank" rel="bookmark">
        <span>Win10下linux子系统错误解决办法</span>
    </a>
    <span class="date">2021年8月27日</span>
</li><li class="item">
    <a href="https://blog.ytso.com/tech/pnotes/18261.html" target="_blank" rel="bookmark">
        <span>修改数据库的数据元素小技巧详解编程语言</span>
    </a>
    <span class="date">2021年7月19日</span>
</li><li class="item">
    <a href="https://blog.ytso.com/tech/bigdata/318208.html" target="_blank" rel="bookmark">
        <span>GBase 8a集群存储过程样例，动态存储过程</span>
    </a>
    <span class="date">2025年11月23日</span>
</li><li class="item">
    <a href="https://blog.ytso.com/tech/pnotes/32244.html" target="_blank" rel="bookmark">
        <span>如何在CentOS 8上安装Odoo ERP 13</span>
    </a>
    <span class="date">2021年7月25日</span>
</li><li class="item">
    <a href="https://blog.ytso.com/tech/pnotes/276337.html" target="_blank" rel="bookmark">
        <span>3.0 JAVA多线程并发_面经</span>
    </a>
    <span class="date">2022年7月23日</span>
</li></ul>                        </div>
                    
<div id="comments" class="entry-comments">
    	<div id="respond" class="comment-respond">
		<h3 id="reply-title" class="comment-reply-title">发表回复 <small><a rel="nofollow" id="cancel-comment-reply-link" href="/tech/webdev/180869.html#respond" style="display:none;"><i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-close"></use></svg></i></a></small></h3><div class="comment-form"><div class="comment-must-login">请登录后评论...</div><div class="form-submit"><div class="form-submit-text pull-left"><a href="https://blog.ytso.com/login">登录</a>后才能评论</div> <button name="submit" type="submit" id="must-submit" class="wpcom-btn btn-primary btn-xs submit">提交</button></div></div>	</div><!-- #respond -->
		</div><!-- .comments-area -->
                </article>
                    </main>
            <aside class="sidebar">
        <div class="widget widget_search"><form class="search-form" action="https://blog.ytso.com/" method="get" role="search">
    <input type="search" class="keyword" name="s" maxlength="100" placeholder="输入关键词搜索..." value="">
    <button type="submit" class="submit"><i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-search"></use></svg></i></button>
</form></div><div class="widget widget_tag_cloud"><h3 class="widget-title"><span>热门标签</span></h3><div class="tagcloud"><a href="https://blog.ytso.com/tag/ai" class="tag-cloud-link tag-link-248 tag-link-position-1" style="font-size: 10.625pt;" aria-label="AI (11,871 项)">AI<span class="tag-link-count"> (11871)</span></a>
<a href="https://blog.ytso.com/tag/aliyun" class="tag-cloud-link tag-link-186 tag-link-position-2" style="font-size: 22pt;" aria-label="aliyun (95,062 项)">aliyun<span class="tag-link-count"> (95062)</span></a>
<a href="https://blog.ytso.com/tag/android" class="tag-cloud-link tag-link-214 tag-link-position-3" style="font-size: 10pt;" aria-label="Android (10,391 项)">Android<span class="tag-link-count"> (10391)</span></a>
<a href="https://blog.ytso.com/tag/c" class="tag-cloud-link tag-link-106 tag-link-position-4" style="font-size: 11.75pt;" aria-label="c (14,593 项)">c<span class="tag-link-count"> (14593)</span></a>
<a href="https://blog.ytso.com/tag/go" class="tag-cloud-link tag-link-109 tag-link-position-5" style="font-size: 8.375pt;" aria-label="go (7,786 项)">go<span class="tag-link-count"> (7786)</span></a>
<a href="https://blog.ytso.com/tag/google" class="tag-cloud-link tag-link-193 tag-link-position-6" style="font-size: 13.75pt;" aria-label="google (20,654 项)">google<span class="tag-link-count"> (20654)</span></a>
<a href="https://blog.ytso.com/tag/html" class="tag-cloud-link tag-link-8 tag-link-position-7" style="font-size: 8.75pt;" aria-label="html (8,304 项)">html<span class="tag-link-count"> (8304)</span></a>
<a href="https://blog.ytso.com/tag/https" class="tag-cloud-link tag-link-773 tag-link-position-8" style="font-size: 10.125pt;" aria-label="https (10,802 项)">https<span class="tag-link-count"> (10802)</span></a>
<a href="https://blog.ytso.com/tag/iphone" class="tag-cloud-link tag-link-213 tag-link-position-9" style="font-size: 13.875pt;" aria-label="iPhone (21,436 项)">iPhone<span class="tag-link-count"> (21436)</span></a>
<a href="https://blog.ytso.com/tag/jd" class="tag-cloud-link tag-link-187 tag-link-position-10" style="font-size: 8.125pt;" aria-label="jd (7,444 项)">jd<span class="tag-link-count"> (7444)</span></a>
<a href="https://blog.ytso.com/tag/linux" class="tag-cloud-link tag-link-110 tag-link-position-11" style="font-size: 13.125pt;" aria-label="linux (18,686 项)">linux<span class="tag-link-count"> (18686)</span></a>
<a href="https://blog.ytso.com/tag/md" class="tag-cloud-link tag-link-226 tag-link-position-12" style="font-size: 8.75pt;" aria-label="MD (8,346 项)">MD<span class="tag-link-count"> (8346)</span></a>
<a href="https://blog.ytso.com/tag/microsoft" class="tag-cloud-link tag-link-179 tag-link-position-13" style="font-size: 8.25pt;" aria-label="microsoft (7,561 项)">microsoft<span class="tag-link-count"> (7561)</span></a>
<a href="https://blog.ytso.com/tag/phone" class="tag-cloud-link tag-link-215 tag-link-position-14" style="font-size: 14pt;" aria-label="Phone (21,786 项)">Phone<span class="tag-link-count"> (21786)</span></a>
<a href="https://blog.ytso.com/tag/python" class="tag-cloud-link tag-link-111 tag-link-position-15" style="font-size: 8pt;" aria-label="python (7,226 项)">python<span class="tag-link-count"> (7226)</span></a>
<a href="https://blog.ytso.com/tag/windows" class="tag-cloud-link tag-link-112 tag-link-position-16" style="font-size: 13.125pt;" aria-label="windows (18,482 项)">windows<span class="tag-link-count"> (18482)</span></a>
<a href="https://blog.ytso.com/tag/%e4%ba%ba%e5%b7%a5%e6%99%ba%e8%83%bd" class="tag-cloud-link tag-link-244 tag-link-position-17" style="font-size: 9.75pt;" aria-label="人工智能 (9,889 项)">人工智能<span class="tag-link-count"> (9889)</span></a>
<a href="https://blog.ytso.com/tag/%e5%ae%89%e5%85%a8" class="tag-cloud-link tag-link-219 tag-link-position-18" style="font-size: 15.5pt;" aria-label="安全 (28,526 项)">安全<span class="tag-link-count"> (28526)</span></a>
<a href="https://blog.ytso.com/tag/%e5%bc%80%e6%ba%90" class="tag-cloud-link tag-link-199 tag-link-position-19" style="font-size: 12.625pt;" aria-label="开源 (16,950 项)">开源<span class="tag-link-count"> (16950)</span></a>
<a href="https://blog.ytso.com/tag/%e5%be%ae%e8%bd%af" class="tag-cloud-link tag-link-178 tag-link-position-20" style="font-size: 11.25pt;" aria-label="微软 (13,275 项)">微软<span class="tag-link-count"> (13275)</span></a>
<a href="https://blog.ytso.com/tag/%e6%89%8b%e6%9c%ba" class="tag-cloud-link tag-link-223 tag-link-position-21" style="font-size: 13.875pt;" aria-label="手机 (21,138 项)">手机<span class="tag-link-count"> (21138)</span></a>
<a href="https://blog.ytso.com/tag/%e6%b8%b8%e6%88%8f" class="tag-cloud-link tag-link-222 tag-link-position-22" style="font-size: 11.25pt;" aria-label="游戏 (13,254 项)">游戏<span class="tag-link-count"> (13254)</span></a>
<a href="https://blog.ytso.com/tag/%e7%99%be%e5%ba%a6" class="tag-cloud-link tag-link-225 tag-link-position-23" style="font-size: 8pt;" aria-label="百度 (7,189 项)">百度<span class="tag-link-count"> (7189)</span></a>
<a href="https://blog.ytso.com/tag/%e7%a1%ac%e4%bb%b6" class="tag-cloud-link tag-link-224 tag-link-position-24" style="font-size: 11.75pt;" aria-label="硬件 (14,378 项)">硬件<span class="tag-link-count"> (14378)</span></a>
<a href="https://blog.ytso.com/tag/%e7%be%8e%e5%9b%bd" class="tag-cloud-link tag-link-221 tag-link-position-25" style="font-size: 13.625pt;" aria-label="美国 (20,456 项)">美国<span class="tag-link-count"> (20456)</span></a>
<a href="https://blog.ytso.com/tag/%e8%8b%b9%e6%9e%9c" class="tag-cloud-link tag-link-191 tag-link-position-26" style="font-size: 9.75pt;" aria-label="苹果 (10,017 项)">苹果<span class="tag-link-count"> (10017)</span></a>
<a href="https://blog.ytso.com/tag/%e8%a7%82%e5%af%9f" class="tag-cloud-link tag-link-220 tag-link-position-27" style="font-size: 8.25pt;" aria-label="观察 (7,533 项)">观察<span class="tag-link-count"> (7533)</span></a>
<a href="https://blog.ytso.com/tag/%e8%b0%b7%e6%ad%8c" class="tag-cloud-link tag-link-198 tag-link-position-28" style="font-size: 9pt;" aria-label="谷歌 (8,726 项)">谷歌<span class="tag-link-count"> (8726)</span></a>
<a href="https://blog.ytso.com/tag/%e8%bd%a6" class="tag-cloud-link tag-link-188 tag-link-position-29" style="font-size: 15.375pt;" aria-label="车 (28,069 项)">车<span class="tag-link-count"> (28069)</span></a>
<a href="https://blog.ytso.com/tag/%e9%80%9a%e4%bf%a1" class="tag-cloud-link tag-link-216 tag-link-position-30" style="font-size: 8.125pt;" aria-label="通信 (7,496 项)">通信<span class="tag-link-count"> (7496)</span></a></div>
</div>    </aside>
    </div>
<!--WPFC_FOOTER_START--></div>
<footer class="footer">
    <div class="container">
        <div class="footer-col-wrap footer-with-none">
                        <div class="footer-col footer-col-copy">
                <ul class="footer-nav hidden-xs"><li id="menu-item-174931" class="menu-item menu-item-174931"><a href="https://blog.ytso.com/contribute">欢迎投稿</a></li>
<li id="menu-item-174930" class="menu-item menu-item-174930"><a href="https://blog.ytso.com/privacy-policy">隐私政策</a></li>
<li id="menu-item-174934" class="menu-item menu-item-174934"><a href="https://blog.ytso.com/privacy">使用协议</a></li>
<li id="menu-item-174932" class="menu-item menu-item-174932"><a href="https://blog.ytso.com/terms-of-service">服务条款</a></li>
<li id="menu-item-174936" class="menu-item menu-item-174936"><a href="https://blog.ytso.com/copyright">版权声明</a></li>
</ul>                <div class="copyright">
                    <p>Copyright © 2006-2025 YTSO.COM 版权所有 <a href="http://beian.miit.gov.cn">鲁ICP备15002310号-3</a> Powered by <a href="https://www.wordpress.com" target="_blank" rel="noopener">WordPress</a></p>
<p>免责声明：本站信息来自互联网收集分享，版权归原创者所有，如果侵犯了您的权益，请发邮件给39941211@qq.com通知我们删除.</p>
<p><audio style="display: none;" controls="controls"></audio></p>
                </div>
            </div>
                    </div>
    </div>
</footer>
            <div class="action action-style-0 action-color-0 action-pos-0" style="bottom:20%;">
                                                    <div class="action-item j-share">
                        <i class="wpcom-icon wi action-item-icon"><svg aria-hidden="true"><use xlink:href="#wi-share"></use></svg></i>                                            </div>
                                    <div class="action-item gotop j-top">
                        <i class="wpcom-icon wi action-item-icon"><svg aria-hidden="true"><use xlink:href="#wi-arrow-up-2"></use></svg></i>                                            </div>
                            </div>
        <script type="speculationrules">
{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/justnews/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
</script>
<script type="text/javascript" id="main-js-extra">
/* <![CDATA[ */
var _wpcom_js = {"webp":"","ajaxurl":"https://blog.ytso.com/wp-admin/admin-ajax.php","theme_url":"https://blog.ytso.com/wp-content/themes/justnews","slide_speed":"5000","is_admin":"0","lang":"zh_CN","js_lang":{"share_to":"\u5206\u4eab\u5230:","copy_done":"\u590d\u5236\u6210\u529f\uff01","copy_fail":"\u6d4f\u89c8\u5668\u6682\u4e0d\u652f\u6301\u62f7\u8d1d\u529f\u80fd","confirm":"\u786e\u5b9a","qrcode":"\u4e8c\u7ef4\u7801","page_loaded":"\u5df2\u7ecf\u5230\u5e95\u4e86","no_content":"\u6682\u65e0\u5185\u5bb9","load_failed":"\u52a0\u8f7d\u5931\u8d25\uff0c\u8bf7\u7a0d\u540e\u518d\u8bd5\uff01","expand_more":"\u9605\u8bfb\u5269\u4f59 %s"},"share":"1","lightbox":"1","post_id":"180869","user_card_height":"356","poster":{"notice":"\u8bf7\u300c\u70b9\u51fb\u4e0b\u8f7d\u300d\u6216\u300c\u957f\u6309\u4fdd\u5b58\u56fe\u7247\u300d\u540e\u5206\u4eab\u7ed9\u66f4\u591a\u597d\u53cb","generating":"\u6b63\u5728\u751f\u6210\u6d77\u62a5\u56fe\u7247...","failed":"\u6d77\u62a5\u56fe\u7247\u751f\u6210\u5931\u8d25"},"video_height":"482","fixed_sidebar":"1","dark_style":"0","font_url":"//fonts.geekzu.org/css2?family=Noto+Sans+SC:wght@400;500&display=swap","follow_btn":"\u003Ci class=\"wpcom-icon wi\"\u003E\u003Csvg aria-hidden=\"true\"\u003E\u003Cuse xlink:href=\"#wi-add\"\u003E\u003C/use\u003E\u003C/svg\u003E\u003C/i\u003E\u5173\u6ce8","followed_btn":"\u5df2\u5173\u6ce8","user_card":"1"};
//# sourceURL=main-js-extra
/* ]]> */
</script>
<script type="text/javascript" src="https://blog.ytso.com/wp-content/themes/justnews/js/main.js?ver=6.21.5" id="main-js"></script>
<script type="text/javascript" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/js/icons-2.8.9.js?ver=2.8.9" id="wpcom-icons-js"></script>
<script type="text/javascript" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/js/comment-reply.js?ver=6.21.5" id="comment-reply-js"></script>
<script type="text/javascript" id="wpcom-member-js-extra">
/* <![CDATA[ */
var _wpmx_js = {"ajaxurl":"https://blog.ytso.com/wp-admin/admin-ajax.php","plugin_url":"https://blog.ytso.com/wp-content/plugins/wpcom-member/","max_upload_size":"52428800","post_id":"180869","js_lang":{"login_desc":"\u60a8\u8fd8\u672a\u767b\u5f55\uff0c\u8bf7\u767b\u5f55\u540e\u518d\u8fdb\u884c\u76f8\u5173\u64cd\u4f5c\uff01","login_title":"\u8bf7\u767b\u5f55","login_btn":"\u767b\u5f55","reg_btn":"\u6ce8\u518c"},"login_url":"https://blog.ytso.com/login","register_url":"https://blog.ytso.com/register","errors":{"require":"\u4e0d\u80fd\u4e3a\u7a7a","email":"\u8bf7\u8f93\u5165\u6b63\u786e\u7684\u7535\u5b50\u90ae\u7bb1","pls_enter":"\u8bf7\u8f93\u5165","password":"\u5bc6\u7801\u5fc5\u987b\u4e3a6~32\u4e2a\u5b57\u7b26","passcheck":"\u4e24\u6b21\u5bc6\u7801\u8f93\u5165\u4e0d\u4e00\u81f4","phone":"\u8bf7\u8f93\u5165\u6b63\u786e\u7684\u624b\u673a\u53f7\u7801","terms":"\u8bf7\u9605\u8bfb\u5e76\u540c\u610f\u6761\u6b3e","sms_code":"\u9a8c\u8bc1\u7801\u9519\u8bef","captcha_verify":"\u8bf7\u70b9\u51fb\u6309\u94ae\u8fdb\u884c\u9a8c\u8bc1","captcha_fail":"\u4eba\u673a\u9a8c\u8bc1\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5","nonce":"\u968f\u673a\u6570\u6821\u9a8c\u5931\u8d25","req_error":"\u8bf7\u6c42\u5931\u8d25"}};
//# sourceURL=wpcom-member-js-extra
/* ]]> */
</script>
<script type="text/javascript" src="https://blog.ytso.com/wp-content/plugins/wpcom-member/js/index.js?ver=1.7.19" id="wpcom-member-js"></script>
<script type="text/javascript" src="https://blog.ytso.com/wp-content/themes/justnews/js/wp-embed.js?ver=6.21.5" id="wp-embed-js"></script>
<error>
    <code>wp_die</code>
    <title><![CDATA[WordPress &amp;rsaquo; Error]]></title>
    <message><![CDATA[&lt;h1&gt;Error establishing a Redis connection&lt;/h1&gt;
&lt;p&gt;To disable Redis, delete the &lt;code&gt;object-cache.php&lt;/code&gt; file in the &lt;code&gt;/wp-content/&lt;/code&gt; directory.&lt;/p&gt;
]]></message>
    <data>
        <status>500</status>
    </data>
</error>
<!--
Performance optimized by Redis Object Cache. Learn more: https://wprediscache.com

Retrieved 3019 objects (2 MB) from Redis using Predis (v2.4.0).
-->
