luoxiaojun / yaravel
Laravel 用户 Yaf 框架骨架
dev-master
2021-03-11 05:23 UTC
Requires
- php: >=7.1
- ext-json: *
- ext-yaf: *
- cviebrock/laravel-elasticsearch: ~3.4
- guzzlehttp/guzzle: ^6.3
- guzzlehttp/promises: ^1.3
- guzzlehttp/psr7: ^1.4
- illuminate/bus: 5.5.*
- illuminate/cache: 5.5.*
- illuminate/config: 5.5.*
- illuminate/contracts: 5.5.*
- illuminate/database: 5.5.*
- illuminate/events: 5.5.*
- illuminate/log: 5.5.*
- illuminate/pagination: 5.5.*
- illuminate/queue: 5.5.*
- illuminate/redis: 5.5.*
- illuminate/support: 5.5.*
- illuminate/validation: 5.5.*
- league/flysystem: ^1.0.8
- league/plates: ~3.0
- monolog/monolog: ~1.0
- nesbot/carbon: ^1.24.1
- openzipkin/zipkin: 1.3.2
- phpoffice/phpspreadsheet: ~1.12.0
- psr/container: ^1.0
- psr/http-message: ~1.0
- psr/log: ~1.0
- psy/psysh: ~0.10.4
- sentry/sentry-laravel: ^0.10.0
- swiftmailer/swiftmailer: ^6.0
- symfony/console: 3.*
- vlucas/phpdotenv: ~2.2
Requires (Dev)
- filp/whoops: ~2.1@stable
- friendsofphp/php-cs-fixer: ~2.7.0@stable
- fzaninotto/faker: ~1.4
- mockery/mockery: ~1.0
- overtrue/phplint: dev-master
- phpmd/phpmd: ~2.6@stable
- phpunit/phpunit: ~6.0
- sebastian/phpcpd: ~2.0@stable
- sebastian/phpdcd: ~1.0@stable
- squizlabs/php_codesniffer: 3.0.x-dev
- symfony/var-dumper: ~3.0
Suggests
- ext-pcntl: *
- illuminate/database: The best PHP ORM Engine from Laravel.
- illuminate/validation: The form validation component from Laravel.
- league/plates: Plates is a native PHP template system that's fast, easy to use and easy to extend.
This package is auto-updated.
Last update: 2024-09-11 13:01:19 UTC
README
Yaf 可测试骨架,支持 Composer。
要求
- PHP >= 7.0
- Yaf >= 3.0
安装
- 更新
yaf.ini
[yaf]
yaf.use_namespace=1
yaf.use_spl_autoload=1
...
- 创建项目。
$ composer create-project overtrue/yaf-skeleton myapp -vvv
-
Web 服务器重写规则
Apache
#.htaccess RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule .* index.php
Nginx
server { listen 80; server_name myapp.com; root /path/to/myapp; index index.php index.html index.htm; if (!-e $request_filename) { rewrite ^/(.*) /index.php/$1 last; } }
Lighttpd
$HTTP["host"] =~ "(www.)?myapp.com$" { url.rewrite = ( "^/(.+)/?$" => "/index.php/$1", ) }
应用程序结构
├── .scripts
│ ├── .gitkeep
│ ├── common.sh
│ ├── job_phpcs.sh
│ ├── job_phpmd.sh
│ ├── job_phpunit.sh
│ ├── sami.phar
│ └── sami.php
├── app
│ ├── commands # sora commands (namespace:\App\Commands)
│ ├── controllers # Yaf Controllers (namespace:\)
│ ├── exceptions # Exceptions (namespace:\App\Exceptions)
│ ├── facades # Service Facades (namespace:\)
│ ├── plugins # Yaf plugins (namespace:\)
│ ├── presenters # Object presenters (namespace:\App\Presenters)
│ ├── services # Services, the 3rd service bridges (namespace:\App\Services)
│ ├── traits # Traits (namespace:\App\Traits)
│ ├── views # Template files
│ ├── helpers.php # Herlpers
│ ├── Bootstrap.php # Yaf Bootstrap file
├── config
│ ├── application.ini # Yaf config file
├── public # web extrence
│ └── index.php
├── sora # The command line tool
├── tests # Unit tests
└── vendor #
├── phpunit.xml.dist # PHPUnit config file
├── .gitignore
├── .php_cs # PHP-CS-Fixer config file
├── composer.json
├── composer.lock
├── README.md
控制器
$ ./sora make:controller Foo_Bar # or:foo_bar/FooBar/FooBarController # # /www/myapp/app/controllers/Foo/Bar.php Created! # /www/myapp/tests/controllers/Foo/BarTest.php Created!
所有控制器都创建在 app/controllers
目录中,测试文件也创建在 tests/controllers
目录中。
当然,您也可以独立创建测试:
$ ./sora make:test Foo_Bar # Also supports multiple type controller names # /www/myapp/tests/controllers/Foo/BarTest.php Created!
handle() 方法
控制器入口方法 handle()
<?php class ExampleController extends BaseController { public function handle() { return 'Hello world!'; // return json(['foo' => 'bar']); // return redirect('https://easywechat.com'); // return view('welcome', ['name' => 'MyApp']); // template engine require. } }
视图
没有内置的模板引擎。如果您需要使用 PHP 模板,我们建议您使用 Plates,Plates 是一个快速、易于使用且易于扩展的本地 PHP 模板系统。
$ composer require league/plates -vvv
您可以在控制器的 handle
方法中使用 view(string $template, array $data)
辅助函数作为结果。
例如
public function handle() { $data = [ 'name' => 'overtrue', 'age' => 28, ]; return view('profile-page', $data); }
<!--app/views/profile-page.php:--> <h1><?= $name ?></h1> <p><?= $age ?></p>
更多用法请参阅 Plates 文档。
单元测试
编写单元测试的难度与代码质量成反比。代码质量越高,单元测试的难度就越低,因此请设计好您的代码。
创建控制器的单元测试可以使用以下命令:
$ ./sora make:test Foo_BarController
编写测试用例
要创建控制器测试对象,使用,您可以使用 mock_controller
函数
$controller = mock_controller(Foo_BarController::class); // Indicates the method to mock, and the protected method is also mockable $controller = mock_controller(Foo_BarController::class, ['getUsers', 'getApp']);
断言
我们有这样的控制器
... public function handle() { $params = Reuqest::only('uids', 'screen_name', 'trim_status', 'has_extend', 'simplify', 'is_encoded'); $users = $this->get('main.users.show_batch', $params); return $users; } ...
因此测试应覆盖上述三种行为:
public function testHandle() { $input = [ 'uids' => '2193182644', 'screen_name' => '安正超', 'trim_status' => 0, 'has_extend' => 1, 'simplify' => 0, 'is_encoded' => 0, 'foo' => 'bar', ]; Request::shouldReceive('only') ->with('uids', 'screen_name', 'trim_status', 'has_extend', 'simplify', 'is_encoded') ->andReturn($input); $controller = mock_controller(Users_Show_BatchController::class, ['get']); // mock the `get` method $controller->shouldReceive('get')->with('main.users.show_batch', array_except($_GET, ['foo'])) ->andReturn('foo') ->once(); $response = $controller->handle(); $this->assertSame('foo', $response); }
门面断言
Request::shouldReceive('get')->with('mid')->andReturn('mock-mid')->once(); Log::shouldReceive('action')->with(48, 'oid', 'ext')->once(); ..
内置辅助断言方法
$this->shouldAbort($message, $code);
它们用于对应控制器中 abort($message, $code);
抛出的异常
测试用例类中的一些辅助方法
模拟请求方法:
$this->method('post');
模拟请求 uri
:
$this->uri('/foo/bar?uid=12345');
模拟配置:
$this->config('foo', 'bar');
模拟请求 IP:
$this->ip('127.0.0.1');
模拟 $_SERVER 变量:
$this->server('REQUEST_URI', '/foo/bar');
文档
- Yaf 文档: https://php.ac.cn/manual/en/book.yaf.php
- Plates 文档: http://platesphp.com/v3/
- PHPUnit 文档: https://phpunit.de/manual/current/zh_cn/phpunit-book.html
- Mockery 文档: http://docs.mockery.io/en/latest/
PHP 扩展包开发
想知道如何从零开始构建 PHP 扩展包吗?
请关注我的实战课程,我会在此课程中分享一些扩展开发经验 —— 《PHP 扩展包实战教程 - 从入门到发布》
许可
MIT
待办事项
- 域名
- zipkin
- 清除语言资源
- 支持/helpers 提示不使用
- 测试redis队列