soyhuce/laravel-model-injection

Laravel 扩展模型注入

2.2.0 2024-03-08 15:00 UTC

This package is auto-updated.

Last update: 2024-08-29 06:33:21 UTC


README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status GitHub Tests Action Status Total Downloads

想要更好地控制模型注入?需要在查询数据库之前验证数据?

这里有一个包可以让你做到这一点。

安装

你可以通过 composer 安装此包

composer require soyhuce/laravel-model-injection

用法

隐式绑定

为了验证控制器中用于注入模型的 URL 参数,你可以在其中使用 Soyhuce\ModelInjection\ValidatesImplicitBindings 特性。

然后你需要实现 public function routeBindingRules(): array 方法,该方法将为模型绑定的每个键定义验证 URL 参数的规则。

use Soyhuce\ModelInjection\ValidatesImplicitBinding;

class Post extends Model 
{
    use ValidatesImplicitBinding;
    
    /**
     * @return array<string, mixed>
     */
    public function routeBindingRules(): array
    {
        return [
            'id' => 'integer',
            'slug' => ['string', 'min:5']
        ];
    }
}

这将允许你使用以下方式在路由中验证绑定 Post 的参数:

Route::get('posts/{post}', function(Post $post) {
    //...
});

Route::get('posts-by-slug/{post:slug}', function(Post $post) {
    //...
});

如果参数无效,将返回 404 错误。

GET /posts/foo => 404
GET /posts-by-slug/bar => 404

详见 https://laravel.net.cn/docs/routing#implicit-binding

自定义隐式路由绑定错误

你可以自定义此包处理隐式绑定的验证失败的方式。

在服务提供者中,只需调用 InvalidRouteBinding::handleUsing

InvalidRouteBinding::handleUsing(function (string $class, string $field): never {
    Log::error("Invalid binding for $class on $field.");

    abort(422);
});

显式绑定

你可以在服务提供者(例如 RouteServiceProvider)中使用 \Soyhuce\ModelInjection\BindModels 特性来显式绑定你的模型。

use Soyhuce\ModelInjection\BindModels;

class RouteServiceProvider extends ServiceProvider {

    use BindModels;

    /**
     * Define your route model bindings, pattern filters, etc.
     *
     * @return void
     */
    public function boot() {
        parent::boot();

        $this->bindModel('user', User::class, 'integer'); // Validates that the parameter is an integer
        
        // You can bind a model explicitly on a given column
        $this->bindModelOn('post', Post::class, ['string', 'min:5'], 'slug');
    }
}

如果给定的参数无效,将返回 404 错误。

测试

composer test

变更日志

请参阅 CHANGELOG 了解最近的变化信息。

贡献

请参阅 CONTRIBUTING 了解详细信息。

安全漏洞

请查阅 我们的安全策略 了解如何报告安全漏洞。

鸣谢

许可证

MIT 许可证(MIT)。请参阅 许可证文件 了解更多信息。