与 Laravel 对比
Goravel 沿用了 Laravel 的结构,因此概念、门面以及大部分方法名都是相通的。 下表展示了同一件事在两个框架中的写法,如果其中一方没有该功能,会在表中注明。
| 功能 | Laravel | Goravel |
|---|---|---|
| Artisan 命令行 | php artisan key:generate | ./artisan key:generate |
| 用户认证 | Auth::login($user) | facades.Auth(ctx).Login(&user) |
| 用户授权 | Gate::allows('update-post', $post) | facades.Gate().Allows("update-post", map[string]any{"post": post}) |
| 缓存 | Cache::put('key', 'value', 60) | facades.Cache().Put("key", "value", time.Minute) |
| Carbon | Carbon::now()->addDays(1) | carbon.Now().AddDays(1) |
| 自定义配置 | config('app.name') | facades.Config().GetString("app.name") |
| Crypt | Crypt::encryptString('text') | facades.Crypt().EncryptString("text") |
| 数据库 | DB::table('users')->get() | facades.DB().Table("users").Get(&users) |
| 事件系统 | OrderShipped::dispatch() | facades.Event().Job(&events.OrderShipped{}, []event.Arg{}).Dispatch() |
| 数据工厂 | User::factory()->make() | facades.Orm().Factory().Make(&user) |
| 文件存储 | Storage::put('file.txt', 'content') | facades.Storage().Put("file.txt", "content") |
| Hash | Hash::make('password') | facades.Hash().Make("password") |
| HTTP 客户端 | Http::get('https://example.com') | facades.Http().Get("https://example.com") |
| 本地化 | __('messages.welcome') | facades.Lang(ctx).Get("messages.welcome") |
| 日志 | Log::info('message') | facades.Log().Info("message") |
| 邮件 | Mail::to('user@example.com')->send(new OrderShipped()) | facades.Mail().To([]string{"user@example.com"}).Send() |
| 数据库迁移 | php artisan migrate | ./artisan migrate |
| Mock | Cache::shouldReceive('get') | mock.Factory().Cache() |
| ORM | User::find(1) | facades.Orm().Query().Find(&user, 1) |
| 扩展包开发 | $this->loadViewsFrom($path, 'courier') | facades.View().LoadViewsFrom("/path/to/package/views") |
| 进程 | Process::run('ls -la') | facades.Process().Run("ls", "-la") |
| 队列 | SendEmail::dispatch() | facades.Queue().Job(&jobs.SendEmail{}, []queue.Arg{}).Dispatch() |
| 速率限制 | RateLimiter::for('global', ...) | facades.RateLimiter().For("global", ...) |
| 路由 | Route::get('/', [Controller::class, 'index']) | facades.Route().Get("/", controller.Index) |
| 数据填充 | $this->call([UserSeeder::class]) | facades.Seeder().Call([]seeder.Seeder{&UserSeeder{}}) |
| Session | session(['key' => 'value']) | ctx.Request().Session().Put("key", "value") |
| 任务调度 | Schedule::command('emails:send')->daily() | facades.Schedule().Command("emails:send").Daily() |
| 测试 | $this->get('/tasks') | s.Http(s.T()).Get("/tasks") |
| 表单验证 | $request->validate([...]) | ctx.Request().ValidateRequest(&storePost) |
| 视图 | view('welcome') | ctx.Response().View().Make("welcome.tmpl") |
| Grpc | 未内置 | facades.Grpc().Connect("user") |
| Telemetry | 未内置 | facades.Telemetry().Tracer("app").Start(ctx, "order.process") |
| 通知 | $user->notify(new InvoicePaid()) | 暂未支持 |
| 广播 | broadcast(new OrderShipped($order)) | 暂未支持 |
| Livewire | <livewire:counter /> | 暂未支持 |