Service Container
Introduction
The Goravel service container is a powerful tool for managing class dependencies and performing dependency injection. It contains all the modules of Goravel, and allows you to bind your own services to container and resolve them when needed. The service container provides powerful support for third-party packages around Goravel.
Binding
Simple Bindings
Almost all of your service container bindings will be registered within service providers. Within a service provider, you always have access to the container via the app parameter, then register a binding using the Bind method, passing the key that we wish to register along with a closure that returns an instance of the class:
package route
import (
"github.com/goravel/framework/contracts/foundation"
)
const Binding = "goravel.route"
type ServiceProvider struct {
}
func (route *ServiceProvider) Register(app foundation.Application) {
app.Bind(Binding, func(app foundation.Application) (any, error) {
return NewRoute(app.MakeConfig()), nil
})
}
func (route *ServiceProvider) Boot(app foundation.Application) {
}As mentioned, you will typically be interacting with the container within service providers; however, if you would like to interact with the container outside of a service provider, you may do so via the App facade:
facades.App().Bind("key", func(app foundation.Application) (any, error) {
...
})Binding A Singleton
The Singleton method binds a class or interface into the container that should only be resolved one time. Once a singleton binding is resolved, the same object instance will be returned on subsequent calls into the container:
app.Singleton(key, func(app foundation.Application) (any, error) {
return NewGin(app.MakeConfig()), nil
})Binding Instances
You may also bind an existing object instance into the container using the Instance method. The given instance will always be returned on subsequent calls into the container:
app.Instance(key, instance)Binding With Parameter
If you need some extra parameters to construct the service provider, you can use the BindWith method to pass parameters to the closure:
app.BindWith(Binding, func(app foundation.Application, parameters map[string]any) (any, error) {
return NewRoute(app.MakeConfig()), nil
})Resolving
The Make Method
You may use the Make method to resolve a class instance from the container. The Make method accepts the key you wish to resolve:
instance, err := app.Make(key)If you are outside of a service provider in a location of your code that does not have access to the app variable, you may use the App facade to resolve a class instance from the container:
instance, err := facades.App().Make(key)The MakeWith Method
If some of your class's dependencies are not resolvable via the container, you may inject them by passing them as an associative array into the MakeWith method, corresponding to the BindWith binding method:
instance, err := app.MakeWith(key, map[string]any{"id": 1})Other Methods
The framework provides some convenient methods to quickly resolve various facades: MakeArtisan, MakeAuth, MakeCache, MakeConfig, MakeCrypt, MakeEvent, MakeGate, MakeGrpc, MakeHash, MakeLog, MakeMail, MakeOrm, MakeQueue, MakeRateLimiter, MakeRoute, MakeSchedule, MakeStorage, MakeValidation.
