基于 yiisoft/yii2-app-advanced,在 GitHub 上新建仓库 yii2-app-advanced,新建接口应用(实现 RESTful 风格的 Web Service 服务的 API),新建api目录、配置和环境、测试、Vagrant等的支持 (一)
1、创建一个新的仓库,shuijingwan/yii2-app-advanced,如图1
Yii 2高级项目模板,模板包括四个层:接口(实现 RESTful 风格的 Web Service 服务的 API),前端,后端和控制台,每个都是单独的Yii应用程序。
2、创建仓库成功,如图2
3、使用以下命令安装应用程序:yiisoft/yii2-app-advanced,如图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、在命令行上创建一个新的仓库,推送现有的仓库至shuijingwan/yii2-app-advanced,基于第2步骤,如图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、打开:https://github.com/shuijingwan/yii2-app-advanced ,仓库已经推送成功,如图5
6、打开 Windows PowerShell,执行 init 命令并选择 dev 作为环境,如图6
.\init 0 yes
7、更改主机文件以将域指向您的服务器,配置 C:\Windows\System32\drivers\etc\hosts 文件,如图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、基于 Nginx 配置 Web 服务器,配置虚拟主机:www、backend,api 暂缓配置,编辑 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、检查当前 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、创建一个新的数据库(g-s-yii2-app-advanced),并相应地调整 /common/config/main-local.php 中的 components[‘db’] 配置,字符集为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、执行迁移命令,如图9
.\yii migrate yes
12、查看数据库,排序规则为:utf8mb4_unicode_ci,如图10
13、创建测试数据库(g-s-yii2-app-advanced-test),并相应地调整 /common/config/test-local.php 中的 components[‘db’] 配置,字符集为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、执行迁移命令,报错: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,如图11
./yii_test migrate
15、由于控制台应用程序使用不同的请求组件,因此编辑 \common\config\test.php,注释 request 组件(在 Web 应用程序中需取消注释),如图12
'components' => [ 'user' => [ 'class' => 'yii\web\User', 'identityClass' => 'common\models\User', ], /* 'request' => [ 'cookieValidationKey' => 'test', ], */ ],
16、执行迁移命令、构建测试套件,然后运行所有的样例测试,如图13
注:执行迁移命令(./yii_test migrate)后,需取消注释 request 组件,否则报错:
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、查看测试数据库,排序规则为:utf8mb4_unicode_ci,如图14
18、添加接口应用程序(api),复制 frontend 至 api, environments/dev/frontend 至 environments/dev/api 以及 environments/prod/frontend 至 environments/prod/api,如图15
19、删除目录 \api\runtime\debug 下的所有文件,在目录 /api 中调整命名空间和路径以 api 开头(替换 frontend 为 api),如图16
20、在 common\config\bootstrap.php 中添加 Yii::setAlias(‘api’, dirname(dirname(__DIR__)) . ‘/api’);,如图17
21、编辑environments/index.php,搜索此文件有6处frontend,则相应复制6份,替换为api,如图18
22、\vagrant\nginx\app.conf,新增虚拟主机 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、编辑 \vagrant\nginx\log\.gitignore,配置api的日志文件为忽略
# nginx logs backend-access.log backend-error.log frontend-access.log frontend-error.log api-access.log api-error.log
24、编辑 \Vagrantfile,新增 api 相关的配置
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、基于 Nginx 配置 Web 服务器,配置虚拟主机:www、backend、api,编辑 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、打开 Windows PowerShell,执行 init 命令并选择 dev 作为环境,api应用所需环境配置文件自动生成,如图19
.\init 0 yes Yes Yes Yes Yes Yes
27、打开:http://api.github-shuijingwan-yii2-app-advanced.localhost/ ,符合预期,如图20
28、编辑 codeception.yml 配置包含所有应用程序的测试,如图21
# global codeception file to run tests from all apps include: - common - frontend - backend - api paths: log: console/runtime/logs settings: colors: true
29、运行所有的样例测试,包含 api,如图22
vendor/bin/codecept run
30、编辑 README.md,在目录结构中新增 api
<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、测试使用Vagrant安装,是否支持 api,参考网址:https://github.com/yiisoft/yii2-app-advanced/blob/master/docs/guide-zh-CN/start-installation.md ,使用Vagrant安装(Windows 用户手册)
32、进入 /vagrant/config 文件夹,重命名 vagrant-local.example.yml 为 vagrant-local.yml(建议复制),将GitHub个人API令牌放置到 vagrant-local.yml,如图23
33、添加如下代码到 hosts 文件
# github-shuijingwan-yii2-app-advanced Vagrant 192.168.83.137 y2aa-frontend.test y2aa-backend.test y2aa-api.test
34、打开Windows PowerShell,切换路径至项目根目录,并且执行如下命令(需要翻墙,可能需要执行多次),期间有报错,参考第15步骤处理,如图24、图25
vagrant plugin install vagrant-hostmanager vagrant up
35、等待完成后,在浏览器中访问如下URL即可,符合预期,如图26
frontend: http://y2aa-frontend.test
backend: http://y2aa-backend.test
api: http://y2aa-api.test
36、还原第32步骤所做的修改,且编辑 \vagrant\config\.gitignore
# local configuration vagrant-local.yml
1 条回复
[…] 基于 yiisoft/yii2-app-advanced,在 GitHub 上新建仓库 yii2-app-advanced,新建接口应用… […]