花了四个月打磨的 laravel plus 开源 | laravel china 社区-380玩彩网官网入口
花了四个月时间,经过了两个项目的打磨,我写的 laravel plus 终于像个样子了,可以开箱即用了。
采用最新的 php8 的语法,大量借鉴了 springboot 中的 aop 编程思想,全方面拥抱注解。来看一下吧。
路由和控制器
采用注解路由,避免了在控制器和 api.php
的路由文件间跳转。首先在 api.php
中注册:
use zenith\laravelplus\easyrouter;
easyrouter::register();
接着就可以非常流畅的写路由了:
use zenith\laravelplus\attributes\routes\getmapping;
use zenith\laravelplus\attributes\routes\postmapping;
use zenith\laravelplus\attributes\routes\prefix;
#[prefix(path: '/user')]
class usercontroller
{
#[getmapping(path: '/login')]
public function login() {}
#[postmapping(path: '/register')]
public function register() {}
}
获取请求参数
获取请求参数可以使用 #requestbody
注解。先注册一个控制器中间件:
use zenith\laravelplus\middlewares\requestbodyinjector;
abstract class controller implements hasmiddleware
{
public static function middleware(): array
{
return [
requestbodyinjector::class,
];
}
}
然后就可以使用注解来将 request body 中的参数注入到类中的,结合 getter/setter
就很方便,ide 给出的提示会很友好:
use zenith\laravelplus\attributes\routes\getmapping;
use zenith\laravelplus\attributes\requests\requestbody;
class usercontroller extends controller
{
#[getmapping(path: '/login')]
public function login(#[requestbody] registerparams $params) {}
}
class registerparams
{
// the modifiers must be public or protected.
protected string $username;
protected string $password;
}
参数校验
一样的,你需要先注册中间件,参数校验以及填充默认值:
use zenith\laravelplus\middlewares\requestparamsdefaultvalueinjector;
abstract class controller implements hasmiddleware
{
public static function middleware(): array
{
return [
requestparamsdefaultvalueinjector::class
parametervalidation::class,
];
}
}
接着就可以使用 #[param]
注解来校验参数了:
use zenith\laravelplus\attributes\validators\param;
class usercontroller extends controller
{
#[getmapping(path: '/login')]
#[param(key: 'username', rules: 'required|string|max:32', message: 'username is required.')]
public function login() {}
}
也支持自定义的验证器,如下:
use closure;
use illuminate\contracts\validation\validationrule;
class passwordrule implements validationrule
{
public function validate(string $attribute, mixed $value, closure $fail): void
{
$ispass = strlen($value) >= 8 && preg_match('/[a-za-z]/', $value) &&
preg_match('/\d/', $value) &&
preg_match('/[^a-za-z\d]/', $value);
if (! $ispass) {
$fail('the :attribute must be least 8 characters and contain at least one letter, one number and one special character.');
}
}
}
验证规则写类名就可以了:
use zenith\laravelplus\attributes\validators\param;
class usercontroller
{
#[getmapping(path: '/login')]
#[param(key: 'username', rules: passwordrule::class, message: 'password is error')]
public function login() {}
}
支持参数的默认值设置:
use zenith\laravelplus\attributes\validators\param;
use zenith\laravelplus\attributes\requests\requestbody;
class usercontroller extends controller
{
#[param(key: 'page', rule: 'integer|min:1|max:100', default: 1, required: false, message: 'page is error')]
public function querylist(#[requestbody] queryparams $params)
{
dump($params->getpage()); // output: 1
}
}
dto、vo、bean
这里的 bean 和 java 中的 bean 并非一个意思,而是 dto 的意思,就是承载数据的对象。
use zenith\laravelplus\bean;
/**
* @method getusername()
* @method setusername()
* @method getpassword()
* @method setpassword()
*/
class registerparams extends bean
{
protected string $username;
protected string $password;
}
new registerparams(['username' => 'bob', 'password' => 'passw0rd'])
除了自动实现 getter/setter
外,还支持 toarray()
以及 tojson()
、equal()
等方法, 还可以无限级嵌套。
use zenith\laravelplus\bean;
class user extends bean
{
protected company $company;
}
class company extends bean
{
protected string $name;
}
支持数组 bean 的嵌套:
use zenith\laravelplus\bean;
use zenith\laravelplus\attributes\beanlist;
/**
* @method company[] getcompanies()
*/
class user extends bean
{
/**
* @var company[]
*/
#[beanlist(value: company::class)]
protected array $companies;
}
支持类型转换:
use zenith\laravelplus\bean::
use zenith\laravelplus\attributes\typeconverter;
class user extends bean
{
#[typeconverter(value: boolconverter::class)]
protected boolenum $isguest;
}
class boolconverter
{
public function convert(bool|string $value): boolenum
{
if ($value === 'yes' || $value === 'yes' || $value === 'y' || $value === 'y') {
return boolenum::true;
}
if ($value === 'no' || $value === 'no' || $value === 'n' || $value === 'n') {
return boolenum::false;
}
return $value ? boolenum::true : boolenum::false;
}
}
依赖注入
laravel 只支持通过构造函数注入,下面的示例演示了使用注解讲依赖注入到成员属性:
use zenith\laravelplus\traits\injectable;
class usercontroller
{
use injectable;
#[autowired]
private userservice $userservice;
public function register()
{
$this->userservice->register();
}
}
除此之外,还支持 #[service]
、#[component]
、#[logic]
等注入的注解。
总结
总而言之,还有更多其他的功能,比如简化了 crud,通过 #[value]
注入配置到类属性…自动生成接口文档、mock 数据….
,欢迎点 star 或者使用、或者参与开发、或者交流讨论。
本作品采用《cc 协议》,转载必须注明作者和本文链接
推荐文章: