花了四个月打磨的 laravel plus 开源 | laravel china 社区-大发黄金版app下载
花了四个月时间,经过了两个项目的打磨,我写的 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 协议》,转载必须注明作者和本文链接
 
 
推荐文章: