mirror of
https://github.com/kataras/iris.git
synced 2025-12-22 20:37:05 +00:00
update the documents for the new MVC API and some of its new features but not finished yet, README big examples and _examples/mvc/login is are yet updated and I'm thinking of removing the big examples on README.md, they exist on the _examples/mvc updated.
Former-commit-id: c2938d4bcaa3520744526f7975ee3cce632499b3
This commit is contained in:
@@ -12,49 +12,83 @@ with the fastest possible execution.
|
||||
|
||||
All HTTP Methods are supported, for example if want to serve `GET`
|
||||
then the controller should have a function named `Get()`,
|
||||
you can define more than one method function to serve in the same Controller struct.
|
||||
you can define more than one method function to serve in the same Controller.
|
||||
|
||||
Register custom controller's struct's methods as handlers with custom paths(even with regex parametermized path)
|
||||
via the `BeforeActivation` custom event callback, per-controller. Example:
|
||||
|
||||
```go
|
||||
import (
|
||||
"github.com/kataras/iris"
|
||||
"github.com/kataras/iris/mvc"
|
||||
)
|
||||
|
||||
func main() {
|
||||
app := iris.New()
|
||||
mvc.Configure(app.Party("/root"), myMVC)
|
||||
app.Run(iris.Addr(":8080"))
|
||||
}
|
||||
|
||||
func myMVC(app *mvc.Application) {
|
||||
// app.AddDependencies(...)
|
||||
// app.Router.Use/UseGlobal/Done(...)
|
||||
app.Register(new(MyController))
|
||||
}
|
||||
|
||||
type MyController struct {}
|
||||
|
||||
func (m *MyController) BeforeActivation(b mvc.BeforeActivation) {
|
||||
// b.Dependencies().Add/Remove
|
||||
// b.Router().Use/UseGlobal/Done // and any standard API call you already know
|
||||
|
||||
// 1-> Method
|
||||
// 2-> Path
|
||||
// 3-> The controller's function name to be parsed as handler
|
||||
// 4-> Any handlers that should run before the MyCustomHandler
|
||||
b.Handle("GET", "/something/{id:long}", "MyCustomHandler", anyMiddleware...)
|
||||
}
|
||||
|
||||
// GET: http://localhost:8080/root
|
||||
func (m *MyController) Get() string { return "Hey" }
|
||||
|
||||
// GET: http://localhost:8080/root/something/{id:long}
|
||||
func (m *MyController) MyCustomHandler(id int64) string { return "MyCustomHandler says Hey" }
|
||||
```
|
||||
|
||||
Persistence data inside your Controller struct (share data between requests)
|
||||
via `iris:"persistence"` tag right to the field or Bind using `app.Controller("/" , new(myController), theBindValue)`.
|
||||
by defining services to the Dependencies or have a `Singleton` controller scope.
|
||||
|
||||
Models inside your Controller struct (set-ed at the Method function and rendered by the View)
|
||||
via `iris:"model"` tag right to the field, i.e ```User UserModel `iris:"model" name:"user"` ``` view will recognise it as `{{.user}}`.
|
||||
If `name` tag is missing then it takes the field's name, in this case the `"User"`.
|
||||
Share the dependencies between controllers or register them on a parent MVC Application, and ability
|
||||
to modify dependencies per-controller on the `BeforeActivation` optional event callback inside a Controller,
|
||||
i.e `func(c *MyController) BeforeActivation(b mvc.BeforeActivation) { b.Dependencies().Add/Remove(...) }`.
|
||||
|
||||
Access to the request path and its parameters via the `Path and Params` fields.
|
||||
Access to the `Context` as a controller's field(no manual binding is neede) i.e `Ctx iris.Context` or via a method's input argument, i.e `func(ctx iris.Context, otherArguments...)`.
|
||||
|
||||
Access to the template file that should be rendered via the `Tmpl` field.
|
||||
Models inside your Controller struct (set-ed at the Method function and rendered by the View).
|
||||
You can return models from a controller's method or set a field in the request lifecycle
|
||||
and return that field to another method, in the same request lifecycle.
|
||||
|
||||
Access to the template data that should be rendered inside
|
||||
the template file via `Data` field.
|
||||
|
||||
Access to the template layout via the `Layout` field.
|
||||
|
||||
Access to the low-level `iris.Context` via the `Ctx` field.
|
||||
|
||||
Get the relative request path by using the controller's name via `RelPath()`.
|
||||
|
||||
Get the relative template path directory by using the controller's name via `RelTmpl()`.
|
||||
|
||||
Flow as you used to, `Controllers` can be registered to any `Party`,
|
||||
including Subdomains, the Party's begin and done handlers work as expected.
|
||||
Flow as you used to, mvc application has its own `Router` which is a type of `iris/router.Party`, the standard iris api.
|
||||
`Controllers` can be registered to any `Party`, including Subdomains, the Party's begin and done handlers work as expected.
|
||||
|
||||
Optional `BeginRequest(ctx)` function to perform any initialization before the method execution,
|
||||
useful to call middlewares or when many methods use the same collection of data.
|
||||
|
||||
Optional `EndRequest(ctx)` function to perform any finalization after any method executed.
|
||||
|
||||
Inheritance, recursively, see for example our `mvc.SessionController`, it has the `iris.Controller` as an embedded field
|
||||
and it adds its logic to its `BeginRequest`, [here](https://github.com/kataras/iris/blob/master/mvc/session_controller.go).
|
||||
Inheritance, recursively, see for example our `mvc.SessionController`, it has the `Session *sessions.Session` and `Manager *sessions.Sessions` as embedded fields
|
||||
which are filled by its `BeginRequest`, [here](https://github.com/kataras/iris/blob/master/mvc/session_controller.go).
|
||||
This is just an example, you could use the `mvc.Session(mySessions)` as a dependency to the MVC Application, i.e
|
||||
`mvcApp.AddDependencies(mvc.Session(sessions.New(sessions.Config{Cookie: "iris_session_id"})))`.
|
||||
|
||||
Read access to the current route via the `Route` field.
|
||||
Access to the dynamic path parameters via the controller's methods' input arguments, no binding is needed.
|
||||
When you use the Iris' default syntax to parse handlers from a controller, you need to suffix the methods
|
||||
with the `By` word, uppercase is a new sub path. Example:
|
||||
|
||||
Register one or more relative paths and able to get path parameters, i.e
|
||||
If `mvc.New(app.Party("/user")).Register(new(user.Controller))`
|
||||
|
||||
If `app.Controller("/user", new(user.Controller))`
|
||||
|
||||
- `func(*Controller) Get()` - `GET:/user` , as usual.
|
||||
- `func(*Controller) Post()` - `POST:/user`, as usual.
|
||||
- `func(*Controller) Get()` - `GET:/user`.
|
||||
- `func(*Controller) Post()` - `POST:/user`.
|
||||
- `func(*Controller) GetLogin()` - `GET:/user/login`
|
||||
- `func(*Controller) PostLogin()` - `POST:/user/login`
|
||||
- `func(*Controller) GetProfileFollowers()` - `GET:/user/profile/followers`
|
||||
@@ -62,11 +96,11 @@ If `app.Controller("/user", new(user.Controller))`
|
||||
- `func(*Controller) GetBy(id int64)` - `GET:/user/{param:long}`
|
||||
- `func(*Controller) PostBy(id int64)` - `POST:/user/{param:long}`
|
||||
|
||||
If `app.Controller("/profile", new(profile.Controller))`
|
||||
If `mvc.New(app.Party("/profile")).Register(new(profile.Controller))`
|
||||
|
||||
- `func(*Controller) GetBy(username string)` - `GET:/profile/{param:string}`
|
||||
|
||||
If `app.Controller("/assets", new(file.Controller))`
|
||||
If `mvc.New(app.Party("/assets")).Register(new(file.Controller))`
|
||||
|
||||
- `func(*Controller) GetByWildard(path string)` - `GET:/assets/{param:path}`
|
||||
|
||||
@@ -91,7 +125,7 @@ func(c *ExampleController) Get() string |
|
||||
mvc.Result or (mvc.Result, error)
|
||||
```
|
||||
|
||||
where [mvc.Result](https://github.com/kataras/iris/blob/master/mvc/method_result.go) is an interface which contains only that function: `Dispatch(ctx iris.Context)`.
|
||||
where [mvc.Result](https://github.com/kataras/iris/blob/master/mvc/func_result.go) is an interface which contains only that function: `Dispatch(ctx iris.Context)`.
|
||||
|
||||
## Using Iris MVC for code reuse
|
||||
|
||||
|
||||
@@ -25,25 +25,6 @@ type UsersController struct {
|
||||
Service services.UserService
|
||||
}
|
||||
|
||||
// This could be possible but we should not call handlers inside the `BeginRequest`.
|
||||
// Because `BeginRequest` was introduced to set common, shared variables between all method handlers
|
||||
// before their execution.
|
||||
// We will add this middleware from our `app.Controller` call.
|
||||
//
|
||||
// var authMiddleware = basicauth.New(basicauth.Config{
|
||||
// Users: map[string]string{
|
||||
// "admin": "password",
|
||||
// },
|
||||
// })
|
||||
//
|
||||
// func (c *UsersController) BeginRequest(ctx iris.Context) {
|
||||
// c.C.BeginRequest(ctx)
|
||||
//
|
||||
// if !ctx.Proceed(authMiddleware) {
|
||||
// ctx.StopExecution()
|
||||
// }
|
||||
// }
|
||||
|
||||
// Get returns list of the users.
|
||||
// Demo:
|
||||
// curl -i -u admin:password http://localhost:8080/users
|
||||
|
||||
@@ -17,7 +17,7 @@ type VisitController struct {
|
||||
// its initialization happens by the dependency function that we've added to the `visitApp`.
|
||||
Session *sessions.Session
|
||||
|
||||
// A time.time which is binded from the `app.Controller`,
|
||||
// A time.time which is binded from the MVC,
|
||||
// order of binded fields doesn't matter.
|
||||
StartTime time.Time
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user