Based on yiisoft/yii2-app-advanced, create a new repository yii2-app-advanced on github, and create a new interface application (implement RESTful-style web service services. API), support for creating new API directories, configuration and environment, testing, vagrant, etc.

新建 api 目录、配置和环境、测试、Vagrant 等的支持。

Yii2 Advanced in Action Series: RESTful API + RPC Services + Internationalization + Logging & Testing

新建 api 目录、配置和环境、测试、Vagrant 等的支持。

(1) Based on yiisoft/yii2-app-advanced, create a new repository yii2-app-advanced on github, and create a new interface application (implement RESTful-style web service services. API), support for creating new API directories, configuration and environment, testing, vagrant, etc.

(2) Based on yiisoft/yii2-app-advanced, create a new repository yii2-app-advanced on github, and create a new interface application (implement RESTful-style web service services. API), implement model hierarchy: data layer, logic layer, clarify common directory, application, module inheritance, reference relationship

在 Postman 中,GET http://api.github-shuijingwan-yii2-app-advanced.localhost/v1/users ,200响应,message为简体中文

(3) Based on yiisoft/yii2-app-advanced, create a new repository yii2-app-advanced on github, and create a new interface application (implement RESTful-style web service services. API), implement RESTful web service, support internationalization (drivingly set the target language, default to simplified Chinese)

运行测试,获取详细的输出,可看到一步一步的行为报告,符合预期

(4) Based on yiisoft/yii2-app-advanced, create a new repository yii2-app-advanced on github, and create a new interface application (implement RESTful-style web service services. API), prepare some examples of automated tests (API tests) for user-related operations in the tests directory of the API to ensure that the application will not affect existing functions when changing or adding new functions

在 Postman 中,GET http://api.github-shuijingwan-yii2-app-advanced.localhost/v1/logs?filter[level]=4&filter[category][like]=api\behaviors\RequestLogBehavior&filter[prefix][like]=app-api&filter[log_time][gte]=1528090828&filter[log_time][lte]=1529564924.6648 ,200响应,空数组已经被自动转换为空对象,以保证字段格式的统一,GET http://api.github-shuijingwan-yii2-app-advanced.localhost/v1/logs/3

(5) Based on yiisoft/yii2-app-advanced, create a new repository yii2-app-advanced on github, and create a new interface application (implement RESTful-style web service services. API), adjust the default character set to: utf8mb4, the adjustment of the interface response format, the empty array is automatically converted to empty objects, and the request log message is collected in the interface application (1 request corresponds to 1 log message) to the database, and the corresponding interface to implement the log function: log list (set data filter to enable filter processing), log details

在开发环境中,执行数据库迁移命令失败:1071 Specified key was too long; max key length is 767 bytes

(6) Based on yiisoft/yii2-app-advanced, create a new repository yii2-app-advanced on github, and create a new interface application (implement RESTful-style web service services. API), adjust the default character set to: utf8mb4, the adjustment of the interface response format, the empty array is automatically converted to empty objects, and the request log message is collected in the interface application (1 request corresponds to 1 log message) to the database, and the corresponding interface to implement the log function: log list (set data filter to enable filter processing), log details (2)

浏览 user 表数据,status、updated_at 已经更新

(7) Based on yiisoft/yii2-app-advanced, create a new repository yii2-app-advanced on github, and create a new interface application (implement RESTful-style web service services. API), realize the soft deletion of ActiveRecord, generate ActiveQuery, and customize the query class

执行数据库迁移命令,查看数据库表 user 结构,符合预期

(8) Based on yiisoft/yii2-app-advanced, create a new repository yii2-app-advanced on github, and create a new interface application (implement RESTful-style web service services. API), realize the soft deletion of ActiveRecord, generate ActiveQuery, and customize the query class (2)

在 Postman 中 POST 请求,http://api.github-shuijingwan-yii2-app-advanced.localhost/v1/users ,输入格式:application/json

(9) Based on yiisoft/yii2-app-advanced, create a new repository yii2-app-advanced on github, and create a new interface application (implement RESTful-style web service services. API), application/x-www-form-urlencoded and multipart/form-data input formats, default support, new application/json input format support

打开 Windows PowerShell,执行 init 命令并选择 dev 作为环境,api应用所需环境配置文件自动生成

(10) Based on yiisoft/yii2-app-advanced, create a new repository yii2-app-advanced on github, and create a new remote procedure call application (implement hprose 2.0 for PHP’s RPC server), support for creating new RPC directories, configuration and environment, testing, Vagrant, etc.

出现以上原因是因为 Windows 下 nginx php 环境,不支持并发的原因,当同时访问多个域名,并且同时指向你本地服务的时候,就不支持并发了。nginx.conf 里面 对不同 server 修改 fastcgi_pass 的端口号,启动多个 php-cgi。

(11) Based on yiisoft/yii2-app-advanced, create a new repository yii2-app-advanced on github, and create a new remote procedure call application (implement hprose 2.0 for PHP RPC server), implement the corresponding RPC service of the page in the RPC directory, and implement the RPC client in the API directory

执行数据库迁移,查看表结构,基于 Gii 重新生成模型文件

(12) Based on yiisoft/yii2-app-advanced, create a new repository yii2-app-advanced on github, the implementation of uuid

由于日志消息是存储于 MySQL 的 log 表中,在生产环境中,累积了大量的数据,log 表的数据长度已经达到 数百 GB ,因此,决定基于控制台命令行实现日志消息的定时删除,开发环境的 log 表的数据长度为 14.64 GB

(13) Based on yiisoft/yii2-app-advanced, create a new repository yii2-app-advanced on github, automatic timing deletion of log messages

1. Create a new warehouse, shuijingwan/yii2-app-advanced, as shown in Figure 1 Yii 2 advanced project template, the template includes four layers: interface (the API to implement the RESTful style web service service), front-end, back-end and console, each of which is a separate YII application.
创建一个新的仓库,shuijingwan/yii2-app-advanced
Figure 1
2. Successfully created the warehouse, as shown in Figure 2
创建仓库成功
Figure 2
3. Use the following command to install the application: yiisoft/yii2-app-advanced, as shown in Figure 3
使用以下命令安装应用程序:yiisoft/yii2-app-advanced
Figure 3


composer self-update
composer global require "fxp/composer-asset-plugin"
composer create-project --prefer-dist yiisoft/yii2-app-advanced github-shuijingwan-yii2-app-advanced


4. Create a new warehouse on the command line and push the existing repository to shuijingwan/yii2-app-advanced, based on the second step, as shown in Figure 4
在命令行上创建一个新的仓库,推送现有的仓库至shuijingwan/yii2-app-advanced,基于第2步骤
Figure 4


git init
git add .
git commit -m "安装 yiisoft/yii2-app-advanced 后,全部提交。"
git remote add origin https://github.com/shuijingwan/yii2-app-advanced.git
git push -u origin master


5. Open: https://github.com/shuijingwan/yii2-app-advanced, the warehouse has been successfully pushed, as shown in Figure 5
打开:https://github.com/shuijingwan/yii2-app-advanced ,仓库已经推送成功
Figure 5
6. Open Windows PowerShell, execute the init command and select dev as the environment, as shown in Figure 6
打开 Windows PowerShell,执行 init 命令并选择 dev 作为环境
Figure 6


.\init
0
yes


7. Change the host file to point the domain to your server, configure the C:\Windows\System32\Drivers\etc\hosts file, as shown in Figure 7
更改主机文件以将域指向您的服务器,配置 C:\Windows\System32\drivers\etc\hosts 文件
Figure 7


# github-shuijingwan-yii2-app-advanced
127.0.0.1 github-shuijingwan-yii2-app-advanced.localhost www.github-shuijingwan-yii2-app-advanced.localhost backend.github-shuijingwan-yii2-app-advanced.localhost api.github-shuijingwan-yii2-app-advanced.localhost


8. Configure the Web server based on Nginx, configure virtual hosts: WWW, Backend, API to suspend configuration, edit C:\nginx-1.10.1\conf\vhosts\github-shuijingwan-yii2-app-advanced.conf


## FRONTEND ##
server {
    charset utf-8;
    client_max_body_size 128M;

    listen 80; ## listen for ipv4
    #listen [::]:80 default_server ipv6only=on; ## listen for ipv6

    server_name www.github-shuijingwan-yii2-app-advanced.localhost;
    root        E:/wwwroot/github-shuijingwan-yii2-app-advanced/frontend/web;
    index       index.php;

    access_log  logs/www.github-shuijingwan-yii2-app-advanced.localhost.access.log;
    error_log   logs/www.github-shuijingwan-yii2-app-advanced.localhost.error.log;

	location / {
		# Redirect everything that isn't a real file to index.php
		try_files $uri $uri/ /index.php$is_args$args;
	}

	# uncomment to avoid processing of calls to non-existing static files by Yii
	#location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
	#    try_files $uri =404;
	#}
	#error_page 404 /404.html;

	# deny accessing php files for the /assets directory
	location ~ ^/assets/.*\.php$ {
		deny all;
	}

	location ~ \.php$ {
		include fastcgi_params;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		fastcgi_pass 127.0.0.1:9000;
		#fastcgi_pass unix:/var/run/php5-fpm.sock;
		try_files $uri =404;
	}

	location ~* /\. {
		deny all;
	}
}

## BACKEND ##
server {
    charset utf-8;
    client_max_body_size 128M;

    listen 80; ## listen for ipv4
    #listen [::]:80 default_server ipv6only=on; ## listen for ipv6

    server_name backend.github-shuijingwan-yii2-app-advanced.localhost;
    root        E:/wwwroot/github-shuijingwan-yii2-app-advanced/backend/web;
    index       index.php;

    access_log  logs/backend.github-shuijingwan-yii2-app-advanced.localhost.access.log;
    error_log   logs/backend.github-shuijingwan-yii2-app-advanced.localhost.error.log;

	location / {
		# Redirect everything that isn't a real file to index.php
		try_files $uri $uri/ /index.php$is_args$args;
	}

	# uncomment to avoid processing of calls to non-existing static files by Yii
	#location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
	#    try_files $uri =404;
	#}
	#error_page 404 /404.html;

	# deny accessing php files for the /assets directory
	location ~ ^/assets/.*\.php$ {
		deny all;
	}

	location ~ \.php$ {
		include fastcgi_params;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		fastcgi_pass 127.0.0.1:9000;
		#fastcgi_pass unix:/var/run/php5-fpm.sock;
		try_files $uri =404;
	}

	location ~* /\. {
		deny all;
	}
}

## MISC ##

### WWW Redirect ###
server {
    listen       80;
    server_name  github-shuijingwan-yii2-app-advanced.localhost;
    return       301 http://www.github-shuijingwan-yii2-app-advanced.localhost$request_uri;
}



9. Check whether the current PHP environment meets the most basic needs of Yii, copy /requirements.php to /frontend/web/requirements.php, and then access the url through the browser http://www.github-shuijingwan-yii2-app-advanced.localhost/requirements.php , as shown in Figure 8
检查当前 PHP 环境是否满足 Yii 最基本需求,复制 /requirements.php 到 /frontend/web/requirements.php,然后通过浏览器访问 URL http://www.github-shuijingwan-yii2-app-advanced.localhost/requirements.php
8


$frameworkPath = dirname(__FILE__) . '/../../vendor/yiisoft/yii2';


10. Create a new database (g-s-yii2-app-advanced) and adjust the components in /common/config/main-local.php accordingly[‘db’]Configuration, the character set is utf8mb4.


CREATE USER 'g-s-yii2-app-advanced'@'%' IDENTIFIED WITH mysql_native_password AS '***';GRANT USAGE ON *.* TO 'g-s-yii2-app-advanced'@'%' REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;CREATE DATABASE IF NOT EXISTS `g-s-yii2-app-advanced`;GRANT ALL PRIVILEGES ON `g-s-yii2-app-advanced`.* TO 'g-s-yii2-app-advanced'@'%';




        'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=g-s-yii2-app-advanced',
            'username' => 'g-s-yii2-app-advanced',
            'password' => 'IADO0x7uK4UpaRRM',
            'charset' => 'utf8mb4',
        ],


11. Execute the migration command, as shown in Figure 9
执行迁移命令
Figure 9


.\yii migrate
yes


12. Check the database, the sorting rule is: utf8mb4_unicode_ci, as shown in Figure 10
查看数据库,排序规则为:utf8mb4_unicode_ci
Figure 10
13. Create a test database (g-s-yii2-app-advanced-test) and adjust the components in /common/config/test-local.php accordingly[‘db’]Configuration, the character set is utf8mb4.


CREATE USER 'g-s-yii2-app-advanced-test'@'%' IDENTIFIED WITH mysql_native_password AS '***';GRANT USAGE ON *.* TO 'g-s-yii2-app-advanced-test'@'%' REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;CREATE DATABASE IF NOT EXISTS `g-s-yii2-app-advanced-test`;GRANT ALL PRIVILEGES ON `g-s-yii2-app-advanced-test`.* TO 'g-s-yii2-app-advanced-test'@'%';




            'db' => [
                'dsn' => 'mysql:host=localhost;dbname=g-s-yii2-app-advanced-test',
                'username' => 'g-s-yii2-app-advanced-test',
                'password' => '9dIXzEvrGN9akpcO',
                'charset' => 'utf8mb4',
            ]


14. Execute the migration command and report an error: ExceptionYii\Base\UnknownPropertyExceptionwith messageSetting unknown property: yii\console\request::cookieValidat ionkeyIn e:\wwwroot\github-shuijingwan-yii2-app-advanced\vendor\yiisoft\yii2\base\component.php:209, as shown in Figure 11
执行迁移命令,报错:Exception 'yii\base\UnknownPropertyException' with message 'Setting unknown property: yii\console\Request::cookieValidat ionKey' in E:\wwwroot\github-shuijingwan-yii2-app-advanced\vendor\yiisoft\yii2\base\Component.php:209
Figure 11


./yii_test migrate


15. Since the console application uses different request components, edit \common\config\test.php, and annotate the request component (uncomment in the web application), as shown in Figure 12
由于控制台应用程序使用不同的请求组件,因此编辑 \common\config\test.php,注释 request 组件(在 Web 应用程序中需取消注释)
Figure 12


    'components' => [
        'user' => [
            'class' => 'yii\web\User',
            'identityClass' => 'common\models\User',
        ],
        /*
        'request' => [
            'cookieValidationKey' => 'test',
        ],
        */
    ],


16. Execute the migration command, build the test suite, and then run all the sample tests, as shown in Figure 13 Note: After executing the migration command (./yii_test migrate), you need to uncomment the request component, otherwise an error will be reported:
执行迁移命令、构建测试套件,然后运行所有的样例测试
Figure 13


 Test  ..\common\tests\unit\models\LoginFormTest.php:testLoginCorrect

  [yii\base\InvalidConfigException] yii\web\Request::cookieValidationKey must be configured with a secret key.




./yii_test migrate
vendor/bin/codecept build
vendor/bin/codecept run


17. Check the test database, the sorting rule is: utf8mb4_unicode_ci, as shown in Figure 14
查看测试数据库,排序规则为:utf8mb4_unicode_ci
Figure 14
18. Add interface application (API), copy frontend to API, environments/dev/frontend to environments/dev/api and environments/prod/frontend to environments/prod/api, as shown in Figure 15
添加接口应用程序(api),复制 frontend 至 api, environments/dev/frontend 至 environments/dev/api 以及 environments/prod/frontend 至 environments/prod/api
Figure 15
19. Delete all the files under the directory \API\Runtime\Debug, and adjust the namespace and path in the directory /API to start with the API (replace frontend to API), as shown in Figure 16
删除目录 \api\runtime\debug 下的所有文件,在目录 /api 中调整命名空间和路径以 api 开头(替换 frontend 为 api)
Figure 16
20. Add yii::setAlias in Common\Config\Bootstrap.php(API, dirname(dirname(__dir__)) ./api), as shown in Figure 17
在 common\config\bootstrap.php 中添加 Yii::setAlias('api', dirname(dirname(__DIR__)) . '/api');
Figure 17
21. Edit environments/index.php, search for this file with 6 frontends, then copy 6 copies accordingly, and replace them with api, as shown in Figure 18
编辑environments/index.php,搜索此文件有6处frontend,则相应复制6份,替换为api
18
22, \vagrant\nginx\app.conf, add virtual host API \vagrant\nginx\app.conf


server {
   charset utf-8;
   client_max_body_size 128M;
   sendfile off;

   listen 80; ## listen for ipv4
   #listen [::]:80 default_server ipv6only=on; ## listen for ipv6

   server_name y2aa-frontend.test;
   root        /app/frontend/web/;
   index       index.php;

   access_log  /app/vagrant/nginx/log/frontend-access.log;
   error_log   /app/vagrant/nginx/log/frontend-error.log;

   location / {
       # Redirect everything that isn't a real file to index.php
       try_files $uri $uri/ /index.php$is_args$args;
   }

   # uncomment to avoid processing of calls to non-existing static files by Yii
   #location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
   #    try_files $uri =404;
   #}
   #error_page 404 /404.html;

   location ~ \.php$ {
       include fastcgi_params;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       #fastcgi_pass   127.0.0.1:9000;
       fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
       try_files $uri =404;
   }

   location ~ /\.(ht|svn|git) {
       deny all;
   }
}

server {
   charset utf-8;
   client_max_body_size 128M;
   sendfile off;

   listen 80; ## listen for ipv4
   #listen [::]:80 default_server ipv6only=on; ## listen for ipv6

   server_name y2aa-backend.test;
   root        /app/backend/web/;
   index       index.php;

   access_log  /app/vagrant/nginx/log/backend-access.log;
   error_log   /app/vagrant/nginx/log/backend-error.log;

   location / {
       # Redirect everything that isn't a real file to index.php
       try_files $uri $uri/ /index.php$is_args$args;
   }

   # uncomment to avoid processing of calls to non-existing static files by Yii
   #location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
   #    try_files $uri =404;
   #}
   #error_page 404 /404.html;

   location ~ \.php$ {
       include fastcgi_params;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       #fastcgi_pass   127.0.0.1:9000;
       fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
       try_files $uri =404;
   }

   location ~ /\.(ht|svn|git) {
       deny all;
   }
}

server {
   charset utf-8;
   client_max_body_size 128M;
   sendfile off;

   listen 80; ## listen for ipv4
   #listen [::]:80 default_server ipv6only=on; ## listen for ipv6

   server_name y2aa-api.test;
   root        /app/api/web/;
   index       index.php;

   access_log  /app/vagrant/nginx/log/api-access.log;
   error_log   /app/vagrant/nginx/log/api-error.log;

   location / {
       # Redirect everything that isn't a real file to index.php
       try_files $uri $uri/ /index.php$is_args$args;
   }

   # uncomment to avoid processing of calls to non-existing static files by Yii
   #location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
   #    try_files $uri =404;
   #}
   #error_page 404 /404.html;

   location ~ \.php$ {
       include fastcgi_params;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       #fastcgi_pass   127.0.0.1:9000;
       fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
       try_files $uri =404;
   }

   location ~ /\.(ht|svn|git) {
       deny all;
   }
}



23. Edit \vagrant\nginx\log\.gitignore, the log file of the configuration API is ignored


# nginx logs
backend-access.log
backend-error.log
frontend-access.log
frontend-error.log
api-access.log
api-error.log


24. Edit \VagrantFile to add API-related configurations


require 'yaml'
require 'fileutils'

required_plugins = %w( vagrant-hostmanager vagrant-vbguest )
required_plugins.each do |plugin|
    exec "vagrant plugin install #{plugin}" unless Vagrant.has_plugin? plugin
end

domains = {
  frontend: 'y2aa-frontend.test',
  backend:  'y2aa-backend.test',
  api:      'y2aa-api.test',
}

config = {
  local: './vagrant/config/vagrant-local.yml',
  example: './vagrant/config/vagrant-local.example.yml'
}

# copy config from example if local config not exists
FileUtils.cp config[:example], config[:local] unless File.exist?(config[:local])
# read config
options = YAML.load_file config[:local]

# check github token
if options['github_token'].nil? || options['github_token'].to_s.length != 40
  puts "You must place REAL GitHub token into configuration:\n/yii2-app-advanced/vagrant/config/vagrant-local.yml"
  exit
end

# vagrant configurate
Vagrant.configure(2) do |config|
  # select the box
  config.vm.box = 'bento/ubuntu-16.04'

  # should we ask about box updates?
  config.vm.box_check_update = options['box_check_update']

  config.vm.provider 'virtualbox' do |vb|
    # machine cpus count
    vb.cpus = options['cpus']
    # machine memory size
    vb.memory = options['memory']
    # machine name (for VirtualBox UI)
    vb.name = options['machine_name']
  end

  # machine name (for vagrant console)
  config.vm.define options['machine_name']

  # machine name (for guest machine console)
  config.vm.hostname = options['machine_name']

  # network settings
  config.vm.network 'private_network', ip: options['ip']

  # sync: folder 'yii2-app-advanced' (host machine) -> folder '/app' (guest machine)
  config.vm.synced_folder './', '/app', owner: 'vagrant', group: 'vagrant'

  # disable folder '/vagrant' (guest machine)
  config.vm.synced_folder '.', '/vagrant', disabled: true

  # hosts settings (host machine)
  config.vm.provision :hostmanager
  config.hostmanager.enabled            = true
  config.hostmanager.manage_host        = true
  config.hostmanager.ignore_private_ip  = false
  config.hostmanager.include_offline    = true
  config.hostmanager.aliases            = domains.values

  # provisioners
  config.vm.provision 'shell', path: './vagrant/provision/once-as-root.sh', args: [options['timezone']]
  config.vm.provision 'shell', path: './vagrant/provision/once-as-vagrant.sh', args: [options['github_token']], privileged: false
  config.vm.provision 'shell', path: './vagrant/provision/always-as-root.sh', run: 'always'

  # post-install message (vagrant console)
  config.vm.post_up_message = "Frontend URL: http://#{domains[:frontend]}\nBackend URL: http://#{domains[:backend]}\nApi URL: http://#{domains[:api]}"
end



25. Configure the web server based on Nginx, configure virtual hosts: WWW, Backend, API, edit C:\nginx-1.10.1\conf\vhosts\github-shuijingwan-yii2-app-advanced.conf


## FRONTEND ##
server {
    charset utf-8;
    client_max_body_size 128M;

    listen 80; ## listen for ipv4
    #listen [::]:80 default_server ipv6only=on; ## listen for ipv6

    server_name www.github-shuijingwan-yii2-app-advanced.localhost;
    root        E:/wwwroot/github-shuijingwan-yii2-app-advanced/frontend/web;
    index       index.php;

    access_log  logs/www.github-shuijingwan-yii2-app-advanced.localhost.access.log;
    error_log   logs/www.github-shuijingwan-yii2-app-advanced.localhost.error.log;

	location / {
		# Redirect everything that isn't a real file to index.php
		try_files $uri $uri/ /index.php$is_args$args;
	}

	# uncomment to avoid processing of calls to non-existing static files by Yii
	#location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
	#    try_files $uri =404;
	#}
	#error_page 404 /404.html;

	# deny accessing php files for the /assets directory
	location ~ ^/assets/.*\.php$ {
		deny all;
	}

	location ~ \.php$ {
		include fastcgi_params;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		fastcgi_pass 127.0.0.1:9000;
		#fastcgi_pass unix:/var/run/php5-fpm.sock;
		try_files $uri =404;
	}

	location ~* /\. {
		deny all;
	}
}

## BACKEND ##
server {
    charset utf-8;
    client_max_body_size 128M;

    listen 80; ## listen for ipv4
    #listen [::]:80 default_server ipv6only=on; ## listen for ipv6

    server_name backend.github-shuijingwan-yii2-app-advanced.localhost;
    root        E:/wwwroot/github-shuijingwan-yii2-app-advanced/backend/web;
    index       index.php;

    access_log  logs/backend.github-shuijingwan-yii2-app-advanced.localhost.access.log;
    error_log   logs/backend.github-shuijingwan-yii2-app-advanced.localhost.error.log;

	location / {
		# Redirect everything that isn't a real file to index.php
		try_files $uri $uri/ /index.php$is_args$args;
	}

	# uncomment to avoid processing of calls to non-existing static files by Yii
	#location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
	#    try_files $uri =404;
	#}
	#error_page 404 /404.html;

	# deny accessing php files for the /assets directory
	location ~ ^/assets/.*\.php$ {
		deny all;
	}

	location ~ \.php$ {
		include fastcgi_params;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		fastcgi_pass 127.0.0.1:9000;
		#fastcgi_pass unix:/var/run/php5-fpm.sock;
		try_files $uri =404;
	}

	location ~* /\. {
		deny all;
	}
}

## API ##
server {
    charset utf-8;
    client_max_body_size 128M;

    listen 80; ## listen for ipv4
    #listen [::]:80 default_server ipv6only=on; ## listen for ipv6

    server_name api.github-shuijingwan-yii2-app-advanced.localhost;
    root        E:/wwwroot/github-shuijingwan-yii2-app-advanced/api/web;
    index       index.php;

    access_log  logs/api.github-shuijingwan-yii2-app-advanced.localhost.access.log;
    error_log   logs/api.github-shuijingwan-yii2-app-advanced.localhost.error.log;

	location / {
		# Redirect everything that isn't a real file to index.php
		try_files $uri $uri/ /index.php$is_args$args;
	}

	# uncomment to avoid processing of calls to non-existing static files by Yii
	#location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
	#    try_files $uri =404;
	#}
	#error_page 404 /404.html;

	# deny accessing php files for the /assets directory
	location ~ ^/assets/.*\.php$ {
		deny all;
	}

	location ~ \.php$ {
		include fastcgi_params;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		fastcgi_pass 127.0.0.1:9000;
		#fastcgi_pass unix:/var/run/php5-fpm.sock;
		try_files $uri =404;
	}

	location ~* /\. {
		deny all;
	}
}

## MISC ##

### WWW Redirect ###
server {
    listen       80;
    server_name  github-shuijingwan-yii2-app-advanced.localhost;
    return       301 http://www.github-shuijingwan-yii2-app-advanced.localhost$request_uri;
}



26. Open Windows PowerShell, execute the init command and select dev as the environment, and the environment configuration file required by the API application is automatically generated, as shown in Figure 19
打开 Windows PowerShell,执行 init 命令并选择 dev 作为环境,api应用所需环境配置文件自动生成
Figure 19


.\init
0
yes
Yes
Yes
Yes
Yes
Yes


27. Open: http://api.github-shuijingwan-yii2-app-advanced.localhost/ , as expected, as shown in Figure 20
打开:http://api.github-shuijingwan-yii2-app-advanced.localhost/ ,符合预期
Figure 20
28. Edit the codeception.yml configuration that contains the tests of all applications, as shown in Figure 21
编辑 codeception.yml 配置包含所有应用程序的测试
Figure 21


# global codeception file to run tests from all apps
include:
    - common
    - frontend
    - backend
    - api
paths:
    log: console/runtime/logs
settings:
    colors: true


29. Run all sample tests, including the API, as shown in Figure 22
运行所有的样例测试,包含 api
Figure 22


vendor/bin/codecept run


30. Edit readme.md and add an API to the directory structure


<p align="center">
    <a href="https://github.com/yiisoft" target="_blank">
        <img src="https://avatars0.githubusercontent.com/u/993323" height="100px">
    </a>
    <h1 align="center">Yii 2 Advanced Project Template</h1>
    <br>
</p>

Yii 2 Advanced Project Template is a skeleton [Yii 2](http://www.yiiframework.com/) application best for
developing complex Web applications with multiple tiers.

The template includes three tiers: front end, back end, and console, each of which
is a separate Yii application.

The template is designed to work in a team development environment. It supports
deploying the application in different environments.

Documentation is at [docs/guide/README.md](docs/guide/README.md).

[![Latest Stable Version](https://img.shields.io/packagist/v/yiisoft/yii2-app-advanced.svg)](https://packagist.org/packages/yiisoft/yii2-app-advanced)
[![Total Downloads](https://img.shields.io/packagist/dt/yiisoft/yii2-app-advanced.svg)](https://packagist.org/packages/yiisoft/yii2-app-advanced)
[![Build Status](https://travis-ci.org/yiisoft/yii2-app-advanced.svg?branch=master)](https://travis-ci.org/yiisoft/yii2-app-advanced)

DIRECTORY STRUCTURE
-------------------

```
common
    config/              contains shared configurations
    mail/                contains view files for e-mails
    models/              contains model classes used in both api and backend and frontend
    tests/               contains tests for common classes    
console
    config/              contains console configurations
    controllers/         contains console controllers (commands)
    migrations/          contains database migrations
    models/              contains console-specific model classes
    runtime/             contains files generated during runtime
backend
    assets/              contains application assets such as JavaScript and CSS
    config/              contains backend configurations
    controllers/         contains Web controller classes
    models/              contains backend-specific model classes
    runtime/             contains files generated during runtime
    tests/               contains tests for backend application    
    views/               contains view files for the Web application
    web/                 contains the entry script and Web resources
frontend
    assets/              contains application assets such as JavaScript and CSS
    config/              contains frontend configurations
    controllers/         contains Web controller classes
    models/              contains frontend-specific model classes
    runtime/             contains files generated during runtime
    tests/               contains tests for frontend application
    views/               contains view files for the Web application
    web/                 contains the entry script and Web resources
    widgets/             contains frontend widgets
api
    assets/              contains application assets such as JavaScript and CSS
    config/              contains api configurations
    controllers/         contains Web controller classes
    models/              contains api-specific model classes
    runtime/             contains files generated during runtime
    tests/               contains tests for api application
    views/               contains view files for the Web application
    web/                 contains the entry script and Web resources
    widgets/             contains api widgets
vendor/                  contains dependent 3rd-party packages
environments/            contains environment-based overrides
```



31. Test whether to use vagrant to install, whether to support API, reference URL: https://github.com/yiisoft/yii2-app-advance d/blob/master/docs/guide-en-en/start-installation.md , using Vagrant to install (Windows User Manual) 32. Go to the /vagrant/config folder, rename vagrant-local.example.yml as vagrant-local.yml (recommended to copy), and place the github personal API token to vagrant-local.yml, as shown in Figure 23
进入 /vagrant/config 文件夹,重命名 vagrant-local.example.yml 为 vagrant-local.yml(建议复制),将GitHub个人API令牌放置到 vagrant-local.yml
Figure 23
33. Add the following code to the hosts file


# github-shuijingwan-yii2-app-advanced Vagrant
192.168.83.137 y2aa-frontend.test y2aa-backend.test y2aa-api.test


34. Open Windows PowerShell, switch the path to the root directory of the project, and execute the following commands (need to overturn the wall, it may need to be executed multiple times), there is an error during the period, refer to step 15 processing, as shown in Figure 24 and Figure 25
打开Windows PowerShell,切换路径至项目根目录,并且执行如下命令
Figure 24
期间有报错,参考第15步骤处理
Figure 25


vagrant plugin install vagrant-hostmanager
vagrant up


35. After waiting for completion, just access the following URL in the browser, which is in line with expectations, as shown in Figure 26 frontend: http://y2aa-frontend.test backend: http://y2aa-backend.test API: http://y2aa-api.test
等待完成后,在浏览器中访问如下URL即可,符合预期
Figure 26
36. Restore the modification made in step 32, and edit \vagrant\config\.gitignore


# local configuration
vagrant-local.yml


Based on yiisoft/yii2-app-advanced, create a new repository yii2-app-advanced on github, and create a new interface application (implement RESTful-style web service services. API), implement model hierarchy: data layer, logic layer, clarify common directory, application, module inheritance, reference relationship

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.