38 lines
1.9 KiB
Markdown
38 lines
1.9 KiB
Markdown
# Upgrading Kimai - Version 3.x
|
|
|
|
_Make sure to create a backup before you start!_
|
|
|
|
Read the [updates documentation](https://www.kimai.org/documentation/updates.html) to find out how you can upgrade your Kimai installation to the latest stable release.
|
|
|
|
Check below if there are more version specific steps required, which need to be executed after the normal update process.
|
|
Perform EACH version specific task between your version and the new one, otherwise you risk data inconsistency or a broken installation.
|
|
|
|
## 3.0
|
|
|
|
**!! This release requires minimum PHP version 8.4 !!**
|
|
|
|
### Rename .env
|
|
|
|
Rename your file `.env` to `.env.local` or even better: move all variables to your webserver/container environment.
|
|
|
|
### Developer
|
|
|
|
Do not use method chaining: all fluent interface, especially in Entities, are no longer supported.
|
|
|
|
- Require PHP 8.4
|
|
- Bump to Symfony 7.4
|
|
- Removed old API token `X-AUTH-USER` and `X-AUTH-TOKEN`
|
|
- Removed `TimesheetConstraint` - use a normal `Constraint` as base class and attach the `#[App\Validator\Attribute\TimesheetConstraint]` attribute
|
|
- Removed `ProjectConstraint` - use a `FormExtension` and attach your custom constraints
|
|
- Interface `MetaTableTypeInterface` has new methods: `getSection()`, `setSection()`
|
|
- Interface `ExportRendererInterface` has new methods: `getType()`, `isInternal()`
|
|
- Interface `ExportableItem` has new methods: `getTags()`, `getBreak()`
|
|
- Removed and renamed translations, most important `action.edit` => `edit`, `my.profile` => `user_profile`
|
|
- Removed `User::isExportDecimal()`
|
|
- Use duration format `HH:mm` in default PDF exports
|
|
- Replace Twig `AppVariable` with custom implementation
|
|
- You need to adjust your templates if you access anything else then `app.locale`, `app.user`. `app.current_route`.
|
|
- Most often used:
|
|
- Replace `app.request.locale` with `app.locale`
|
|
- Replace `app.request.attributes.get('_route')` with `app.current_route`
|