QueryPHP 很是歡迎各位給咱們共同的充滿想象且使人驚歎的完成度的開源做品添磚加瓦,實現爲 PHP 社區提供一個好框架的美好願景。javascript
成爲開發者須要加入咱們的組織,若有相關意願請發送郵件至 小牛哥 <635750556@qq.com>
,咱們會聯繫你的。php
成爲開發者並無什麼任務負擔,一切主要以你的意願,興趣纔是最重要的。html
本篇指南將帶你搭建的 QueryPHP 開發框架的開發環境,使得你能夠參與 QueryPHP 底層代碼、單元測試和文檔等開發工做。前端
這裏以筆者的 Mac 爲例子說明,其實 Windows 下面還更簡單些。vue
queryphp
倉庫QueryPHP 框架的開發來自於從克隆主倉庫開始,因爲國內訪問 Github 網速的問題,只須要等待一小段時間。java
下載代碼node
$cd /data/codes/test $git clone git@github.com:hunzhiwange/queryphp.git
Composer 安裝mysql
composer install
若是你電腦沒有安裝
composer
,那麼已經爲你下載一個版本。
sudo chmod 777 ./build/composer ./build/composer install
安裝過程git
Cloning into 'queryphp'... remote: Enumerating objects: 54, done. remote: Counting objects: 100% (54/54), done. remote: Compressing objects: 100% (39/39), done. remote: Total 17821 (delta 19), reused 36 (delta 14), pack-reused 17767 Receiving objects: 100% (17821/17821), 45.12 MiB | 693.00 KiB/s, done. Resolving deltas: 100% (8700/8700), done.
測試是否安裝成功github
若是能夠訪問,那麼恭喜你第一階段即安裝完畢。
首先咱們須要建立一個數據庫來運行咱們的後臺,讓咱們對 QueryPHP 有一個直觀的感覺,同時方便後期開發調試等。
首先建立一個數據庫
能夠用 Navicat For Mysql 建立一個數據庫 queryphp_development_db
.
CREATE DATABASE IF NOT EXISTS queryphp_development_db DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
修改 .env
... // Database DATABASE_DRIVER = mysql DATABASE_HOST = 127.0.0.1 DATABASE_PORT = 3306 DATABASE_NAME = queryphp_development_db DATABASE_USER = root DATABASE_PASSWORD = ... 修改成 ... // Database DATABASE_DRIVER = mysql DATABASE_HOST = 127.0.0.1 DATABASE_PORT = 3306 DATABASE_NAME = queryphp_development_db DATABASE_USER = root DATABASE_PASSWORD = 123456 ...
執行數據庫遷移命令
php leevel migrate:migrate
安裝過程
using config file ./phinx.php using config parser php using migration paths - /data/codes/test/queryphp/database/migrations using seed paths - /data/codes/test/queryphp/database/seeds warning no environment specified, defaulting to: development using adapter mysql using database queryphp_development_db == 20181109060739 App: migrating == 20181109060739 App: migrated 0.0155s == 20181112023649 Role: migrating == 20181112023649 Role: migrated 0.0160s == 20181112024140 User: migrating == 20181112024140 User: migrated 0.0166s == 20181112024211 Permission: migrating == 20181112024211 Permission: migrated 0.0225s == 20181112024241 UserRole: migrating == 20181112024241 UserRole: migrated 0.0155s == 20181112024302 RolePermission: migrating == 20181112024302 RolePermission: migrated 0.0206s == 20181112024416 Resource: migrating == 20181112024416 Resource: migrated 0.0328s == 20181112024450 PermissionResource: migrating == 20181112024450 PermissionResource: migrated 0.0305s == 20181203130724 Option: migrating == 20181203130724 Option: migrated 0.0170s == 20181203144731 Test: migrating == 20181203144731 Test: migrated 0.0133s All Done. Took 0.2273s
測試數據庫是否正常
php leevel server <http://127.0.0.1:9527/api/entity>
結果
{ count: 4, :trace: { ... } }
後臺 API 搭建好了,咱們開始搭建前端了,前端基於 Vue-cli 3
和 IView
,首先須要安裝 node
纔可以跑起來。
對於開發 QueryPHP 來講,你不須要會 Vue
或者 JavaScript
,因此請放心不要有內心負擔。
安裝前端
第一步安裝前端,細節信息能夠在 frontend/README.md 查看.
cd frontend npm install -g cnpm --registry=https://registry.npm.taobao.org // Just once cnpm install
安裝過程
✔ All packages installed (1264 packages installed from npm registry, used 14s(network 13s), speed 221.08kB/s, json 1086(2.23MB), tarball 501.92kB)
運行前端
接着訪問這個登錄地址.
npm run serve # npm run dev <http://127.0.0.1:9528/#/login>
輸入登錄用戶名和密碼,這個時候 QueryPHP 再也不是一個冰冷的代碼,而是有一個乾淨的帶有基礎權限系統的後臺。
user: admin password: 123456
QueryPHP 推崇經過編寫測試用例來讓代碼變得可維護,因此這裏須要本地開發跑通測試用例。
首先建立一個數據庫
能夠用 Navicat For Mysql 建立一個數據庫 queryphp_development_test
.
CREATE DATABASE IF NOT EXISTS queryphp_development_test DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
修改 .env
... // Database DATABASE_DRIVER = mysql DATABASE_HOST = 127.0.0.1 DATABASE_PORT = 3306 DATABASE_NAME = test DATABASE_USER = root DATABASE_PASSWORD = ... 修改成 ... // Database DATABASE_DRIVER = mysql DATABASE_HOST = 127.0.0.1 DATABASE_PORT = 3306 DATABASE_NAME = queryphp_development_test DATABASE_USER = root DATABASE_PASSWORD = 123456 ...
執行數據庫遷移命令
php leevel migrate:migrate -e testing
安裝過程
using config file ./phinx.php using config parser php using migration paths - /data/codes/test/queryphp/database/migrations using seed paths - /data/codes/test/queryphp/database/seeds using environment testing using adapter mysql using database queryphp_development_test == 20181109060739 App: migrating == 20181109060739 App: migrated 0.0155s == 20181112023649 Role: migrating == 20181112023649 Role: migrated 0.0160s == 20181112024140 User: migrating == 20181112024140 User: migrated 0.0166s == 20181112024211 Permission: migrating == 20181112024211 Permission: migrated 0.0225s == 20181112024241 UserRole: migrating == 20181112024241 UserRole: migrated 0.0155s == 20181112024302 RolePermission: migrating == 20181112024302 RolePermission: migrated 0.0206s == 20181112024416 Resource: migrating == 20181112024416 Resource: migrated 0.0328s == 20181112024450 PermissionResource: migrating == 20181112024450 PermissionResource: migrated 0.0305s == 20181203130724 Option: migrating == 20181203130724 Option: migrated 0.0170s == 20181203144731 Test: migrating == 20181203144731 Test: migrated 0.0133s All Done. Took 0.2273s
運行測試用例
php ./build/phpunit
結果
注意隨着系統演進,測試用例會增長,輸出結果就有所不一樣。
PHPUnit Pretty Result Printer 0.26.2 by Codedungeon and contributors. PHPUnit 8.1.3 by Sebastian Bergmann and contributors. ==> Tests\Admin\Service\Resource\IndexTest ✓ ✓ ==> Tests\Example\ExampleTest ✓ ==> Tests\Example\PHPUnitTest ✓ ==> Common\Domain\Service\Search\IndexTest ✓ ✓ ✓ ✓ ✓ ✓ ==> Common\Infra\Helper\ArrayToFormTest ✓ ✓ ✓ ✓ ✓ ✓ ==> Common\Infra\Support\WorkflowServiceTest ✓ ✓ ✓ ✓ ✓ ==> Common\Infra\Support\WorkflowTest ✓ ✓ ✓ ✓ ✓ Time: 391 ms, Memory: 18.00 MB OK (26 tests, 43 assertions)
風格統一對保證咱們系統一致性很是重要,咱們作到開箱即用,支持 PHP
和 JavaScript
。
使用 Git 鉤子
cp ./build/pre-commit.sh ./.git/hooks/pre-commit chmod 777 ./.git/hooks/pre-commit
測試自動化格式
common/Test.php
<?php declare(strict_types=1); namespace Common; class Test{ public function demo($a=1, $b=4){ echo 1; } }
frontend/src/hello.js
function hello(a,b) { var c if(a>b) { c=a } else { c=b } console.log(c) }
Git 提交測試格式化
git add . git commit -m '測試格式化'
運行過程
Checking PHP Lint... No syntax errors detected in common/Test.php Running Code Sniffer... Loaded config default from ".php_cs.dist". Paths from configuration file have been overridden by paths provided as command arguments. 1) common/Test.php Fixed all files in 0.009 seconds, 12.000 MB memory used The file has been automatically formatted. [13:04:00] Working directory changed to /data/codes/test/queryphp/frontend [13:04:00] Using gulpfile /data/codes/test/queryphp/frontend/gulpfile.js [13:04:00] Starting 'iview'... [13:04:00] Finished 'iview' after 413 μs frontend/src/hello.js 53ms [master 681d7e29] 測試格式化 3 files changed, 32 insertions(+) mode change 100644 => 100755 build/composer create mode 100644 common/Test.php create mode 100644 frontend/src/hello.js
代碼乾淨漂亮了很多,不是嗎。
<?php declare(strict_types=1); /* * This file is part of the your app package. * * The PHP Application For Code Poem For You. * (c) 2018-2099 http://yourdomian.com All rights reserved. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Common; class Test { public function demo($a = 1, $b = 4) { echo 1; } }
代碼乾淨漂亮了很多,不是嗎。
function hello(a, b) { var c if (a > b) { c = a } else { c = b } console.log(c) }
這些測試代碼不須要提交到 Git 庫,你能夠回滾掉剛纔測試的這些代碼。
git log git reset --hard 931f283b0b8847e4a3f2ad86efb3c07cd7974c3b // 或者 git revert xxx HEAD is now at 931f283b Merge branch 'dev'
framework
倉庫將框架替換爲開發版本應用層框架所有搭建完畢,接下來咱們將框架層代碼替換爲開發階段的代碼來進行平常框架迭代。
刪除框架層
rm -rf ./vendor/hunzhiwange/framework
克隆框架層開發庫
$cd /data/codes/test $git clone git@github.com:hunzhiwange/framework.git ./vendor/hunzhiwange/framework cd ./vendor/hunzhiwange/framework
Composer 安裝
composer install
若是你電腦沒有安裝
composer
,那麼已經爲你下載一個版本。
sudo chmod 777 ./build/composer ./build/composer install
安裝過程
Cloning into './vendor/hunzhiwange/framework'... remote: Enumerating objects: 382, done. remote: Counting objects: 100% (382/382), done. remote: Compressing objects: 100% (218/218), done. remote: Total 39304 (delta 196), reused 262 (delta 125), pack-reused 38922 Receiving objects: 100% (39304/39304), 14.49 MiB | 12.00 KiB/s, done. Resolving deltas: 100% (27594/27594), done.
測試是否安裝成功
重新訪問首頁,若是能夠訪問,那麼恭喜你第一階段即安裝完畢。
php leevel server <Visite http://127.0.0.1:9527/>
QueryPHP 底層框架擁有 3000 多例測試用例,這些測試用例須要被維護,因此這裏須要本地開發跑通測試用例。首先建立一個數據庫
能夠用 Navicat For Mysql 建立一個數據庫 test
.
CREATE DATABASE IF NOT EXISTS test DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
複製一份配置文件並修改
cp ./tests/config.php ./tests/config.local.php
修改成
<?php $GLOBALS['LEEVEL_ENV']['DATABASE']['MYSQL'] = [ 'HOST' => '127.0.0.1', 'PORT' => 3306, 'NAME' => 'test', 'USER' => 'root', 'PASSWORD' => '123456', ]; $GLOBALS['LEEVEL_ENV']['CACHE']['REDIS'] = [ 'HOST' => '127.0.0.1', 'PORT' => 6380, 'PASSWORD' => '123456', ]; $GLOBALS['LEEVEL_ENV']['SESSION']['REDIS'] = [ 'HOST' => '127.0.0.1', 'PORT' => 6380, 'PASSWORD' => '123456', ];
執行數據庫遷移命令
php vendor/bin/phinx migrate
安裝過程
Phinx by CakePHP - https://phinx.org. 0.9.2 using config file ./phinx.php using config parser php using migration paths - /data/codes/test/queryphp/vendor/hunzhiwange/framework/tests/assert/database/migrations using seed paths - /data/codes/test/queryphp/vendor/hunzhiwange/framework/tests/assert/database/seeds warning no environment specified, defaulting to: development using adapter mysql using database test == 20181010111946 User: migrating == 20181010111946 User: migrated 0.0076s == 20181011111926 Post: migrating == 20181011111926 Post: migrated 0.0101s == 20181011111937 Comment: migrating == 20181011111937 Comment: migrated 0.0106s == 20181011151247 PostContent: migrating == 20181011151247 PostContent: migrated 0.0087s == 20181011160957 Role: migrating == 20181011160957 Role: migrated 0.0078s == 20181011161035 UserRole: migrating == 20181011161035 UserRole: migrated 0.0100s == 20181031094608 CompositeId: migrating == 20181031094608 CompositeId: migrated 0.0094s == 20181107044153 GuestBook: migrating == 20181107044153 GuestBook: migrated 0.0086s == 20190424055915 TestUnique: migrating == 20190424055915 TestUnique: migrated 0.0133s All Done. Took 0.1179s
運行測試用例
php ./build/phpunit
結果
注意隨着系統演進,測試用例會增長,輸出結果就有所不一樣。
PHPUnit 8.1.3 by Sebastian Bergmann and contributors. ==> Tests\Auth\HashTest ✓ ✓ ==> Tests\Auth\ManagerTest ✓ ✓ ✓ ==> Tests\Auth\Middleware\AuthTest ✓ ✓ ==> Tests\Auth\Provider\RegisterTest ✓ ==> Tests\Auth\SessionTest ✓ ✓ ... ==> Tests\View\Compiler\CompilerWhileTest ✓ ✓ ==> Tests\View\HtmlTest ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ==> Tests\View\ManagerTest ✓ ==> Tests\View\PhpuiTest ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ==> Tests\View\Provider\RegisterTest ✓ Time: 19.51 seconds, Memory: 93.19 MB Tests: 2978, Assertions: 10031, Failures: 0, Skipped: 6.
風格統一對保證咱們系統一致性很是重要,咱們作到開箱即用,核心庫只包含 PHP 文件。
使用 Git 鉤子
cp ./build/pre-commit.sh ./.git/hooks/pre-commit chmod 777 ./.git/hooks/pre-commit
測試自動化格式
tests/Name.php
<?php declare(strict_types=1); namespace Test; class Name{ public function demo($a=1, $b=4){ echo 1; } }
Git 提交測試格式化
git add . git commit -m '測試格式化'
運行過程
Checking PHP Lint... No syntax errors detected in tests/Name.php Running Code Sniffer... Loaded config default from ".php_cs.dist". Paths from configuration file have been overridden by paths provided as command arguments. 1) tests/Name.php Fixed all files in 0.009 seconds, 12.000 MB memory used The file has been automatically formatted. [master 20f2f845] 測試格式化 2 files changed, 29 insertions(+) mode change 100644 => 100755 build/composer create mode 100644 tests/Name.php
代碼乾淨漂亮了很多,不是嗎。
測試代碼回滾請見上面的方法,謝謝。
<?php declare(strict_types=1); * * This file is part of the ************************ package. * _____________ _______________ * ______/ \__ _____ ____ ______ / /_ _________ * ____/ __ / / / / _ \/ __`\/ / __ \/ __ \/ __ \___ * __/ / / / /_/ / __/ / \ / /_/ / / / / /_/ /__ * \_\ \_/\____/\___/_/ / / .___/_/ /_/ .___/ * \_\ /_/_/ /_/ * * The PHP Framework For Code Poem As Free As Wind. <Query Yet Simple> * (c) 2010-2019 http://queryphp.com All rights reserved. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Test; class Name { public function demo($a = 1, $b = 4) { echo 1; } }
queryphp.com
倉庫實現自動化文檔搭建QueryPHP 底層的文檔基於單元測試加備註的方式來實現的,經過命名工具所有采用自動化生成 Markdown,這大幅度簡化了文檔的編寫工做,同時保證了文檔實時性。
官方文檔採用 VuePress 讀取 Markdown 來實現的
$cd /data/codes/test $git clone git@github.com:hunzhiwange/queryphp.com.git
修改文檔工具生成 Markdown 的路徑
$cd /data/codes/test/queryphp $vim .env # 修改路徑 FRAMEWORK_DOC_OUTPUTDIR = "/data/codes/test/queryphp.com/docs/docs/"
生成文檔
$cd /data/codes/test/queryphp $php leevel make:docwithin tests
運行過程
Class Tests\Encryption\EncryptionTest was generate succeed. Class Tests\Encryption\SafeTest was generate succeed. Class Tests\Database\ManagerTest was generate succeed. Class Tests\Database\Ddd\UnitOfWorkTest was generate succeed. Class Tests\Database\Ddd\Create\CreateTest was generate succeed. Class Tests\Database\Query\AggregateTest was generate succeed. Class Tests\Validate\AssertTest was generate succeed. Class Tests\Di\ContainerTest was generate succeed. Class Tests\Docs\BecomeAQueryphpDeveloperDoc was generate succeed. Class Tests\Support\FnTest was generate succeed. Class Tests\Support\StrTest was generate succeed. Class Tests\Support\ArrTest was generate succeed. Class Tests\View\SummaryDoc was generate succeed. Class Tests\View\Compiler\CompilerAssignTest was generate succeed. Class Tests\View\Compiler\CompilerPhpTest was generate succeed. Class Tests\View\Compiler\CompilerBreakTest was generate succeed. Class Tests\View\Compiler\CompilerIncludeTest was generate succeed. Class Tests\View\Compiler\CompilerTagselfTest was generate succeed. Class Tests\View\Compiler\CompilerWhileTest was generate succeed. Class Tests\View\Compiler\CompilerCssTest was generate succeed. Class Tests\View\Compiler\CompilerForTest was generate succeed. Class Tests\View\Compiler\CompilerVarTest was generate succeed. Class Tests\View\Compiler\CompilerListTest was generate succeed. Class Tests\Debug\DebugTest was generate succeed. A total of 24 files generate succeed.
修改文檔菜單
$vim docs/.vuepress/config.js
運行本地文檔網站
訪問地址 localhost:8088
便可。
$npm install -g yarn $yarn add -D vuepress # or npm install -D vuepress $yarn run dev # or npx vuepress dev docs
到這裏爲止,咱們本地開發環境已經所有搭建完畢,能夠愉快地開發了。
::: tip
值得注意的是,咱們一般在 dev
分支開發,開發完畢後 merge
到 master
分支完成開發。:::