{"action":"created","issue":{"url":"https://api.github.com/repos/revel/cmd/issues/27","labels_url":"https://api.github.com/repos/revel/cmd/issues/27/labels{/name}","comments_url":"https://api.github.com/repos/revel/cmd/issues/27/comments","events_url":"https://api.github.com/repos/revel/cmd/issues/27/events","html_url":"https://github.com/revel/cmd/pull/27","id":63543059,"number":27,"title":"v0.12","user":{"login":"brendensoares","id":905501,"avatar_url":"https://avatars.githubusercontent.com/u/905501?v=3","gravatar_id":"","url":"https://api.github.com/users/brendensoares","html_url":"https://github.com/brendensoares","followers_url":"https://api.github.com/users/brendensoares/followers","following_url":"https://api.github.com/users/brendensoares/following{/other_user}","gists_url":"https://api.github.com/users/brendensoares/gists{/gist_id}","starred_url":"https://api.github.com/users/brendensoares/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/brendensoares/subscriptions","organizations_url":"https://api.github.com/users/brendensoares/orgs","repos_url":"https://api.github.com/users/brendensoares/repos","events_url":"https://api.github.com/users/brendensoares/events{/privacy}","received_events_url":"https://api.github.com/users/brendensoares/received_events","type":"User","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"milestone":null,"comments":19,"created_at":"2015-03-22T15:22:39Z","updated_at":"2015-04-04T09:00:30Z","closed_at":"2015-03-25T14:38:39Z","pull_request":{"url":"https://api.github.com/repos/revel/cmd/pulls/27","html_url":"https://github.com/revel/cmd/pull/27","diff_url":"https://github.com/revel/cmd/pull/27.diff","patch_url":"https://github.com/revel/cmd/pull/27.patch"},"body":""},"comment":{"url":"https://api.github.com/repos/revel/cmd/issues/comments/89531742","html_url":"https://github.com/revel/cmd/pull/27#issuecomment-89531742","issue_url":"https://api.github.com/repos/revel/cmd/issues/27","id":89531742,"user":{"login":"anonx","id":6612636,"avatar_url":"https://avatars.githubusercontent.com/u/6612636?v=3","gravatar_id":"","url":"https://api.github.com/users/anonx","html_url":"https://github.com/anonx","followers_url":"https://api.github.com/users/anonx/followers","following_url":"https://api.github.com/users/anonx/following{/other_user}","gists_url":"https://api.github.com/users/anonx/gists{/gist_id}","starred_url":"https://api.github.com/users/anonx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/anonx/subscriptions","organizations_url":"https://api.github.com/users/anonx/orgs","repos_url":"https://api.github.com/users/anonx/repos","events_url":"https://api.github.com/users/anonx/events{/privacy}","received_events_url":"https://api.github.com/users/anonx/received_events","type":"User","site_admin":false},"created_at":"2015-04-04T09:00:30Z","updated_at":"2015-04-04T09:00:30Z","body":"> Filters are present to allow easy manipulation of the HTTP request and response. I don't think they exist to help develop Revel as a framework. I do see value in making certain things part of Revel, but that doesn't make filters a bad design choice. Modular code is good.\r\n\r\n@brendensoares I didn't say we do not need filters. The idea is filters we have are not good. Mainly because they cannot create their own variables. Here is a possible solution:\r\n\r\nWe may have `init.go` that contains:\r\n```go\r\ntype Controller struct {\r\n\t*revel.Controller\r\n\t*session.Filter\r\n\t*session.FlashFilter\r\n}\r\n```\r\nSo, filters are in the form of controllers. Every of them has `Before`, `After`, `Panic`, and `Finally` methods.\r\nAnd user's `app.go` will look like:\r\n```go\r\ntype App struct {\r\n\tController // Embed local controller rather than revel.Controller.\r\n}\r\n```\r\n\r\n\r\n> For example, the file structure is a big part of what make a Revel app different from other Go web apps; **it's a convention**, that once learned, can be taken for granted as always true. \r\n\r\nNo, it's not a convention. Right now it's a hard coded requirement. And this proposal is about making it a convention.\r\n\r\n> When the convention implemented by the tool matches the desired behavior, it behaves as expected without having to write configuration files. Only when the desired behavior deviates from the implemented convention is explicit configuration required.\r\n\r\n*Wikipedia*.\r\n\r\n`revel new ...` will generate app as we have it now. With all the directories and with the same dirs & files structure (which is conventional). And as it is just a convention user is able to modify things if he/she has such a need.\r\n\r\n> I like the idea of a handlers package. I think this will make Revel's request flow a lot clearer and less magical. Let me point out that I think magic is a very good thing, but when you want to understand the magic trick, it shouldn't be difficult. Conventions are magical and very useful.\r\n\r\nIt still will be magical for those for whom it's OK. And users who'd like more control will get it.\r\n\r\n> I don't think your new proposal will support modules as we currently have them.\r\n\r\nWhy not? `revel generate routers` will generate for you whatever you want.\r\n-Dear, `revgen`, can you scan `routes` and `app.conf` and give us the result we want, please?\r\n-Yes, my general. I am a stupid machine. I'll do whatever you ask."}}