{"action":"published","release":{"url":"https://api.github.com/repos/nova-framework/framework/releases/2892800","assets_url":"https://api.github.com/repos/nova-framework/framework/releases/2892800/assets","upload_url":"https://uploads.github.com/repos/nova-framework/framework/releases/2892800/assets{?name,label}","html_url":"https://github.com/nova-framework/framework/releases/tag/v3.0","id":2892800,"tag_name":"v3.0","target_commitish":"master","name":"Release of 3.0","draft":false,"author":{"login":"daveismyname","id":1018170,"avatar_url":"https://avatars.githubusercontent.com/u/1018170?v=3","gravatar_id":"","url":"https://api.github.com/users/daveismyname","html_url":"https://github.com/daveismyname","followers_url":"https://api.github.com/users/daveismyname/followers","following_url":"https://api.github.com/users/daveismyname/following{/other_user}","gists_url":"https://api.github.com/users/daveismyname/gists{/gist_id}","starred_url":"https://api.github.com/users/daveismyname/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/daveismyname/subscriptions","organizations_url":"https://api.github.com/users/daveismyname/orgs","repos_url":"https://api.github.com/users/daveismyname/repos","events_url":"https://api.github.com/users/daveismyname/events{/privacy}","received_events_url":"https://api.github.com/users/daveismyname/received_events","type":"User","site_admin":false},"prerelease":false,"created_at":"2016-03-26T14:54:10Z","published_at":"2016-03-26T15:02:47Z","assets":[{"url":"https://api.github.com/repos/nova-framework/framework/releases/assets/1474387","id":1474387,"name":"framework.zip","label":null,"uploader":{"login":"daveismyname","id":1018170,"avatar_url":"https://avatars.githubusercontent.com/u/1018170?v=3","gravatar_id":"","url":"https://api.github.com/users/daveismyname","html_url":"https://github.com/daveismyname","followers_url":"https://api.github.com/users/daveismyname/followers","following_url":"https://api.github.com/users/daveismyname/following{/other_user}","gists_url":"https://api.github.com/users/daveismyname/gists{/gist_id}","starred_url":"https://api.github.com/users/daveismyname/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/daveismyname/subscriptions","organizations_url":"https://api.github.com/users/daveismyname/orgs","repos_url":"https://api.github.com/users/daveismyname/repos","events_url":"https://api.github.com/users/daveismyname/events{/privacy}","received_events_url":"https://api.github.com/users/daveismyname/received_events","type":"User","site_admin":false},"content_type":"application/zip","state":"uploaded","size":155541,"download_count":0,"created_at":"2016-03-26T14:55:53Z","updated_at":"2016-03-26T14:55:54Z","browser_download_url":"https://github.com/nova-framework/framework/releases/download/v3.0/framework.zip"}],"tarball_url":"https://api.github.com/repos/nova-framework/framework/tarball/v3.0","zipball_url":"https://api.github.com/repos/nova-framework/framework/zipball/v3.0","body":"With version 3.0 files are served by default above the document root, the key changes are as follows: \r\n\r\n## Routing images / js / css files\r\n\r\nFrom within Templates your css/js and images must be in a Assets folder to be routed correctly.\r\nThis applies to Modules as well, to have a css file from a Module the css file would be placed inside nova/app/Modules/ModuleName/Assets/css/file.css.\r\nAdditionally there is an Assets folder in the root of nova this is for storing resources outside of templates that can still be routed from above the document root.\r\n\r\n## Router\r\n\r\n##Optional parameters \r\n\r\nNew to 3.0 is allowing filters to be optional \r\n\r\nFilters written like (:any) are required to match the route but writing a filter as (/(:any)) makes it optional.\r\n\r\nThis route supplied with Nova has one filter that is required then a further 3 optional filters. Multiple filters should be inside the first parenthesis. \r\n\r\n````\r\nRouter::any('admin/(:any)(/(:any)(/(:any)(/(:any))))', 'App\\Controllers\\Demo@test');\r\n````\r\n\r\n##Groups\r\n\r\nnew to 3.0 is groups routes can now placed in a group, this allows all routes within the group to inherit the group name\r\n\r\n````\r\nRouter::group('admin', function() {\r\n    Router::any('add', 'App\\Controllers\\Demo@cool');\r\n    Router::any('settings', 'App\\Controllers\\Demo@nice');\r\n});\r\n````\r\n\r\nIs the equivalent to\r\n\r\n````\r\nRouter::any('admin/add', 'App\\Controllers\\Admin@add');\r\nRouter::any('admin/settings', 'App\\Controllers\\Admin@settings');\r\n````\r\n\r\n## Error Log\r\n\r\nThe error log is no longer a .html file but rather a log file. On a production server it should be outside the document root, in order to see the any errors there are a few options:\r\n\r\n* Open app/logs/error.log\r\n* OR open system/Core/Logger.php set $display to true to print errors to the screen\r\n* set $emailError to true and setup the siteEmail const in app/Config.php this relies on an email server (not provided by the framework)\r\n\r\n##Namespace change\r\n\r\nclasses in app/Controller app/Model and app/Modules now have a namespace starting with App:\r\n\r\n* App\\Controllers\r\n* App\\Models\r\n* App\\Modules\r\n\r\nThat is only for classes within app, this is not needed for classes within system.\r\n\r\n## Aliases for helpers within views\r\n\r\nHelpers can now be used without using a use statement, inside system/Core/Alias contains an array of helpers with their alias allowing helpers to be used directly.\r\n\r\nInstead of doing:\r\n\r\n````\r\nuse Helpers\\Session;\r\n\r\nSession::set('item', 'value');\r\n````\r\n\r\nit can become:\r\n\r\n````\r\nSession::set('item', 'value');\r\n````\r\n\r\n# New / Updated Helpers/Methods\r\n\r\n## Url\r\n\r\n**resourcePath()**\r\nThe basic idea is to provide a lowercase version of the resource path for the resources located in Modules and the base assets folder. Then the following call:\r\n\r\n````\r\n$path = Url::resourcePath('FileManager');\r\n````\r\n\r\nwill result into:\r\n\r\n````\r\n/modules/file_manager/assets/\r\n````\r\n\r\nWith no parameters will return:\r\n\r\n````\r\n/assets/\r\n````\r\n\r\nWhich correspond with the generic Assets directory.\r\n\r\n**detectUri()**\r\n\r\nReturns the current url.\r\n\r\n**templatePath()** and **relativeTemplatePath()**\r\n\r\nNow accepts 2 parameters:\r\n1. $custom - default to TEMPLATE which is the template being used\r\n2. $folder - folder to return from within the template defaults to Assets\r\n\r\n\r\n## Assets\r\n\r\nThe assets helper loads css and js files both methods have the following parameters:\r\n\r\n- $files - a single file or array of file paths\r\n- $cache - cache the output default to false, a minified file will be generated in the theme css/js folder.\r\n- $refresh - update the cache default to false\r\n- $cachedMins - time in seconds to keep the cache for defaults to 14400\r\n\r\n## Csrf\r\n\r\nUpdated makeToken() and isTokenValid() to require a name parameter, this allows using multiple times on a single page with unique names.\r\n\r\n## Data\r\n\r\ncreate_key() has been renamed to createKey()\r\n\r\n## Form\r\n\r\nForm::open by default created a hidden input with a token to be used for cross site request forgery checks (CSRF) if a name is passed to Form::open it's used as part of the token name.\r\n\r\n## Inflector\r\n\r\nInflector is a doctrine class to allow transforming file paths used within the Url helper.\r\n\r\n## JsMin\r\n\r\nMinifies supplied js code\r\n\r\n## Request\r\n\r\nget() method added.\r\n\r\n## ReservedWords\r\n\r\nThis class has a method getList which returns an array of reserved words include PHP 7's reserved words.\r\n\r\n## Response\r\n\r\nThis helper is primary used for routing, see the Response page for more details."}}