Compare commits

...

14 Commits

71 changed files with 9937 additions and 5875 deletions

6
.env.test Normal file
View File

@ -0,0 +1,6 @@
# define your env variables for the test env here
KERNEL_CLASS='App\Kernel'
APP_SECRET='$ecretf0rt3st'
SYMFONY_DEPRECATIONS_HELPER=999999
PANTHER_APP_ENV=panther
PANTHER_ERROR_SCREENSHOT_DIR=./var/error-screenshots

10
.gitignore vendored
View File

@ -4,3 +4,13 @@
/var/ /var/
/vendor/ /vendor/
###< symfony/framework-bundle ### ###< symfony/framework-bundle ###
###> phpunit/phpunit ###
/phpunit.xml
.phpunit.result.cache
###< phpunit/phpunit ###
# PHP CS Fixer
tools/vendor/
/.php-cs-fixer.php
/.php-cs-fixer.cache

545
.php-cs-fixer.dist.php Normal file
View File

@ -0,0 +1,545 @@
<?php declare(strict_types=1);
use Nexus\CsConfig\Factory;
use PhpCsFixer\{Config, Finder};
$finder = Finder::create()
->in(__DIR__)
->exclude('var')
->exclude('vendor');
return (new Config())
->setRiskyAllowed(TRUE)
->setFinder($finder)
->setRules([
'align_multiline_comment' => false,
'array_indentation' => true,
'array_push' => true,
'array_syntax' => ['syntax' => 'short'],
'assign_null_coalescing_to_coalesce_equal' => true,
'backtick_to_shell_exec' => true,
'binary_operator_spaces' => [
'default' => 'single_space',
'operators' => [
'=' => 'align_single_space_minimal',
'=>' => 'align_single_space_minimal',
'||' => 'align_single_space_minimal',
'.=' => 'align_single_space_minimal',
],
],
'blank_line_after_namespace' => true,
'blank_line_after_opening_tag' => false,
'blank_line_before_statement' => [
'statements' => [
'case',
'continue',
'declare',
'default',
'do',
'exit',
'for',
'foreach',
'goto',
'return',
'switch',
'throw',
'try',
'while',
'yield',
'yield_from',
],
],
'braces' => [
'allow_single_line_anonymous_class_with_empty_body' => true,
'allow_single_line_closure' => true,
'position_after_anonymous_constructs' => 'same',
'position_after_control_structures' => 'same',
'position_after_functions_and_oop_constructs' => 'next',
],
'cast_spaces' => ['space' => 'single'],
'class_attributes_separation' => [
'elements' => [
'const' => 'none',
'property' => 'none',
'method' => 'one',
'trait_import' => 'none',
],
],
'class_definition' => [
'multi_line_extends_each_single_line' => true,
'single_item_single_line' => true,
'single_line' => true,
'space_before_parenthesis' => true,
],
'class_reference_name_casing' => true,
'clean_namespace' => true,
'combine_consecutive_issets' => true,
'combine_consecutive_unsets' => true,
'combine_nested_dirname' => true,
'comment_to_phpdoc' => [
'ignored_tags' => [
'todo',
'codeCoverageIgnore',
'codeCoverageIgnoreStart',
'codeCoverageIgnoreEnd',
'phpstan-ignore-line',
'phpstan-ignore-next-line',
],
],
'compact_nullable_typehint' => true,
'concat_space' => ['spacing' => 'one'],
'constant_case' => ['case' => 'upper'],
'control_structure_continuation_position' => ['position' => 'same_line'],
'date_time_immutable' => false,
'declare_equal_normalize' => ['space' => 'none'],
'declare_parentheses' => true,
'declare_strict_types' => true,
'dir_constant' => true,
'doctrine_annotation_array_assignment' => false,
'doctrine_annotation_braces' => false,
'doctrine_annotation_indentation' => false,
'doctrine_annotation_spaces' => false,
'echo_tag_syntax' => [
'format' => 'short',
'long_function' => 'echo',
'shorten_simple_statements_only' => false,
],
'elseif' => false,
'empty_loop_body' => ['style' => 'braces'],
'empty_loop_condition' => ['style' => 'while'],
'encoding' => true,
'ereg_to_preg' => true,
'error_suppression' => [
'mute_deprecation_error' => true,
'noise_remaining_usages' => false,
'noise_remaining_usages_exclude' => [],
],
'escape_implicit_backslashes' => [
'double_quoted' => true,
'heredoc_syntax' => true,
'single_quoted' => false,
],
'explicit_indirect_variable' => true,
'explicit_string_variable' => true,
'final_class' => false,
'final_internal_class' => [
'annotation_exclude' => ['@no-final'],
'annotation_include' => ['@internal'],
'consider_absent_docblock_as_internal_class' => false,
],
'final_public_method_for_abstract_class' => false,
'fopen_flag_order' => true,
'fopen_flags' => ['b_mode' => true],
'full_opening_tag' => true,
'fully_qualified_strict_types' => true,
'function_declaration' => ['closure_function_spacing' => 'one'],
'function_to_constant' => [
'functions' => [
'get_called_class',
'get_class',
'get_class_this',
'php_sapi_name',
'phpversion',
'pi',
],
],
'function_typehint_space' => true,
'general_phpdoc_annotation_remove' => [
'annotations' => [
'author',
'package',
'subpackage',
],
],
'general_phpdoc_tag_rename' => [
'case_sensitive' => false,
'fix_annotation' => true,
'fix_inline' => true,
'replacements' => ['inheritDocs' => 'inheritDoc'],
],
'get_class_to_class_keyword' => false,
'global_namespace_import' => [
'import_constants' => false,
'import_functions' => false,
'import_classes' => true,
],
'group_import' => true,
'header_comment' => false, // false by default
'heredoc_indentation' => ['indentation' => 'start_plus_one'],
'heredoc_to_nowdoc' => true,
'implode_call' => true,
'include' => true,
'increment_style' => ['style' => 'post'],
'indentation_type' => true,
'integer_literal_case' => true,
'is_null' => true,
'lambda_not_used_import' => true,
'line_ending' => true,
'linebreak_after_opening_tag' => false,
'list_syntax' => ['syntax' => 'short'],
'logical_operators' => true,
'lowercase_cast' => true,
'lowercase_keywords' => true,
'lowercase_static_reference' => true,
'magic_constant_casing' => true,
'magic_method_casing' => true,
'mb_str_functions' => false,
'method_argument_space' => [
'after_heredoc' => false,
'keep_multiple_spaces_after_comma' => false,
'on_multiline' => 'ensure_fully_multiline',
],
'method_chaining_indentation' => true,
'modernize_strpos' => false, // requires 8.0+
'modernize_types_casting' => true,
'multiline_comment_opening_closing' => true,
'multiline_whitespace_before_semicolons' => ['strategy' => 'no_multi_line'],
'native_constant_invocation' => false,
'native_function_casing' => true,
'native_function_invocation' => false,
'native_function_type_declaration_casing' => true,
'new_with_braces' => true,
'no_alias_functions' => ['sets' => ['@all']],
'no_alias_language_construct_call' => true,
'no_alternative_syntax' => ['fix_non_monolithic_code' => false],
'no_binary_string' => true,
'no_blank_lines_after_class_opening' => true,
'no_blank_lines_after_phpdoc' => true,
'no_blank_lines_before_namespace' => false, // conflicts with `single_blank_line_before_namespace`
'no_break_comment' => ['comment_text' => 'no break'],
'no_closing_tag' => true,
'no_empty_comment' => true,
'no_empty_phpdoc' => true,
'no_empty_statement' => true,
'no_extra_blank_lines' => ['tokens' => ['extra']],
'no_homoglyph_names' => true,
'no_leading_import_slash' => true,
'no_leading_namespace_whitespace' => true,
'no_mixed_echo_print' => ['use' => 'echo'],
'no_multiline_whitespace_around_double_arrow' => true,
'no_null_property_initialization' => true,
'no_php4_constructor' => true,
'no_short_bool_cast' => true,
'no_singleline_whitespace_before_semicolons' => true,
'no_space_around_double_colon' => true,
'no_spaces_after_function_name' => true,
'no_spaces_around_offset' => ['positions' => ['inside', 'outside']],
'no_spaces_inside_parenthesis' => true,
'no_superfluous_elseif' => true,
'no_superfluous_phpdoc_tags' => [
'allow_mixed' => true,
'allow_unused_params' => true,
'remove_inheritdoc' => false,
],
'no_trailing_comma_in_list_call' => true,
'no_trailing_comma_in_singleline_array' => true,
'no_trailing_whitespace' => true,
'no_trailing_whitespace_in_comment' => true,
'no_trailing_whitespace_in_string' => true,
'no_unneeded_control_parentheses' => [
'statements' => [
'break',
'clone',
'continue',
'echo_print',
'return',
'switch_case',
'yield',
],
],
'no_unneeded_curly_braces' => ['namespaces' => true],
'no_unneeded_final_method' => ['private_methods' => true],
'no_unneeded_import_alias' => true,
'no_unreachable_default_argument_value' => true,
'no_unset_cast' => true,
'no_unset_on_property' => false,
'no_unused_imports' => true,
'no_useless_else' => true,
'no_useless_return' => true,
'no_useless_sprintf' => true,
'no_whitespace_before_comma_in_array' => ['after_heredoc' => true],
'no_whitespace_in_blank_line' => true,
'non_printable_character' => ['use_escape_sequences_in_strings' => true],
'normalize_index_brace' => true,
'not_operator_with_space' => false,
'not_operator_with_successor_space' => true,
'nullable_type_declaration_for_default_null_value' => ['use_nullable_type_declaration' => true],
'object_operator_without_whitespace' => true,
'octal_notation' => false, // requires 8.1+
'operator_linebreak' => ['only_booleans' => true, 'position' => 'beginning'],
'ordered_class_elements' => [
'order' => [
'use_trait',
'constant',
'property',
'method',
],
'sort_algorithm' => 'none',
],
'ordered_imports' => [
'sort_algorithm' => 'alpha',
'imports_order' => ['class', 'function', 'const'],
],
'ordered_interfaces' => false,
'ordered_traits' => false,
'php_unit_construct' => [
'assertions' => [
'assertSame',
'assertEquals',
'assertNotEquals',
'assertNotSame',
],
],
'php_unit_dedicate_assert' => ['target' => 'newest'],
'php_unit_dedicate_assert_internal_type' => ['target' => 'newest'],
'php_unit_expectation' => ['target' => 'newest'],
'php_unit_fqcn_annotation' => true,
'php_unit_internal_class' => ['types' => ['normal', 'final']],
'php_unit_method_casing' => ['case' => 'camel_case'],
'php_unit_mock' => ['target' => 'newest'],
'php_unit_mock_short_will_return' => true,
'php_unit_namespaced' => ['target' => 'newest'],
'php_unit_no_expectation_annotation' => [
'target' => 'newest',
'use_class_const' => true,
],
'php_unit_set_up_tear_down_visibility' => true,
'php_unit_size_class' => false,
'php_unit_strict' => [
'assertions' => [
'assertAttributeEquals',
'assertAttributeNotEquals',
'assertEquals',
'assertNotEquals',
],
],
'php_unit_test_annotation' => ['style' => 'prefix'],
'php_unit_test_case_static_method_calls' => [
'call_type' => 'this',
'methods' => [],
],
'php_unit_test_class_requires_covers' => false,
'phpdoc_add_missing_param_annotation' => ['only_untyped' => true],
'phpdoc_align' => [
'align' => 'vertical',
'tags' => [
'method',
'param',
'property',
'return',
'throws',
'type',
'var',
],
],
'phpdoc_annotation_without_dot' => false,
'phpdoc_indent' => true,
'phpdoc_inline_tag_normalizer' => [
'tags' => [
'example',
'id',
'internal',
'inheritdoc',
'inheritdocs',
'link',
'source',
'toc',
'tutorial',
],
],
'phpdoc_line_span' => [
'const' => 'multi',
'method' => 'multi',
'property' => 'multi',
],
'phpdoc_no_access' => true,
'phpdoc_no_alias_tag' => [
'replacements' => [
'property-read' => 'property',
'property-write' => 'property',
'type' => 'var',
'link' => 'see',
],
],
'phpdoc_no_empty_return' => false,
'phpdoc_no_package' => true,
'phpdoc_no_useless_inheritdoc' => true,
'phpdoc_order' => true,
'phpdoc_order_by_value' => [
'annotations' => [
'author',
'covers',
'coversNothing',
'dataProvider',
'depends',
'group',
'internal',
'method',
'property',
'property-read',
'property-write',
'requires',
'throws',
'uses',
],
],
'phpdoc_return_self_reference' => [
'replacements' => [
'this' => '$this',
'@this' => '$this',
'$self' => 'self',
'@self' => 'self',
'$static' => 'static',
'@static' => 'static',
],
],
'phpdoc_scalar' => [
'types' => [
'boolean',
'callback',
'double',
'integer',
'real',
'str',
],
],
'phpdoc_separation' => true,
'phpdoc_single_line_var_spacing' => true,
'phpdoc_summary' => false,
'phpdoc_tag_casing' => ['tags' => ['inheritDoc']],
'phpdoc_tag_type' => ['tags' => ['inheritDoc' => 'inline']],
'phpdoc_to_comment' => false,
'phpdoc_to_param_type' => false,
'phpdoc_to_property_type' => false,
'phpdoc_to_return_type' => false,
'phpdoc_trim' => true,
'phpdoc_trim_consecutive_blank_line_separation' => true,
'phpdoc_types' => ['groups' => ['simple', 'alias', 'meta']],
'phpdoc_types_order' => [
'null_adjustment' => 'always_last',
'sort_algorithm' => 'alpha',
],
'phpdoc_var_annotation_correct_order' => true,
'phpdoc_var_without_name' => true,
'pow_to_exponentiation' => true,
'protected_to_private' => true,
'psr_autoloading' => ['dir' => null],
'random_api_migration' => [
'replacements' => [
'getrandmax' => 'mt_getrandmax',
'rand' => 'mt_rand',
'srand' => 'mt_srand',
],
],
'regular_callable_call' => true,
'return_assignment' => true,
'return_type_declaration' => ['space_before' => 'none'],
'self_accessor' => false,
'self_static_accessor' => true,
'semicolon_after_instruction' => false,
'set_type_to_cast' => true,
'short_scalar_cast' => true,
'simple_to_complex_string_variable' => true,
'simplified_if_return' => true,
'simplified_null_return' => false,
'single_blank_line_at_eof' => true,
'single_blank_line_before_namespace' => true,
'single_class_element_per_statement' => ['elements' => ['const', 'property']],
'single_import_per_statement' => false,
'single_line_after_imports' => true,
'single_line_comment_style' => ['comment_types' => ['asterisk', 'hash']],
'single_line_throw' => false,
'single_quote' => ['strings_containing_single_quote_chars' => false],
'single_space_after_construct' => [
'constructs' => [
'abstract',
'as',
'attribute',
'break',
'case',
'catch',
'class',
'clone',
'comment',
'const',
'const_import',
'continue',
'do',
'echo',
'else',
'elseif',
'extends',
'final',
'finally',
'for',
'foreach',
'function',
'function_import',
'global',
'goto',
'if',
'implements',
'include',
'include_once',
'instanceof',
'insteadof',
'interface',
'match',
'named_argument',
'new',
'open_tag_with_echo',
'php_doc',
'php_open',
'print',
'private',
'protected',
'public',
'require',
'require_once',
'return',
'static',
'throw',
'trait',
'try',
'use',
'use_lambda',
'use_trait',
'var',
'while',
'yield',
'yield_from',
],
],
'single_trait_insert_per_statement' => true,
'space_after_semicolon' => ['remove_in_empty_for_expressions' => true],
'standardize_increment' => true,
'standardize_not_equals' => true,
'static_lambda' => true,
'strict_comparison' => true,
'strict_param' => true,
'string_length_to_empty' => true,
'string_line_ending' => true,
'switch_case_semicolon_to_colon' => true,
'switch_case_space' => true,
'switch_continue_to_break' => true,
'ternary_operator_spaces' => true,
'ternary_to_elvis_operator' => true,
'ternary_to_null_coalescing' => true,
'trailing_comma_in_multiline' => [
'after_heredoc' => true,
'elements' => ['arrays'],
],
'trim_array_spaces' => true,
'types_spaces' => ['space' => 'none'],
'unary_operator_spaces' => true,
'use_arrow_functions' => true,
'visibility_required' => ['elements' => ['const', 'method', 'property']],
'void_return' => false, // changes method signature
'whitespace_after_comma_in_array' => true,
'yoda_style' => [
'equal' => false,
'identical' => null,
'less_and_greater' => false,
'always_move_variable' => false,
],
]);

View File

@ -2,28 +2,37 @@
"type": "project", "type": "project",
"license": "proprietary", "license": "proprietary",
"require": { "require": {
"php": "^7.4.0", "php": "^8.1.0",
"sensio/framework-extra-bundle": "^5.2", "composer/package-versions-deprecated": "1.11.99.5",
"symfony/debug-pack": "^1.0", "doctrine/doctrine-bundle": "^2",
"symfony/form": "^5.1", "doctrine/doctrine-migrations-bundle": "^3.2.2",
"doctrine/orm": "^2",
"sensio/framework-extra-bundle": "^6.2.6",
"symfony/form": "^6.0.3",
"symfony/maker-bundle": "^1.0", "symfony/maker-bundle": "^1.0",
"symfony/orm-pack": "^1.0", "symfony/monolog-bundle": "^3.0",
"symfony/translation": "^5.1", "symfony/translation": "^6.0.3",
"symfony/twig-pack": "1.0.0", "symfony/twig-bundle": "^6.0",
"symfony/validator": "^5.1", "symfony/validator": "^6.0.3",
"symfony/yaml": "^5.1" "symfony/yaml": "^6.0.3",
"twig/twig": "^2.12|^3.0"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^9.5",
"roave/security-advisories": "dev-master", "roave/security-advisories": "dev-master",
"symfony/debug": "^4.4.9", "symfony/dotenv": "^6.0.3",
"symfony/dotenv": "^5.1", "symfony/flex": "^2.1.6",
"symfony/flex": "^1.0" "symfony/stopwatch": "^6.0.3",
"symfony/web-profiler-bundle": "^6.0"
}, },
"config": { "config": {
"preferred-install": { "preferred-install": {
"*": "dist" "*": "dist"
}, },
"sort-packages": true "sort-packages": true,
"allow-plugins": {
"symfony/flex": true
}
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {

6186
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -1,13 +1,12 @@
<?php <?php declare(strict_types=1);
return [ return [
Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => TRUE],
Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true], Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => TRUE],
Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => TRUE],
Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => TRUE],
Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => TRUE, 'test' => TRUE],
Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true, 'test' => true], Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => TRUE],
Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true], Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => TRUE],
Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => TRUE],
Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true],
]; ];

View File

@ -0,0 +1,19 @@
framework:
cache:
# Unique name of your app: used to compute stable namespaces for cache keys.
#prefix_seed: your_vendor_name/app_name
# The "app" cache stores to the filesystem by default.
# The data in this cache should persist between deploys.
# Other options include:
# Redis
#app: cache.adapter.redis
#default_redis_provider: redis://localhost
# APCu (not recommended with heavy random-write workloads as memory fragmentation can cause perf issues)
#app: cache.adapter.apcu
# Namespaced pools use the above "app" backend by default
#pools:
#my.dedicated.cache: null

View File

@ -1,4 +0,0 @@
debug:
# Forwards VarDumper Data clones to a centralized server allowing to inspect dumps on CLI or in your browser.
# See the "server:dump" command to start a new server.
dump_destination: "tcp://%env(VAR_DUMPER_SERVER)%"

View File

@ -24,7 +24,7 @@ doctrine:
mappings: mappings:
App: App:
is_bundle: false is_bundle: false
type: annotation type: attribute
dir: '%kernel.project_dir%/src/Entity' dir: '%kernel.project_dir%/src/Entity'
prefix: 'App\Entity' prefix: 'App\Entity'
alias: App alias: App

View File

@ -1,5 +1,6 @@
doctrine_migrations: doctrine_migrations:
dir_name: '%kernel.project_dir%/src/Migrations' migrations_paths:
- '%kernel.project_dir%/src/Migrations'
# namespace is arbitrary but should be different from App\Migrations # namespace is arbitrary but should be different from App\Migrations
# as migrations classes should NOT be autoloaded # as migrations classes should NOT be autoloaded
namespace: DoctrineMigrations # namespace: DoctrineMigrations

View File

@ -9,6 +9,7 @@ framework:
session: session:
# With this config, PHP's native session handling is used # With this config, PHP's native session handling is used
handler_id: ~ handler_id: ~
#storage_id: session.storage.factory.native
#esi: ~ #esi: ~
#fragments: ~ #fragments: ~

View File

@ -0,0 +1,8 @@
# As of Symfony 5.1, deprecations are logged in the dedicated "deprecation" channel when it exists
#monolog:
# channels: [deprecation]
# handlers:
# deprecation:
# type: stream
# channels: [deprecation]
# path: "%kernel.logs_dir%/%kernel.environment%.deprecations.log"

View File

@ -0,0 +1,3 @@
framework:
router:
strict_requirements: null

View File

@ -0,0 +1,2 @@
twig:
strict_variables: true

5
config/preload.php Normal file
View File

@ -0,0 +1,5 @@
<?php declare(strict_types=1);
if (file_exists(dirname(__DIR__) . '/var/cache/prod/App_KernelProdContainer.preload.php')) {
require dirname(__DIR__) . '/var/cache/prod/App_KernelProdContainer.preload.php';
}

3
config/routes.yaml Normal file
View File

@ -0,0 +1,3 @@
#index:
# path: /
# controller: App\Controller\DefaultController::index

View File

@ -0,0 +1,3 @@
_errors:
resource: '@FrameworkBundle/Resources/config/routing/errors.xml'
prefix: /_error

19
justfile Normal file
View File

@ -0,0 +1,19 @@
# Lists the available actions
default:
@just --list
# Runs rector, showing what changes will be make
rector-dry-run:
tools/vendor/bin/rector process --config=tools/rector.php --dry-run src
# Runs rector, and updates the files
rector:
tools/vendor/bin/rector process --config=tools/rector.php src
# Check code formatting
check-fmt:
tools/vendor/bin/php-cs-fixer fix --dry-run --verbose
# Fix code formatting
fmt:
tools/vendor/bin/php-cs-fixer fix --verbose

0
migrations/.gitignore vendored Normal file
View File

42
phpunit.xml.dist Normal file
View File

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- https://phpunit.readthedocs.io/en/latest/configuration.html -->
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
backupGlobals="false"
colors="true"
bootstrap="tests/bootstrap.php"
convertDeprecationsToExceptions="false"
>
<php>
<ini name="display_errors" value="1" />
<ini name="error_reporting" value="-1" />
<server name="APP_ENV" value="test" force="true" />
<server name="SHELL_VERBOSITY" value="-1" />
<server name="SYMFONY_PHPUNIT_REMOVE" value="" />
<server name="SYMFONY_PHPUNIT_VERSION" value="9.5" />
</php>
<testsuites>
<testsuite name="Project Test Suite">
<directory>tests</directory>
</testsuite>
</testsuites>
<coverage processUncoveredFiles="true">
<include>
<directory suffix=".php">src</directory>
</include>
</coverage>
<listeners>
<listener class="Symfony\Bridge\PhpUnit\SymfonyTestsListener" />
</listeners>
<!-- Run `composer require symfony/panther` before enabling this extension -->
<!--
<extensions>
<extension class="Symfony\Component\Panther\ServerExtension" />
</extensions>
-->
</phpunit>

View File

@ -1,30 +1,32 @@
<?php declare(strict_types=1); <?php
declare(strict_types=1);
use App\Kernel; use App\Kernel;
use Symfony\Component\Dotenv\Dotenv; use Symfony\Component\Dotenv\Dotenv;
use Symfony\Component\ErrorHandler\Debug; use Symfony\Component\ErrorHandler\Debug;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
require dirname(__DIR__).'/vendor/autoload.php'; require dirname(__DIR__) . '/vendor/autoload.php';
(new Dotenv())->bootEnv(dirname(__DIR__).'/.env'); (new Dotenv())->bootEnv(dirname(__DIR__) . '/.env');
if ($_SERVER['APP_DEBUG']) { if ($_SERVER['APP_DEBUG']) {
umask(0000); umask(0000);
Debug::enable(); Debug::enable();
} }
if ($trustedProxies = $_SERVER['TRUSTED_PROXIES'] ?? false) { if ($trustedProxies = $_SERVER['TRUSTED_PROXIES'] ?? FALSE) {
Request::setTrustedProxies(explode(',', $trustedProxies), Request::HEADER_X_FORWARDED_ALL ^ Request::HEADER_X_FORWARDED_HOST); Request::setTrustedProxies(explode(',', $trustedProxies), Request::HEADER_X_FORWARDED_ALL ^ Request::HEADER_X_FORWARDED_HOST);
} }
if ($trustedHosts = $_SERVER['TRUSTED_HOSTS'] ?? false) { if ($trustedHosts = $_SERVER['TRUSTED_HOSTS'] ?? FALSE) {
Request::setTrustedHosts([$trustedHosts]); Request::setTrustedHosts([$trustedHosts]);
} }
$kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']); $kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']);
$request = Request::createFromGlobals(); $request = Request::createFromGlobals();
$response = $kernel->handle($request); $response = $kernel->handle($request);
$response->send(); $response->send();
$kernel->terminate($request, $response); $kernel->terminate($request, $response);

5
src/.preload.php Normal file
View File

@ -0,0 +1,5 @@
<?php
if (file_exists(__DIR__.'/../var/cache/dev/App_KernelDevDebugContainer.preload.php')) {
require __DIR__.'/../var/cache/dev/App_KernelDevDebugContainer.preload.php';
}

0
src/Controller/.gitignore vendored Normal file
View File

View File

@ -5,148 +5,141 @@ namespace App\Controller;
use App\Entity\Camera; use App\Entity\Camera;
use App\Form\CameraType; use App\Form\CameraType;
use Doctrine\ORM\ORMInvalidArgumentException; use Doctrine\ORM\ORMInvalidArgumentException;
use Doctrine\Persistence\ManagerRegistry;
use LogicException;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\{RedirectResponse, Request, Response};
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Annotation\Route;
/** /**
* Camera controller. * Camera controller.
*
* @Route("camera")
*/ */
#[Route(path: 'camera')]
class CameraController extends AbstractController class CameraController extends AbstractController
{ {
use FormControllerTrait; use FormControllerTrait;
protected const ENTITY = Camera::class; protected const ENTITY = Camera::class;
protected const FORM = CameraType::class; protected const FORM = CameraType::class;
/** public function __construct(private readonly ManagerRegistry $managerRegistry)
* Lists all camera entities. {
* }
* @Route("/", name="camera_index", methods={"GET"})
*/
public function indexAction(): Response
{
$em = $this->getDoctrine()->getManager();
$receivedItems = $em->getRepository(self::ENTITY)->findBy([ /**
'received' => true * Lists all camera entities.
], [ */
'isWorking' => 'ASC', #[Route(path: '/', name: 'camera_index', methods: ['GET'])]
'brand' => 'ASC', public function indexAction(): Response
'mount' => 'ASC', {
'model' => 'ASC', $em = $this->managerRegistry->getManager();
]); $receivedItems = $em->getRepository(self::ENTITY)->findBy([
$newItems = $em->getRepository(self::ENTITY)->findBy([ 'received' => TRUE,
'received' => false ], [
], [ 'isWorking' => 'ASC',
'brand' => 'ASC', 'brand' => 'ASC',
'mount' => 'ASC', 'mount' => 'ASC',
'model' => 'ASC', 'model' => 'ASC',
]); ]);
$newItems = $em->getRepository(self::ENTITY)->findBy([
'received' => FALSE,
], [
'brand' => 'ASC',
'mount' => 'ASC',
'model' => 'ASC',
]);
$working = array_filter($receivedItems, [$this, 'isWorking']);
$notWorking = array_filter($receivedItems, [$this, 'isNotWorking']);
$working = array_filter($receivedItems, [$this, 'isWorking']); return $this->render('camera/index.html.twig', [
$notWorking = array_filter($receivedItems, [$this, 'isNotWorking']); 'not_received' => $newItems,
'not_working' => $notWorking,
'working' => $working,
]);
}
return $this->render('camera/index.html.twig', [ /**
'not_received' => $newItems, * Creates a new camera entity.
'not_working' => $notWorking, */
'working' => $working, #[Route(path: '/new', name: 'camera_new', methods: ['GET', 'POST'])]
]); public function newAction(Request $request): RedirectResponse|Response
} {
return $this->itemCreate($request, 'camera/new.html.twig', 'camera', 'camera_show');
}
/** /**
* Creates a new camera entity. * Finds and displays a camera entity.
* */
* @Route("/new", name="camera_new", methods={"GET", "POST"}) #[Route(path: '/{id}', name: 'camera_show', methods: ['GET'])]
*/ public function showAction(Camera $camera): Response
public function newAction(Request $request) {
{ return $this->itemView($camera, 'camera/show.html.twig', 'camera');
return $this->itemCreate($request, 'camera/new.html.twig', 'camera', 'camera_show'); }
}
/** /**
* Finds and displays a camera entity. * Displays a form to edit an existing camera entity.
* *
* @Route("/{id}", name="camera_show", methods={"GET"}) * @throws LogicException
*/ */
public function showAction(Camera $camera) #[Route(path: '/{id}/edit', name: 'camera_edit', methods: ['GET', 'POST'])]
{ public function editAction(Request $request, Camera $camera): RedirectResponse|Response
return $this->itemView($camera, 'camera/show.html.twig', 'camera'); {
} return $this->itemUpdate($request, $camera, 'camera/edit.html.twig', 'camera', 'camera_show');
}
/** /**
* Displays a form to edit an existing camera entity. * Deletes a camera entity.
* *
* @Route("/{id}/edit", name="camera_edit", methods={"GET", "POST"}) * @throws LogicException
* @throws \LogicException */
*/ #[Route(path: '/{id}', name: 'camera_delete', methods: ['DELETE'])]
public function editAction(Request $request, Camera $camera) public function deleteAction(Request $request, Camera $camera): RedirectResponse
{ {
return $this->itemUpdate($request, $camera, 'camera/edit.html.twig', 'camera', 'camera_show'); return $this->itemDelete($request, $camera, 'camera_index');
} }
/** /**
* Deletes a camera entity. * Moves a camera to the previouslyOwned table
* *
* @Route("/{id}", name="camera_delete", methods={"DELETE"}) * @throws LogicException
* @throws \LogicException * @throws ORMInvalidArgumentException
*/ */
public function deleteAction(Request $request, Camera $camera): RedirectResponse #[Route(path: '/{id}/deacquire', name: 'camera_deacquire', methods: ['POST'])]
{ public function deacquireAction(Request $request, Camera $camera): RedirectResponse
return $this->itemDelete($request, $camera, 'camera_index'); {
} return $this->itemDeacquire($request, $camera, 'previously-owned-camera_index');
}
/** /**
* Moves a camera to the previouslyOwned table * Creates a form to delete a camera entity.
* *
* @Route("/{id}/deacquire", name="camera_deacquire", methods={"POST"}) * @param Camera $camera The camera entity
* @param Request $request *
* @param Camera $camera * @return FormInterface The form
* @throws \LogicException */
* @throws ORMInvalidArgumentException private function createDeleteForm(Camera $camera): FormInterface
* @return RedirectResponse {
*/ return $this->buildForm($camera, 'camera_delete', 'DELETE');
public function deacquireAction(Request $request, Camera $camera): RedirectResponse }
{
return $this->itemDeacquire($request, $camera, 'previously-owned-camera_index');
}
/** /**
* Creates a form to delete a camera entity. * Creates a form to move
* *
* @param Camera $camera The camera entity * @param Camera $camera The camera entity
* */
* @return FormInterface The form private function createDeacquireForm(Camera $camera): FormInterface
*/ {
private function createDeleteForm(Camera $camera): FormInterface return $this->buildForm($camera, 'camera_deacquire');
{ }
return $this->buildForm($camera, 'camera_delete', 'DELETE');
}
/** private function isWorking(Camera $camera): bool
* Creates a form to move {
* return $camera->getIsWorking();
* @param Camera $camera The camera entity }
*
* @return FormInterface
*/
private function createDeacquireForm(Camera $camera): FormInterface
{
return $this->buildForm($camera, 'camera_deacquire');
}
private function isWorking(Camera $camera): bool private function isNotWorking(Camera $camera): bool
{ {
return $camera->getIsWorking(); return ! $this->isWorking($camera);
} }
private function isNotWorking(Camera $camera): bool
{
return !$this->isWorking($camera);
}
} }

View File

@ -4,83 +4,76 @@ namespace App\Controller;
use App\Entity\CameraType; use App\Entity\CameraType;
use App\Form\CameraTypeType; use App\Form\CameraTypeType;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\{RedirectResponse, Request, Response};
use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
/** #[Route(path: 'camera-type')]
* Cameratype controller.
*
* @Route("camera-type")
*/
class CameraTypeController extends AbstractController class CameraTypeController extends AbstractController
{ {
use FormControllerTrait; use FormControllerTrait;
protected const ENTITY = CameraType::class; protected const ENTITY = CameraType::class;
protected const FORM = CameraTypeType::class; protected const FORM = CameraTypeType::class;
/** public function __construct(private readonly ManagerRegistry $managerRegistry)
* Lists all cameraType entities. {
* }
* @Route("/", name="camera-type_index", methods={"GET"})
*/
public function indexAction()
{
return $this->itemListView('cameratype/index.html.twig', 'cameraTypes', [
'type' => 'ASC',
]);
}
/** /**
* Creates a new cameraType entity. * Lists all cameraType entities.
* */
* @Route("/new", name="camera-type_new", methods={"GET", "POST"}) #[Route(path: '/', name: 'camera-type_index', methods: ['GET'])]
*/ public function indexAction(): Response
public function newAction(Request $request) {
{ return $this->itemListView('cameratype/index.html.twig', 'cameraTypes', [
return $this->itemCreate($request, 'cameratype/new.html.twig', 'cameraType', 'camera-type_show'); 'type' => 'ASC',
} ]);
}
/** /**
* Finds and displays a cameraType entity. * Creates a new cameraType entity.
* */
* @Route("/{id}", name="camera-type_show", methods={"GET"}) #[Route(path: '/new', name: 'camera-type_new', methods: ['GET', 'POST'])]
*/ public function newAction(Request $request): Response
public function showAction(CameraType $cameraType) {
{ return $this->itemCreate($request, 'cameratype/new.html.twig', 'cameraType', 'camera-type_show');
return $this->itemView($cameraType, 'cameratype/show.html.twig', 'cameraType'); }
}
/** /**
* Displays a form to edit an existing cameraType entity. * Finds and displays a cameraType entity.
* */
* @Route("/{id}/edit", name="camera-type_edit", methods={"GET", "POST"}) #[Route(path: '/{id}', name: 'camera-type_show', methods: ['GET'])]
*/ public function showAction(CameraType $cameraType): Response
public function editAction(Request $request, CameraType $cameraType) {
{ return $this->itemView($cameraType, 'cameratype/show.html.twig', 'cameraType');
return $this->itemUpdate($request, $cameraType, 'cameratype/edit.html.twig', 'cameraType', 'camera-type_show'); }
}
/** /**
* Deletes a cameraType entity. * Displays a form to edit an existing cameraType entity.
* */
* @Route("/{id}", name="camera-type_delete", methods={"DELETE"}) #[Route(path: '/{id}/edit', name: 'camera-type_edit', methods: ['GET', 'POST'])]
*/ public function editAction(Request $request, CameraType $cameraType): RedirectResponse|Response
public function deleteAction(Request $request, CameraType $cameraType) {
{ return $this->itemUpdate($request, $cameraType, 'cameratype/edit.html.twig', 'cameraType', 'camera-type_show');
return $this->itemDelete($request, $cameraType, 'camera-type_index'); }
}
/** /**
* Creates a form to delete a cameraType entity. * Deletes a cameraType entity.
* */
* @param CameraType $cameraType The cameraType entity #[Route(path: '/{id}', name: 'camera-type_delete', methods: ['DELETE'])]
* public function deleteAction(Request $request, CameraType $cameraType): RedirectResponse
* @return \Symfony\Component\Form\Form The form {
*/ return $this->itemDelete($request, $cameraType, 'camera-type_index');
private function createDeleteForm(CameraType $cameraType) }
{
return $this->buildForm($cameraType, 'camera-type_delete', 'DELETE'); /**
} * Creates a form to delete a cameraType entity.
*/
private function createDeleteForm(CameraType $cameraType): FormInterface
{
return $this->buildForm($cameraType, 'camera-type_delete', 'DELETE');
}
} }

View File

@ -3,20 +3,17 @@
namespace App\Controller; namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\{Request, Response};
use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
class DefaultController extends AbstractController class DefaultController extends AbstractController
{ {
/** #[Route(path: '/', name: 'homepage')]
* @Route("/", name="homepage") public function indexAction(Request $request): Response
*/ {
public function indexAction(Request $request): Response // replace this example code with whatever you need
{ return $this->render('default/index.html.twig', [
// replace this example code with whatever you need 'base_dir' => realpath($this->getParameter('kernel.project_dir')) . DIRECTORY_SEPARATOR,
return $this->render('default/index.html.twig', [ ]);
'base_dir' => realpath($this->getParameter('kernel.project_dir')) . DIRECTORY_SEPARATOR, }
]);
}
} }

View File

@ -5,110 +5,107 @@ namespace App\Controller;
use App\Entity\Film; use App\Entity\Film;
use App\Form\FilmType; use App\Form\FilmType;
use Doctrine\Common\Collections\Criteria; use Doctrine\Common\Collections\Criteria;
use Doctrine\Persistence\ManagerRegistry;
use LogicException;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\{RedirectResponse, Request, Response};
use Symfony\Component\Routing\Annotation\Route;
/** /**
* Film controller. * Film controller.
*
* @Route("film")
*/ */
#[Route(path: 'film')]
class FilmController extends AbstractController class FilmController extends AbstractController
{ {
use FormControllerTrait; use FormControllerTrait;
protected const ENTITY = Film::class; protected const ENTITY = Film::class;
protected const FORM = FilmType::class; protected const FORM = FilmType::class;
/** public function __construct(private readonly ManagerRegistry $managerRegistry)
* Lists all film entities. {
* }
* @Route("/", name="film_index", methods={"GET"})
*/
public function indexAction(): Response
{
$repo = $this->getDoctrine()->getManager()->getRepository(self::ENTITY); /**
* Lists all film entities.
*/
#[Route(path: '/', name: 'film_index', methods: ['GET'])]
public function indexAction(): Response
{
$repo = $this->managerRegistry->getManager()->getRepository(self::ENTITY);
$criteria = Criteria::create()
->where(Criteria::expr()->gt('rollsInCamera', 0))
->orderBy([
'filmFormat' => Criteria::ASC,
'brand' => Criteria::ASC,
'rollsInCamera' => Criteria::DESC,
'productLine' => Criteria::ASC,
]);
$inCamera = $repo->matching($criteria);
$notInCamera = $repo->findBy([
'rollsInCamera' => 0,
], [
'brand' => 'ASC',
'productLine' => 'ASC',
'filmFormat' => 'ASC',
]);
$criteria = Criteria::create() return $this->render('film/index.html.twig', [
->where(Criteria::expr()->gt('rollsInCamera', 0)) 'in_camera' => $inCamera,
->orderBy([ 'films' => $notInCamera,
'filmFormat' => Criteria::ASC, ]);
'brand' => Criteria::ASC, }
'rollsInCamera' => Criteria::DESC,
'productLine' => Criteria::ASC,
]);
$inCamera = $repo->matching($criteria); /**
* Creates a new film entity.
*/
#[Route(path: '/new', name: 'film_new', methods: ['GET', 'POST'])]
public function newAction(Request $request): RedirectResponse|Response
{
return $this->itemCreate($request, 'film/new.html.twig', 'film', 'film_show');
}
$notInCamera = $repo->findBy([ /**
'rollsInCamera' => 0, * Finds and displays a film entity.
], [ */
'brand' => 'ASC', #[Route(path: '/{id}', name: 'film_show', methods: ['GET'])]
'productLine' => 'ASC', public function showAction(Film $film): Response
'filmFormat' => 'ASC', {
]); return $this->itemView($film, 'film/show.html.twig', 'film');
}
return $this->render('film/index.html.twig', [ /**
'in_camera' => $inCamera, * Displays a form to edit an existing film entity.
'films' => $notInCamera, *
]); * @throws LogicException
} */
#[Route(path: '/{id}/edit', name: 'film_edit', methods: ['GET', 'POST'])]
public function editAction(Request $request, Film $film): RedirectResponse|Response
{
return $this->itemUpdate($request, $film, 'film/edit.html.twig', 'film', 'film_show');
}
/** /**
* Creates a new film entity. * Deletes a film entity.
* *
* @Route("/new", name="film_new", methods={"GET", "POST"}) * @throws LogicException
*/ */
public function newAction(Request $request) #[Route(path: '/{id}', name: 'film_delete', methods: ['DELETE'])]
{ public function deleteAction(Request $request, Film $film): RedirectResponse
return $this->itemCreate($request, 'film/new.html.twig', 'film', 'film_show'); {
} return $this->itemDelete($request, $film, 'film_index');
}
/** /**
* Finds and displays a film entity. * Creates a form to delete a film entity.
* *
* @Route("/{id}", name="film_show", methods={"GET"}) * @param Film $film The film entity
*/ *
public function showAction(Film $film) * @return FormInterface The form
{ */
return $this->itemView($film, 'film/show.html.twig', 'film'); private function createDeleteForm(Film $film): FormInterface
} {
return $this->buildForm($film, 'film_delete', 'DELETE');
/** }
* Displays a form to edit an existing film entity.
*
* @Route("/{id}/edit", name="film_edit", methods={"GET", "POST"})
* @throws \LogicException
*/
public function editAction(Request $request, Film $film)
{
return $this->itemUpdate($request, $film, 'film/edit.html.twig', 'film', 'film_show');
}
/**
* Deletes a film entity.
*
* @Route("/{id}", name="film_delete", methods={"DELETE"})
* @throws \LogicException
*/
public function deleteAction(Request $request, Film $film)
{
return $this->itemDelete($request, $film, 'film_index');
}
/**
* Creates a form to delete a film entity.
*
* @param Film $film The film entity
*
* @return FormInterface The form
*/
private function createDeleteForm(Film $film): FormInterface
{
return $this->buildForm($film, 'film_delete', 'DELETE');
}
} }

View File

@ -4,81 +4,77 @@ namespace App\Controller;
use App\Entity\Flash; use App\Entity\Flash;
use App\Form\FlashType; use App\Form\FlashType;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\{RedirectResponse, Request, Response};
use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
/** /**
* Flash controller. * Flash controller.
*
* @Route("flash")
*/ */
#[Route(path: 'flash')]
class FlashController extends AbstractController class FlashController extends AbstractController
{ {
use FormControllerTrait; use FormControllerTrait;
protected const ENTITY = Flash::class; protected const ENTITY = Flash::class;
protected const FORM = FlashType::class; protected const FORM = FlashType::class;
/** public function __construct(private readonly ManagerRegistry $managerRegistry)
* Lists all flash entities. {
* }
* @Route("/", name="flash_index", methods={"GET"})
*/
public function indexAction()
{
return $this->itemListView('flash/index.html.twig', 'flashes');
}
/** /**
* Creates a new flash entity. * Lists all flash entities.
* */
* @Route("/new", name="flash_new", methods={"GET", "POST"}) #[Route(path: '/', name: 'flash_index', methods: ['GET'])]
*/ public function indexAction(): Response
public function newAction(Request $request) {
{ return $this->itemListView('flash/index.html.twig', 'flashes');
return $this->itemCreate($request, 'flash/new.html.twig', 'flash', 'flash_show'); }
}
/** /**
* Finds and displays a flash entity. * Creates a new flash entity.
* */
* @Route("/{id}", name="flash_show", methods={"GET"}) #[Route(path: '/new', name: 'flash_new', methods: ['GET', 'POST'])]
*/ public function newAction(Request $request): RedirectResponse|Response
public function showAction(Flash $flash) {
{ return $this->itemCreate($request, 'flash/new.html.twig', 'flash', 'flash_show');
return $this->itemView($flash, 'flash/show.html.twig', 'flash'); }
}
/** /**
* Displays a form to edit an existing flash entity. * Finds and displays a flash entity.
* */
* @Route("/{id}/edit", name="flash_edit", methods={"GET", "POST"}) #[Route(path: '/{id}', name: 'flash_show', methods: ['GET'])]
*/ public function showAction(Flash $flash): Response
public function editAction(Request $request, Flash $flash) {
{ return $this->itemView($flash, 'flash/show.html.twig', 'flash');
return $this->itemUpdate($request, $flash, 'flash/edit.html.twig', 'flash', 'flash_show'); }
}
/** /**
* Deletes a flash entity. * Displays a form to edit an existing flash entity.
* */
* @Route("/{id}", name="flash_delete", methods={"DELETE"}) #[Route(path: '/{id}/edit', name: 'flash_edit', methods: ['GET', 'POST'])]
*/ public function editAction(Request $request, Flash $flash): RedirectResponse|Response
public function deleteAction(Request $request, Flash $flash) {
{ return $this->itemUpdate($request, $flash, 'flash/edit.html.twig', 'flash', 'flash_show');
return $this->itemDelete($request, $flash, 'flash_index'); }
}
/** /**
* Creates a form to delete a flash entity. * Deletes a flash entity.
* */
* @param Flash $flash The flash entity #[Route(path: '/{id}', name: 'flash_delete', methods: ['DELETE'])]
* public function deleteAction(Request $request, Flash $flash): RedirectResponse
* @return \Symfony\Component\Form\FormInterface The form {
*/ return $this->itemDelete($request, $flash, 'flash_index');
private function createDeleteForm(Flash $flash) }
{
return $this->buildForm($flash, 'flash_delete', 'DELETE'); /**
} * Creates a form to delete a flash entity.
*/
private function createDeleteForm(Flash $flash): FormInterface
{
return $this->buildForm($flash, 'flash_delete', 'DELETE');
}
} }

View File

@ -2,167 +2,177 @@
namespace App\Controller; namespace App\Controller;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\{Request, Response, RedirectResponse}; use Symfony\Component\HttpFoundation\{RedirectResponse, Request, Response};
trait FormControllerTrait { trait FormControllerTrait
/** {
* Create a form generator private readonly ManagerRegistry $managerRegistry;
*/
protected function buildForm($item, string $actionRoute, string $method = 'POST'): FormInterface
{
return $this->createFormBuilder()
->setAction($this->generateUrl($actionRoute, ['id' => $item->getId()]))
->setMethod($method)
->getForm();
}
/** /**
* Show create form / create an item * Create a form generator
*/ *
protected function itemCreate(Request $request, string $template, string $templateKey, string $redirectRoute) * @param mixed $item
{ */
$Entity = self::ENTITY; protected function buildForm($item, string $actionRoute, string $method = 'POST'): FormInterface
$item = new $Entity; {
$form = $this->createForm(self::FORM, $item); return $this->createFormBuilder()
$form->handleRequest($request); ->setAction($this->generateUrl($actionRoute, ['id' => $item->getId()]))
->setMethod($method)
->getForm();
}
// If creating the item /**
if ($form->isSubmitted() && $form->isValid()) * Show create form / create an item
{ */
$em = $this->getDoctrine()->getManager(); protected function itemCreate(Request $request, string $template, string $templateKey, string $redirectRoute)
$em->persist($item); {
$em->flush(); $Entity = self::ENTITY;
$item = new $Entity();
$form = $this->createForm(self::FORM, $item);
$form->handleRequest($request);
return $this->redirectToRoute($redirectRoute, ['id' => $item->getId()]); // If creating the item
} if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($item);
$em->flush();
// If showing the form return $this->redirectToRoute($redirectRoute, ['id' => $item->getId()]);
return $this->render($template, [ }
$templateKey => $item,
'form' => $form->createView(),
]);
}
/** // If showing the form
* List view for the data type return $this->render($template, [
*/ $templateKey => $item,
protected function itemListView(string $template, string $templateKey, array $sort = []): Response 'form' => $form->createView(),
{ ]);
$em = $this->getDoctrine()->getManager(); }
$items = $em->getRepository(self::ENTITY)->findBy([], $sort); /**
* List view for the data type
*/
protected function itemListView(string $template, string $templateKey, array $sort = []): Response
{
$em = $this->managerRegistry->getManager();
return $this->render($template, [ $items = $em->getRepository(self::ENTITY)->findBy([], $sort);
$templateKey => $items,
]);
}
/** return $this->render($template, [
* View details for a specific item $templateKey => $items,
*/ ]);
protected function itemView($item, string $template, string $templateKey): Response }
{
$templateData = [
$templateKey => $item,
];
if (method_exists($this, 'createDeleteForm')) { /**
$deleteForm = $this->createDeleteForm($item); * View details for a specific item
$templateData['delete_form'] = $deleteForm->createView(); *
} * @param mixed $item
*/
protected function itemView($item, string $template, string $templateKey): Response
{
$templateData = [
$templateKey => $item,
];
return $this->render($template, $templateData); if (method_exists($this, 'createDeleteForm')) {
} $deleteForm = $this->createDeleteForm($item);
$templateData['delete_form'] = $deleteForm->createView();
}
/** return $this->render($template, $templateData);
* Show edit form / update an item }
*/
protected function itemUpdate(Request $request, $item, string $template, string $templateKey, string $redirectRoute)
{
$editForm = $this->createForm(self::FORM, $item);
$editForm->handleRequest($request);
// If updating the item /**
if ($editForm->isSubmitted() && $editForm->isValid()) * Show edit form / update an item
{ *
$em = $this->getDoctrine()->getManager(); * @param mixed $item
$em->persist($item); */
$em->flush(); protected function itemUpdate(Request $request, $item, string $template, string $templateKey, string $redirectRoute)
{
$editForm = $this->createForm(self::FORM, $item);
$editForm->handleRequest($request);
return $this->redirectToRoute($redirectRoute, ['id' => $item->getId()]); // If updating the item
} if ($editForm->isSubmitted() && $editForm->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($item);
$em->flush();
// If showing the edit form return $this->redirectToRoute($redirectRoute, ['id' => $item->getId()]);
$templateData = [ }
$templateKey => $item,
'edit_form' => $editForm->createView(),
];
if (method_exists($this, 'createDeleteForm')) // If showing the edit form
{ $templateData = [
$deleteForm = $this->createDeleteForm($item); $templateKey => $item,
$templateData['delete_form'] = $deleteForm->createView(); 'edit_form' => $editForm->createView(),
} ];
if (method_exists($this, 'createDeacquireForm')) if (method_exists($this, 'createDeleteForm')) {
{ $deleteForm = $this->createDeleteForm($item);
$deacquireForm = $this->createDeacquireForm($item); $templateData['delete_form'] = $deleteForm->createView();
$templateData['deacquire_form'] = $deacquireForm->createView(); }
}
if (method_exists($this, 'createReacquireForm')) if (method_exists($this, 'createDeacquireForm')) {
{ $deacquireForm = $this->createDeacquireForm($item);
$reacquireForm = $this->createReacquireForm($item); $templateData['deacquire_form'] = $deacquireForm->createView();
$templateData['reacquire_form'] = $reacquireForm->createView(); }
}
return $this->render($template, $templateData); if (method_exists($this, 'createReacquireForm')) {
} $reacquireForm = $this->createReacquireForm($item);
$templateData['reacquire_form'] = $reacquireForm->createView();
}
/** return $this->render($template, $templateData);
* Move an item to a previously_owned table }
*/
protected function itemDeacquire(Request $request, $item, string $redirectRoute): RedirectResponse
{
$form = $this->createDeacquireForm($item);
$form->handleRequest($request);
$repository = $this->getDoctrine()->getRepository(self::ENTITY); /**
$repository->deacquire($item); * Move an item to a previously_owned table
*
* @param mixed $item
*/
protected function itemDeacquire(Request $request, $item, string $redirectRoute): RedirectResponse
{
$form = $this->createDeacquireForm($item);
$form->handleRequest($request);
return $this->redirectToRoute($redirectRoute); $repository = $this->getDoctrine()->getRepository(self::ENTITY);
} $repository->deacquire($item);
/** return $this->redirectToRoute($redirectRoute);
* Move an item from a previously_owned table back to the original table }
*/
protected function itemReacquire(Request $request, $item, string $redirectRoute): RedirectResponse
{
$form = $this->createReacquireForm($item);
$form->handleRequest($request);
$repository = $this->getDoctrine()->getRepository(self::ENTITY); /**
$repository->reacquire($item); * Move an item from a previously_owned table back to the original table
*
* @param mixed $item
*/
protected function itemReacquire(Request $request, $item, string $redirectRoute): RedirectResponse
{
$form = $this->createReacquireForm($item);
$form->handleRequest($request);
return $this->redirectToRoute($redirectRoute); $repository = $this->getDoctrine()->getRepository(self::ENTITY);
} $repository->reacquire($item);
/** return $this->redirectToRoute($redirectRoute);
* Actually delete an item }
*/
protected function itemDelete(Request $request, $item, string $redirectRoute): RedirectResponse
{
$form = $this->createDeleteForm($item);
$form->handleRequest($request);
// if ($form->isSubmitted() && $form->isValid()) /**
{ * Actually delete an item
$em = $this->getDoctrine()->getManager(); *
$em->remove($item); * @param mixed $item
$em->flush(); */
} protected function itemDelete(Request $request, $item, string $redirectRoute): RedirectResponse
{
$form = $this->createDeleteForm($item);
$form->handleRequest($request);
return $this->redirectToRoute($redirectRoute); // if ($form->isSubmitted() && $form->isValid())
}
$em = $this->getDoctrine()->getManager();
$em->remove($item);
$em->flush();
return $this->redirectToRoute($redirectRoute);
}
} }

View File

@ -4,132 +4,127 @@ namespace App\Controller;
use App\Entity\Lenses; use App\Entity\Lenses;
use App\Form\LensesType; use App\Form\LensesType;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\{Request, RedirectResponse}; use Symfony\Component\HttpFoundation\{RedirectResponse, Request, Response};
use Symfony\Component\Routing\Annotation\Route;
/** /**
* Lens controller. * Lens controller.
*
* @Route("lens")
*/ */
#[Route(path: 'lens')]
class LensesController extends AbstractController class LensesController extends AbstractController
{ {
use FormControllerTrait; use FormControllerTrait;
protected const ENTITY = Lenses::class; protected const ENTITY = Lenses::class;
protected const FORM = LensesType::class; protected const FORM = LensesType::class;
/** public function __construct(private readonly ManagerRegistry $managerRegistry)
* Lists all lens entities. {
* }
* @Route("/", name="lens_index", methods={"GET"})
*/
public function indexAction()
{
$em = $this->getDoctrine()->getManager();
$receivedItems = $em->getRepository(self::ENTITY)->findBy([ /**
'received' => true * Lists all lens entities.
], [ */
'brand' => 'ASC', #[Route(path: '/', name: 'lens_index', methods: ['GET'])]
'productLine' => 'ASC', public function indexAction(): Response
'mount' => 'ASC', {
'minFocalLength' => 'ASC', $em = $this->managerRegistry->getManager();
'maxFStop' => 'ASC', $receivedItems = $em->getRepository(self::ENTITY)->findBy([
]); 'received' => TRUE,
$newItems = $em->getRepository(self::ENTITY)->findBy([ ], [
'received' => false 'brand' => 'ASC',
], [ 'productLine' => 'ASC',
'brand' => 'ASC', 'mount' => 'ASC',
'productLine' => 'ASC', 'minFocalLength' => 'ASC',
'mount' => 'ASC', 'maxFStop' => 'ASC',
'minFocalLength' => 'ASC', ]);
'maxFStop' => 'ASC', $newItems = $em->getRepository(self::ENTITY)->findBy([
]); 'received' => FALSE,
], [
'brand' => 'ASC',
'productLine' => 'ASC',
'mount' => 'ASC',
'minFocalLength' => 'ASC',
'maxFStop' => 'ASC',
]);
return $this->render('lenses/index.html.twig', [ return $this->render('lenses/index.html.twig', [
'not_received' => $newItems, 'not_received' => $newItems,
'lenses' => $receivedItems, 'lenses' => $receivedItems,
]); ]);
} }
/** /**
* Creates a new lens entity. * Creates a new lens entity.
* */
* @Route("/new", name="lens_new", methods={"GET", "POST"}) #[Route(path: '/new', name: 'lens_new', methods: ['GET', 'POST'])]
*/ public function newAction(Request $request): RedirectResponse|Response
public function newAction(Request $request) {
{ return $this->itemCreate($request, 'lenses/new.html.twig', 'lense', 'lens_show');
return $this->itemCreate($request, 'lenses/new.html.twig', 'lense', 'lens_show'); }
}
/** /**
* Finds and displays a lens entity. * Finds and displays a lens entity.
* */
* @Route("/{id}", name="lens_show", methods={"GET"}) #[Route(path: '/{id}', name: 'lens_show', methods: ['GET'])]
*/ public function showAction(Lenses $lens): Response
public function showAction(Lenses $lens) {
{ return $this->itemView($lens, 'lenses/show.html.twig', 'lense');
return $this->itemView($lens, 'lenses/show.html.twig', 'lense'); }
}
/** /**
* Displays a form to edit an existing lens entity. * Displays a form to edit an existing lens entity.
* */
* @Route("/{id}/edit", name="lens_edit", methods={"GET", "POST"}) #[Route(path: '/{id}/edit', name: 'lens_edit', methods: ['GET', 'POST'])]
*/ public function editAction(Request $request, Lenses $lens): RedirectResponse|Response
public function editAction(Request $request, Lenses $lens) {
{ return $this->itemUpdate($request, $lens, 'lenses/edit.html.twig', 'lense', 'lens_show');
return $this->itemUpdate($request, $lens, 'lenses/edit.html.twig', 'lense', 'lens_show'); }
}
/** /**
* Moves a camera to the previouslyOwned table * Moves a camera to the previouslyOwned table
* *
* @Route("/{id}/deacquire", name="lens_deacquire", methods={"POST"}) * @param Request $request
* @param Request $request *
* @param Lenses $lens * @return RedirectResponse
* @return RedirectResponse */
*/ #[Route(path: '/{id}/deacquire', name: 'lens_deacquire', methods: ['POST'])]
public function deacquireAction(Request $request, Lenses $lens) public function deacquireAction(Request $request, Lenses $lens): RedirectResponse
{ {
return $this->itemDeacquire($request, $lens, 'previously-owned-lens_index'); return $this->itemDeacquire($request, $lens, 'previously-owned-lens_index');
} }
/** /**
* Deletes a lens entity. * Deletes a lens entity.
* */
* @Route("/{id}", name="lens_delete", methods={"DELETE"}) #[Route(path: '/{id}', name: 'lens_delete', methods: ['DELETE'])]
*/ public function deleteAction(Request $request, Lenses $lens): RedirectResponse
public function deleteAction(Request $request, Lenses $lens) {
{ return $this->itemDelete($request, $lens, 'lens_index');
return $this->itemDelete($request, $lens, 'lens_index'); }
}
/** /**
* Creates a form to delete a lens entity. * Creates a form to delete a lens entity.
* *
* @param Lenses $lens The lens entity * @param Lenses $lens The lens entity
* *
* @return FormInterface The form * @return FormInterface The form
*/ */
private function createDeleteForm(Lenses $lens): FormInterface private function createDeleteForm(Lenses $lens): FormInterface
{ {
return $this->buildForm($lens, 'lens_delete', 'DELETE'); return $this->buildForm($lens, 'lens_delete', 'DELETE');
} }
/**
/** * Creates a form to move
* Creates a form to move *
* * @param Lenses $lens The lens entity
* @param Lenses $lens The lens entity */
* private function createDeacquireForm(Lenses $lens): FormInterface
* @return FormInterface {
*/ return $this->buildForm($lens, 'lens_deacquire');
private function createDeacquireForm(Lenses $lens): FormInterface }
{
return $this->buildForm($lens, 'lens_deacquire');
}
} }

View File

@ -4,84 +4,88 @@ namespace App\Controller;
use App\Entity\PreviouslyOwnedCamera; use App\Entity\PreviouslyOwnedCamera;
use App\Form\PreviouslyOwnedCameraType; use App\Form\PreviouslyOwnedCameraType;
use Doctrine\ORM\ORMInvalidArgumentException;
use Doctrine\Persistence\ManagerRegistry;
use LogicException;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\{RedirectResponse, Request}; use Symfony\Component\HttpFoundation\{RedirectResponse, Request, Response};
use Symfony\Component\Routing\Annotation\Route;
use UnexpectedValueException;
/** /**
* Previouslyownedcamera controller. * Previouslyownedcamera controller.
*
* @Route("previously-owned-camera")
*/ */
#[Route(path: 'previously-owned-camera')]
class PreviouslyOwnedCameraController extends AbstractController class PreviouslyOwnedCameraController extends AbstractController
{ {
use FormControllerTrait; use FormControllerTrait;
protected const ENTITY = PreviouslyOwnedCamera::class; protected const ENTITY = PreviouslyOwnedCamera::class;
protected const FORM = PreviouslyOwnedCameraType::class; protected const FORM = PreviouslyOwnedCameraType::class;
/** public function __construct(private readonly ManagerRegistry $managerRegistry)
* Lists all previouslyOwnedCamera entities. {
* }
* @Route("/", name="previously-owned-camera_index", methods={"GET"})
* @throws \UnexpectedValueException
*/
public function indexAction()
{
return $this->itemListView('previouslyownedcamera/index.html.twig', 'previouslyOwnedCameras', [
'brand' => 'ASC',
'mount' => 'ASC',
'model' => 'ASC',
]);
}
/** /**
* Finds and displays a previouslyOwnedCamera entity. * Lists all previouslyOwnedCamera entities.
* *
* @Route("/{id}", name="previously-owned-camera_show", methods={"GET"}) * @throws UnexpectedValueException
*/ */
public function showAction(PreviouslyOwnedCamera $previouslyOwnedCamera) #[Route(path: '/', name: 'previously-owned-camera_index', methods: ['GET'])]
{ public function indexAction(): Response
return $this->itemView($previouslyOwnedCamera, 'previouslyownedcamera/show.html.twig', 'previouslyOwnedCamera'); {
} return $this->itemListView('previouslyownedcamera/index.html.twig', 'previouslyOwnedCameras', [
'brand' => 'ASC',
'mount' => 'ASC',
'model' => 'ASC',
]);
}
/** /**
* Displays a form to edit an existing previouslyOwnedCamera entity. * Finds and displays a previouslyOwnedCamera entity.
* */
* @Route("/{id}/edit", name="previously-owned-camera_edit", methods={"GET", "POST"}) #[Route(path: '/{id}', name: 'previously-owned-camera_show', methods: ['GET'])]
* @throws \LogicException public function showAction(PreviouslyOwnedCamera $previouslyOwnedCamera): Response
*/ {
public function editAction(Request $request, PreviouslyOwnedCamera $previouslyOwnedCamera) return $this->itemView($previouslyOwnedCamera, 'previouslyownedcamera/show.html.twig', 'previouslyOwnedCamera');
{ }
return $this->itemUpdate($request, $previouslyOwnedCamera, 'previouslyownedcamera/edit.html.twig', 'previouslyOwnedCamera', 'previously-owned-camera_show');
}
/** /**
* Moves a camera to the previouslyOwned table * Displays a form to edit an existing previouslyOwnedCamera entity.
* *
* @Route("/{id}/reacquire", name="previously-owned-camera_reacquire", methods={"POST"}) * @throws LogicException
* @param Request $request */
* @param PreviouslyOwnedCamera $camera #[Route(path: '/{id}/edit', name: 'previously-owned-camera_edit', methods: ['GET', 'POST'])]
* @throws \LogicException public function editAction(Request $request, PreviouslyOwnedCamera $previouslyOwnedCamera): RedirectResponse|Response
* @throws \Doctrine\ORM\ORMInvalidArgumentException {
* @return RedirectResponse return $this->itemUpdate($request, $previouslyOwnedCamera, 'previouslyownedcamera/edit.html.twig', 'previouslyOwnedCamera', 'previously-owned-camera_show');
*/ }
public function reacquireAction(Request $request, PreviouslyOwnedCamera $camera): RedirectResponse
{
return $this->itemReacquire($request, $camera, 'camera_index');
}
/**
* Moves a camera to the previouslyOwned table
*
* @param Request $request
*
* @throws LogicException
* @throws ORMInvalidArgumentException
*
* @return RedirectResponse
*/
#[Route(path: '/{id}/reacquire', name: 'previously-owned-camera_reacquire', methods: ['POST'])]
public function reacquireAction(Request $request, PreviouslyOwnedCamera $camera): RedirectResponse
{
return $this->itemReacquire($request, $camera, 'camera_index');
}
/** /**
* Creates a form to move * Creates a form to move
* *
* @param PreviouslyOwnedCamera $camera The camera entity * @param PreviouslyOwnedCamera $camera The camera entity
* */
* @return FormInterface private function createReacquireForm(PreviouslyOwnedCamera $camera): FormInterface
*/ {
private function createReacquireForm(PreviouslyOwnedCamera $camera): FormInterface return $this->buildForm($camera, 'previously-owned-camera_reacquire', 'POST');
{ }
return $this->buildForm($camera, 'previously-owned-camera_reacquire', 'POST');
}
} }

View File

@ -4,58 +4,59 @@ namespace App\Controller;
use App\Entity\PreviouslyOwnedFlash; use App\Entity\PreviouslyOwnedFlash;
use App\Form\PreviouslyOwnedFlashType; use App\Form\PreviouslyOwnedFlashType;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\{RedirectResponse, Request, Response};
use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
/** /**
* Previouslyownedflash controller. * Previouslyownedflash controller.
*
* @Route("previously-owned-flash")
*/ */
#[Route(path: 'previously-owned-flash')]
class PreviouslyOwnedFlashController extends AbstractController class PreviouslyOwnedFlashController extends AbstractController
{ {
use FormControllerTrait; use FormControllerTrait;
protected const ENTITY = PreviouslyOwnedFlash::class; protected const ENTITY = PreviouslyOwnedFlash::class;
protected const FORM = PreviouslyOwnedFlashType::class; protected const FORM = PreviouslyOwnedFlashType::class;
/**
* Lists all previouslyOwnedFlash entities.
*
* @Route("/", name="previously-owned-flash_index", methods={"GET"})
*/
public function indexAction()
{
return $this->itemListView('previouslyownedflash/index.html.twig', 'previouslyOwnedFlashes');
}
/** public function __construct(private readonly ManagerRegistry $managerRegistry)
* Creates a new previouslyOwnedFlash entity. {
* }
* @Route("/new", name="previously-owned-flash_new", methods={"GET", "POST"})
*/
public function newAction(Request $request)
{
return $this->itemCreate($request, 'previouslyownedflash/new.html.twig', 'previouslyOwnedFlash', 'previously-owned-flash_show');
}
/** /**
* Finds and displays a previouslyOwnedFlash entity. * Lists all previouslyOwnedFlash entities.
* */
* @Route("/{id}", name="previously-owned-flash_show", methods={"GET"}) #[Route(path: '/', name: 'previously-owned-flash_index', methods: ['GET'])]
*/ public function indexAction(): Response
public function showAction(PreviouslyOwnedFlash $previouslyOwnedFlash) {
{ return $this->itemListView('previouslyownedflash/index.html.twig', 'previouslyOwnedFlashes');
return $this->itemView($previouslyOwnedFlash, 'previouslyownedcamera/show.html.twig', 'previouslyOwnedFlash'); }
}
/** /**
* Displays a form to edit an existing previouslyOwnedFlash entity. * Creates a new previouslyOwnedFlash entity.
* */
* @Route("/{id}/edit", name="previously-owned-flash_edit", methods={"GET", "POST"}) #[Route(path: '/new', name: 'previously-owned-flash_new', methods: ['GET', 'POST'])]
*/ public function newAction(Request $request): RedirectResponse|Response
public function editAction(Request $request, PreviouslyOwnedFlash $previouslyOwnedFlash) {
{ return $this->itemCreate($request, 'previouslyownedflash/new.html.twig', 'previouslyOwnedFlash', 'previously-owned-flash_show');
return $this->itemUpdate($request, $previouslyOwnedFlash, 'previouslyownedflash/edit.html.twig', 'previouslyOwnedFlash', 'previously-owned-flash_show'); }
}
/**
* Finds and displays a previouslyOwnedFlash entity.
*/
#[Route(path: '/{id}', name: 'previously-owned-flash_show', methods: ['GET'])]
public function showAction(PreviouslyOwnedFlash $previouslyOwnedFlash): Response
{
return $this->itemView($previouslyOwnedFlash, 'previouslyownedcamera/show.html.twig', 'previouslyOwnedFlash');
}
/**
* Displays a form to edit an existing previouslyOwnedFlash entity.
*/
#[Route(path: '/{id}/edit', name: 'previously-owned-flash_edit', methods: ['GET', 'POST'])]
public function editAction(Request $request, PreviouslyOwnedFlash $previouslyOwnedFlash): RedirectResponse|Response
{
return $this->itemUpdate($request, $previouslyOwnedFlash, 'previouslyownedflash/edit.html.twig', 'previouslyOwnedFlash', 'previously-owned-flash_show');
}
} }

View File

@ -4,53 +4,53 @@ namespace App\Controller;
use App\Entity\PreviouslyOwnedLenses; use App\Entity\PreviouslyOwnedLenses;
use App\Form\PreviouslyOwnedLensesType; use App\Form\PreviouslyOwnedLensesType;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\{RedirectResponse, Request, Response};
use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
/** #[Route(path: 'previously-owned-lens')]
* @Route("previously-owned-lens")
*/
class PreviouslyOwnedLensesController extends AbstractController class PreviouslyOwnedLensesController extends AbstractController
{ {
use FormControllerTrait; use FormControllerTrait;
protected const ENTITY = PreviouslyOwnedLenses::class; protected const ENTITY = PreviouslyOwnedLenses::class;
protected const FORM = PreviouslyOwnedLensesType::class; protected const FORM = PreviouslyOwnedLensesType::class;
/** public function __construct(private readonly ManagerRegistry $managerRegistry)
* Lists all previouslyOwnedLense entities. {
* }
* @Route("/", name="previously-owned-lens_index", methods={"GET"})
*/
public function indexAction()
{
return $this->itemListView('previouslyownedlenses/index.html.twig', 'previouslyOwnedLenses', [
'brand' => 'ASC',
'productLine' => 'ASC',
'mount' => 'ASC',
'minFocalLength' => 'ASC',
'maxFStop' => 'ASC',
]);
}
/** /**
* Finds and displays a previouslyOwnedLense entity. * Lists all previouslyOwnedLense entities.
* */
* @Route("/{id}", name="previously-owned-lens_show", methods={"GET"}) #[Route(path: '/', name: 'previously-owned-lens_index', methods: ['GET'])]
*/ public function indexAction(): Response
public function showAction(PreviouslyOwnedLenses $previouslyOwnedLens) {
{ return $this->itemListView('previouslyownedlenses/index.html.twig', 'previouslyOwnedLenses', [
return $this->itemView($previouslyOwnedLens, 'previouslyownedlenses/show.html.twig', 'previouslyOwnedLense'); 'brand' => 'ASC',
} 'productLine' => 'ASC',
'mount' => 'ASC',
'minFocalLength' => 'ASC',
'maxFStop' => 'ASC',
]);
}
/** /**
* Displays a form to edit an existing previouslyOwnedLense entity. * Finds and displays a previouslyOwnedLense entity.
* */
* @Route("/{id}/edit", name="previously-owned-lens_edit", methods={"GET", "POST"}) #[Route(path: '/{id}', name: 'previously-owned-lens_show', methods: ['GET'])]
*/ public function showAction(PreviouslyOwnedLenses $previouslyOwnedLens): Response
public function editAction(Request $request, PreviouslyOwnedLenses $previouslyOwnedLens) {
{ return $this->itemView($previouslyOwnedLens, 'previouslyownedlenses/show.html.twig', 'previouslyOwnedLense');
return $this->itemUpdate($request, $previouslyOwnedLens, 'previouslyownedlenses/edit.html.twig', 'previouslyOwnedLense', 'previously-owned-lens_show'); }
}
/**
* Displays a form to edit an existing previouslyOwnedLense entity.
*/
#[Route(path: '/{id}/edit', name: 'previously-owned-lens_edit', methods: ['GET', 'POST'])]
public function editAction(Request $request, PreviouslyOwnedLenses $previouslyOwnedLens): RedirectResponse|Response
{
return $this->itemUpdate($request, $previouslyOwnedLens, 'previouslyownedlenses/edit.html.twig', 'previouslyOwnedLense', 'previously-owned-lens_show');
}
} }

0
src/Entity/.gitignore vendored Normal file
View File

View File

@ -6,18 +6,13 @@ use Doctrine\ORM\Mapping as ORM;
/** /**
* Battery Type * Battery Type
*
* @ORM\Table(name="battery_type", schema="camera")
* @ORM\Entity
*/ */
#[ORM\Table(name: 'battery_type', schema: 'camera')]
#[ORM\Entity]
class BatteryType class BatteryType
{ {
/** #[ORM\Column(name: 'id', type: 'integer', nullable: FALSE)]
* @var integer #[ORM\Id]
* #[ORM\GeneratedValue(strategy: 'IDENTITY')]
* @ORM\Column(name="id", type="integer", nullable=false) private int $id;
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
} }

View File

@ -2,26 +2,22 @@
namespace App\Entity; namespace App\Entity;
use App\Repository\CameraRepository;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
/** /**
* Camera * Camera
*
* @ORM\Table(name="camera", schema="camera", indexes={
@ORM\Index(name="IDX_747C826FC54C8C93", columns={"type_id"})
})
* @ORM\Entity(repositoryClass="App\Repository\CameraRepository")
*/ */
class Camera { #[ORM\Table(name: 'camera', schema: 'camera')]
use CameraTrait; #[ORM\Index(columns: ['type_id'], name: 'IDX_747C826FC54C8C93')]
#[ORM\Entity(repositoryClass: CameraRepository::class)]
class Camera
{
use CameraTrait;
/** #[ORM\Column(name: 'id', type: 'integer', nullable: FALSE)]
* @var integer #[ORM\Id]
* #[ORM\GeneratedValue(strategy: 'IDENTITY')]
* @ORM\Column(name="id", type="integer", nullable=false) #[ORM\SequenceGenerator(sequenceName: 'camera__id_seq', allocationSize: 1, initialValue: 1)]
* @ORM\Id private int $id;
* @ORM\GeneratedValue(strategy="IDENTITY")
* @ORM\SequenceGenerator(sequenceName="camera__id_seq", allocationSize=1, initialValue=1)
*/
private $id;
} }

View File

@ -2,438 +2,215 @@
namespace App\Entity; namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/** /**
* Trait CameraTrait * Trait CameraTrait
* *
* Shared columns for camera, and previously_owned_camera tables * Shared columns for camera, and previously_owned_camera tables
*
* @package App\Entity
*/ */
trait CameraTrait trait CameraTrait
{ {
use PurchasePriceTrait; use PurchasePriceTrait;
/** #[ORM\ManyToOne(targetEntity: 'CameraType')]
* @var CameraType #[ORM\JoinColumn(name: 'type_id', referencedColumnName: 'id', nullable: FALSE)]
* private readonly CameraType $type;
* @ORM\ManyToOne(targetEntity="CameraType")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="type_id", referencedColumnName="id")
* })
*/
private $type;
/** #[ORM\Column(name: 'brand', type: 'string', length: 64, nullable: FALSE)]
* @var string private readonly string $brand;
*
* @ORM\Column(name="brand", type="string", length=64, nullable=false)
*/
private $brand;
/** #[ORM\Column(name: 'mount', type: 'string', length: 32, nullable: FALSE)]
* @var string private readonly string $mount;
*
* @ORM\Column(name="mount", type="string", length=32, nullable=false)
*/
private $mount;
/** #[ORM\Column(name: 'model', type: 'string', length: 255, nullable: FALSE)]
* @var string private readonly string $model;
*
* @ORM\Column(name="model", type="string", length=255, nullable=false)
*/
private $model;
/** #[ORM\Column(name: 'is_digital', type: 'boolean', nullable: FALSE)]
* @var boolean private readonly bool $isDigital;
*
* @ORM\Column(name="is_digital", type="boolean", nullable=false)
*/
private $isDigital;
/** #[ORM\Column(name: 'crop_factor', type: 'decimal', precision: 10, scale: 0, nullable: FALSE)]
* @var string private string $cropFactor = '1.0';
*
* @ORM\Column(name="crop_factor", type="decimal", precision=10, scale=0, nullable=false)
*/
private $cropFactor = '1.0';
/** #[ORM\Column(name: 'is_working', type: 'boolean', nullable: FALSE)]
* @var boolean private readonly bool $isWorking;
*
* @ORM\Column(name="is_working", type="boolean", nullable=false)
*/
private $isWorking;
/** #[ORM\Column(name: 'notes', type: 'text', nullable: TRUE)]
* @var string private readonly ?string $notes;
*
* @ORM\Column(name="notes", type="text", nullable=true)
*/
private $notes;
/** #[ORM\Column(name: 'serial', type: 'string', length: 20, nullable: FALSE)]
* @var string private readonly string $serial;
*
* @ORM\Column(name="serial", type="string", length=20, nullable=false)
*/
private $serial;
/** #[ORM\Column(name: 'formerly_owned', type: 'boolean', nullable: FALSE)]
* @var boolean private bool $formerlyOwned = FALSE;
*
* @ORM\Column(name="formerly_owned", type="boolean", nullable=false)
*/
private $formerlyOwned = false;
/** #[ORM\Column(name: 'battery_type', type: 'string', nullable: TRUE)]
* @var string private readonly ?string $batteryType;
*
* @ORM\Column(name="purchase_price", type="money", nullable=true)
*/
private $purchasePrice;
/** #[ORM\Column(name: 'film_format', type: 'string', nullable: TRUE)]
* @var string private ?string $filmFormat = '135';
*
* @ORM\Column(name="battery_type", type="string", nullable=true)
*/
private $batteryType;
/** #[ORM\Column(name: 'received', type: 'boolean', nullable: TRUE)]
* @var string private ?bool $received = FALSE;
*
* @ORM\Column(name="film_format", type="string", nullable=true)
*/
private $filmFormat = '135';
/** public function getId(): int
* @var boolean {
* return $this->id;
* @ORM\Column(name="received", type="boolean", nullable=true) }
*/
private $received = false;
/** public function setType(?CameraType $type = NULL): self
* Get id {
* $this->type = $type;
* @return integer
*/
public function getId(): int
{
return $this->id;
}
/** return $this;
* Set type }
*
* @param CameraType $type
*
* @return self
*/
public function setType(CameraType $type = null): self
{
$this->type = $type;
return $this; public function getType(): CameraType
} {
return $this->type;
}
/** public function setBrand(string $brand): self
* Get type {
* $this->brand = $brand;
* @return CameraType
*/
public function getType(): ?CameraType
{
return $this->type;
}
/** return $this;
* Set brand }
*
* @param string $brand
*
* @return self
*/
public function setBrand($brand): self
{
$this->brand = $brand;
return $this; public function getBrand(): string
} {
return $this->brand;
}
/** public function setMount(string $mount): self
* Get brand {
* $this->mount = $mount;
* @return string
*/
public function getBrand(): ?string
{
return $this->brand;
}
/** return $this;
* Set mount }
*
* @param string $mount
*
* @return self
*/
public function setMount($mount): self
{
$this->mount = $mount;
return $this; public function getMount(): string
} {
return $this->mount;
}
/** public function setModel(string $model): self
* Get mount {
* $this->model = $model;
* @return string
*/
public function getMount(): ?string
{
return $this->mount;
}
/** return $this;
* Set model }
*
* @param string $model
*
* @return self
*/
public function setModel($model): self
{
$this->model = $model;
return $this; public function getModel(): string
} {
return $this->model;
}
/** public function setIsDigital(bool $isDigital): self
* Get model {
* $this->isDigital = $isDigital;
* @return string
*/
public function getModel(): ?string
{
return $this->model;
}
/** return $this;
* Set isDigital }
*
* @param boolean $isDigital
*
* @return self
*/
public function setIsDigital($isDigital): self
{
$this->isDigital = $isDigital;
return $this; public function getIsDigital(): bool
} {
return $this->isDigital;
}
/** public function setCropFactor(string $cropFactor): self
* Get isDigital {
* $this->cropFactor = $cropFactor;
* @return boolean
*/
public function getIsDigital(): ?bool
{
return $this->isDigital;
}
/** return $this;
* Set cropFactor }
*
* @param string $cropFactor
*
* @return self
*/
public function setCropFactor($cropFactor): self
{
$this->cropFactor = $cropFactor;
return $this; public function getCropFactor(): string
} {
return $this->cropFactor;
}
/** public function setIsWorking(bool $isWorking): self
* Get cropFactor {
* $this->isWorking = $isWorking;
* @return string
*/
public function getCropFactor(): string
{
return $this->cropFactor;
}
/** return $this;
* Set isWorking }
*
* @param boolean $isWorking
*
* @return self
*/
public function setIsWorking($isWorking): self
{
$this->isWorking = $isWorking;
return $this; public function getIsWorking(): bool
} {
return $this->isWorking;
}
/** public function setNotes(string $notes): self
* Get isWorking {
* $this->notes = $notes;
* @return boolean
*/
public function getIsWorking(): ?bool
{
return $this->isWorking;
}
/** return $this;
* Set notes }
*
* @param string $notes
*
* @return self
*/
public function setNotes($notes): self
{
$this->notes = $notes;
return $this; public function getNotes(): string
} {
return $this->notes ?? '';
}
/** public function setSerial(string $serial): self
* Get notes {
* $this->serial = $serial;
* @return string
*/
public function getNotes(): string
{
return $this->notes ?? '';
}
/** return $this;
* Set serial }
*
* @param string $serial
*
* @return self
*/
public function setSerial($serial): self
{
$this->serial = $serial;
return $this; public function getSerial(): string
} {
return $this->serial ?? '';
}
/** public function setFormerlyOwned(bool $formerlyOwned): self
* Get serial {
* $this->formerlyOwned = $formerlyOwned;
* @return string
*/
public function getSerial(): string
{
return $this->serial ?? '';
}
/** return $this;
* Set formerlyOwned }
*
* @param boolean $formerlyOwned
*
* @return self
*/
public function setFormerlyOwned($formerlyOwned): self
{
$this->formerlyOwned = $formerlyOwned;
return $this; public function getFormerlyOwned(): bool
} {
return $this->formerlyOwned;
}
/** public function setBatteryType(string $batteryType): self
* Get formerlyOwned {
* $this->batteryType = $batteryType;
* @return boolean
*/
public function getFormerlyOwned(): ?bool
{
return $this->formerlyOwned;
}
/** return $this;
* Set batteryType }
*
* @param string $batteryType
*
* @return self
*/
public function setBatteryType($batteryType): self
{
$this->batteryType = $batteryType;
return $this; public function getBatteryType(): string
} {
return $this->batteryType ?? '';
}
/** public function setFilmFormat(string $filmFormat): self
* Get batteryType {
* $this->filmFormat = $filmFormat;
* @return string
*/
public function getBatteryType(): ?string
{
return $this->batteryType;
}
/** return $this;
* Set filmFormat }
*
* @param string $filmFormat
*
* @return self
*/
public function setFilmFormat($filmFormat): self
{
$this->filmFormat = $filmFormat;
return $this; public function getFilmFormat(): string
} {
return $this->filmFormat ?? '';
}
/** public function setReceived(bool $received): self
* Get filmFormat {
* $this->received = $received;
* @return string
*/
public function getFilmFormat(): string
{
return $this->filmFormat;
}
/** return $this;
* Set received }
*
* @param boolean $received
*
* @return self
*/
public function setReceived($received): self
{
$this->received = $received;
return $this;
}
/**
* Get received
*
* @return boolean
*/
public function getReceived(): bool
{
return $this->received;
}
public function getReceived(): bool
{
return $this->received;
}
} }

View File

@ -3,106 +3,80 @@
namespace App\Entity; namespace App\Entity;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Stringable;
/** /**
* CameraType * CameraType
*
* @ORM\Table(name="camera_type", schema="camera")
* @ORM\Entity
*/ */
class CameraType #[ORM\Table(name: 'camera_type', schema: 'camera')]
#[ORM\Entity]
class CameraType implements Stringable
{ {
/** #[ORM\Column(name: 'id', type: 'integer', nullable: FALSE)]
* @var integer #[ORM\Id]
* #[ORM\GeneratedValue(strategy: 'IDENTITY')]
* @ORM\Column(name="id", type="integer", nullable=false) #[ORM\SequenceGenerator(sequenceName: 'camera.camera_type_id_seq', allocationSize: 1, initialValue: 1)]
* @ORM\Id private int $id;
* @ORM\GeneratedValue(strategy="IDENTITY")
* @ORM\SequenceGenerator(sequenceName="camera.camera_type_id_seq", allocationSize=1, initialValue=1)
*/
private $id;
/** #[ORM\Column(name: 'type', type: 'string', length: 255, nullable: FALSE)]
* @var string private string $type;
*
* @ORM\Column(name="type", type="string", length=255, nullable=false)
*/
private $type;
/** #[ORM\Column(name: 'description', type: 'text', nullable: TRUE)]
* @var string private ?string $description = NULL;
*
* @ORM\Column(name="description", type="text", nullable=true)
*/
private $description;
/**
* Value for serialization
*/
public function __toString(): string
{
return $this->type;
}
/** /**
* Value for serialization * Get id
* */
* @return string public function getId(): int
*/ {
public function __toString(): string return $this->id;
{ }
return $this->type;
}
/**
* Set type
*/
public function setType(string $type): self
{
$this->type = $type;
/** return $this;
* Get id }
*
* @return integer
*/
public function getId(): int
{
return $this->id;
}
/** /**
* Set type * Set description
* */
* @param string $type public function setDescription(string $description): self
* {
* @return CameraType $this->description = $description;
*/
public function setType(string $type): self
{
$this->type = $type;
return $this; return $this;
} }
/** /**
* Set description * Get type
* *
* @param string $description * @return string
* */
* @return CameraType public function getType(): ?string
*/ {
public function setDescription(string $description): self return $this->type;
{ }
$this->description = $description;
return $this; /**
} * Get description
*
/** * @return string
* Get type */
* public function getDescription(): ?string
* @return string {
*/ return $this->description;
public function getType(): ?string }
{
return $this->type;
}
/**
* Get description
*
* @return string
*/
public function getDescription(): ?string
{
return $this->description;
}
} }

View File

@ -6,351 +6,255 @@ use Doctrine\ORM\Mapping as ORM;
/** /**
* Camera * Camera
*
* @ORM\Table(name="film", schema="camera")
* @ORM\Entity
*/ */
class Film { #[ORM\Table(name: 'film', schema: 'camera')]
#[ORM\Entity]
class Film
{
#[ORM\Id]
#[ORM\Column(name: 'id', type: 'integer', nullable: FALSE)]
#[ORM\GeneratedValue(strategy: 'IDENTITY')]
private int $id;
/** #[ORM\Column(name: 'brand', type: 'string', nullable: FALSE)]
* @var integer private string $brand;
*
* @ORM\Id
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/** #[ORM\Column(name: 'product_line', type: 'string', nullable: TRUE)]
* @var string private ?string $productLine = NULL;
*
* @ORM\Column(name="brand", type="string", nullable=false)
*/
private $brand;
/** #[ORM\Column(name: 'film_name', type: 'string', nullable: FALSE)]
* @var string private string $filmName;
*
* @ORM\Column(name="product_line", type="string", nullable=true)
*/
private $productLine;
/** #[ORM\Column(name: 'film_alias', type: 'string', nullable: TRUE)]
* @var string private ?string $filmAlias = NULL;
*
* @ORM\Column(name="film_name", type="string", nullable=false)
*/
private $filmName;
/** #[ORM\Column(name: 'film_speed_asa', type: 'integer', nullable: FALSE)]
* @var string private int $filmSpeedAsa;
*
* @ORM\Column(name="film_alias", type="string", nullable=true)
*/
private $filmAlias;
/** #[ORM\Column(name: 'film_speed_din', type: 'integer', nullable: FALSE)]
* @var int private int $filmSpeedDin;
*
* @ORM\Column(name="film_speed_asa", type="integer", nullable=false)
*/
private $filmSpeedAsa;
/** #[ORM\Column(name: 'film_format', type: 'string', nullable: FALSE)]
* @var int private string $filmFormat;
*
* @ORM\Column(name="film_speed_din", type="integer", nullable=false)
*/
private $filmSpeedDin;
/** #[ORM\Column(name: 'film_base', type: 'string', nullable: FALSE, options: ['default' => 'Cellulose Triacetate'])]
* @var string private string $filmBase = 'Cellulose Triacetate';
*
* @ORM\Column(name="film_format", type="string", nullable=false)
*/
private $filmFormat;
/** #[ORM\Column(name: 'unused_rolls', type: 'integer', nullable: FALSE, options: ['default' => 0])]
* @var string private int $unusedRolls = 0;
*
* @ORM\Column(name="film_base", type="string", nullable=false, options={"default"="Cellulose Triacetate"})
*/
private $filmBase = 'Cellulose Triacetate';
/** #[ORM\Column(name: 'rolls_in_camera', type: 'integer', nullable: FALSE, options: ['default' => 0])]
* @var int private int $rollsInCamera = 0;
*
* @ORM\Column(name="unused_rolls", type="integer", nullable=false, options={"default"=0})
*/
private $unusedRolls = 0;
/** #[ORM\Column(name: 'developed_rolls', type: 'integer', nullable: FALSE, options: ['default' => 0])]
* @var int private int $developedRolls = 0;
*
* @ORM\Column(name="rolls_in_camera", type="integer", nullable=false, options={"default"=0})
*/
private $rollsInCamera = 0;
/** #[ORM\Column(name: 'chemistry', type: 'string', nullable: FALSE, options: ['default' => 'C-41'])]
* @var int private string $chemistry = 'C-41';
*
* @ORM\Column(name="developed_rolls", type="integer", nullable=false, options={"default"=0})
*/
private $developedRolls = 0;
/** #[ORM\Column(name: 'notes', type: 'text', nullable: TRUE)]
* @var string private ?string $notes = NULL;
*
* @ORM\Column(name="chemistry", type="string", nullable=false, options={"default"="C-41"})
*/
private $chemistry = 'C-41';
/** public function getId(): int
* @var string {
* return $this->id;
* @ORM\Column(name="notes", type="text", nullable=true) }
*/
private $notes;
/** /**
* @return int * @return string
*/ */
public function getId(): int public function getBrand(): ?string
{ {
return $this->id; return $this->brand;
} }
/** public function setBrand(string $brand): self
* @return string {
*/ $this->brand = $brand;
public function getBrand(): ?string
{
return $this->brand;
}
/** return $this;
* @param string $brand }
* @return self
*/
public function setBrand(string $brand): self
{
$this->brand = $brand;
return $this;
}
/** /**
* @return string * @return string
*/ */
public function getProductLine(): ?string public function getProductLine(): ?string
{ {
return $this->productLine; return $this->productLine;
} }
/** /**
* @param string $productLine * @param string $productLine
* @return self */
*/ public function setProductLine(?string $productLine): self
public function setProductLine(?string $productLine): self {
{ $this->productLine = $productLine;
$this->productLine = $productLine;
return $this;
}
/** return $this;
* @return string }
*/
public function getFilmName(): ?string
{
return $this->filmName;
}
/** /**
* @param string $filmName * @return string
* @return self */
*/ public function getFilmName(): ?string
public function setFilmName(string $filmName): self {
{ return $this->filmName;
$this->filmName = $filmName; }
return $this;
}
/** public function setFilmName(string $filmName): self
* @return string {
*/ $this->filmName = $filmName;
public function getFilmAlias(): ?string
{
return $this->filmAlias;
}
/** return $this;
* @param string $filmAlias }
* @return self
*/
public function setFilmAlias(string $filmAlias): self
{
$this->filmAlias = $filmAlias;
return $this;
}
/** /**
* @return int * @return string
*/ */
public function getFilmSpeedAsa(): ?int public function getFilmAlias(): ?string
{ {
return $this->filmSpeedAsa; return $this->filmAlias;
} }
/** public function setFilmAlias(string $filmAlias): self
* @param int $filmSpeedAsa {
* @return self $this->filmAlias = $filmAlias;
*/
public function setFilmSpeedAsa(int $filmSpeedAsa): self
{
$this->filmSpeedAsa = $filmSpeedAsa;
return $this;
}
/** return $this;
* @return int }
*/
public function getFilmSpeedDin(): ?int
{
return $this->filmSpeedDin;
}
/** /**
* @param int $filmSpeedDin * @return int
* @return self */
*/ public function getFilmSpeedAsa(): ?int
public function setFilmSpeedDin(int $filmSpeedDin): self {
{ return $this->filmSpeedAsa;
$this->filmSpeedDin = $filmSpeedDin; }
return $this;
}
/** public function setFilmSpeedAsa(int $filmSpeedAsa): self
* @return string {
*/ $this->filmSpeedAsa = $filmSpeedAsa;
public function getFilmFormat(): ?string
{
return $this->filmFormat;
}
/** return $this;
* @param string $filmFormat }
* @return self
*/
public function setFilmFormat(string $filmFormat): self
{
$this->filmFormat = $filmFormat;
return $this;
}
/** /**
* @return string * @return int
*/ */
public function getFilmBase(): ?string public function getFilmSpeedDin(): ?int
{ {
return $this->filmBase; return $this->filmSpeedDin;
} }
/** public function setFilmSpeedDin(int $filmSpeedDin): self
* @param string $filmBase {
* @return self $this->filmSpeedDin = $filmSpeedDin;
*/
public function setFilmBase(string $filmBase): self
{
$this->filmBase = $filmBase;
return $this;
}
/** return $this;
* @return int }
*/
public function getUnusedRolls(): ?int
{
return $this->unusedRolls;
}
/** /**
* @param int $unusedRolls * @return string
* @return self */
*/ public function getFilmFormat(): ?string
public function setUnusedRolls(int $unusedRolls): self {
{ return $this->filmFormat;
$this->unusedRolls = $unusedRolls; }
return $this;
}
/** public function setFilmFormat(string $filmFormat): self
* @return int {
*/ $this->filmFormat = $filmFormat;
public function getRollsInCamera(): ?int
{
return $this->rollsInCamera;
}
/** return $this;
* @param int $rollsInCamera }
* @return self
*/
public function setRollsInCamera(int $rollsInCamera): self
{
$this->rollsInCamera = $rollsInCamera;
return $this;
}
/** /**
* @return int * @return string
*/ */
public function getDevelopedRolls(): ?int public function getFilmBase(): ?string
{ {
return $this->developedRolls; return $this->filmBase;
} }
/** public function setFilmBase(string $filmBase): self
* @param int $developedRolls {
* @return self $this->filmBase = $filmBase;
*/
public function setDevelopedRolls(int $developedRolls): self
{
$this->developedRolls = $developedRolls;
return $this;
}
/** return $this;
* @return string }
*/
public function getChemistry(): ?string
{
return $this->chemistry;
}
/** /**
* @param string $chemistry * @return int
* @return self */
*/ public function getUnusedRolls(): ?int
public function setChemistry(string $chemistry): self {
{ return $this->unusedRolls;
$this->chemistry = $chemistry; }
return $this;
}
/** public function setUnusedRolls(int $unusedRolls): self
* @return string {
*/ $this->unusedRolls = $unusedRolls;
public function getNotes(): ?string
{
return $this->notes;
}
/** return $this;
* @param string $notes }
* @return self
*/ /**
public function setNotes(string $notes): self * @return int
{ */
$this->notes = $notes; public function getRollsInCamera(): ?int
return $this; {
} return $this->rollsInCamera;
}
public function setRollsInCamera(int $rollsInCamera): self
{
$this->rollsInCamera = $rollsInCamera;
return $this;
}
/**
* @return int
*/
public function getDevelopedRolls(): ?int
{
return $this->developedRolls;
}
public function setDevelopedRolls(int $developedRolls): self
{
$this->developedRolls = $developedRolls;
return $this;
}
/**
* @return string
*/
public function getChemistry(): ?string
{
return $this->chemistry;
}
public function setChemistry(string $chemistry): self
{
$this->chemistry = $chemistry;
return $this;
}
/**
* @return string
*/
public function getNotes(): ?string
{
return $this->notes;
}
public function setNotes(string $notes): self
{
$this->notes = $notes;
return $this;
}
} }

View File

@ -4,74 +4,56 @@ namespace App\Entity;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
/** #[ORM\Table(name: 'film_format', schema: 'camera')]
* @ORM\Table(name="film_format", schema="camera") #[ORM\Entity]
* @ORM\Entity
*/
class FilmFormat class FilmFormat
{ {
/** #[ORM\Id]
* @ORM\Id #[ORM\GeneratedValue]
* @ORM\GeneratedValue #[ORM\Column(type: 'integer')]
* @ORM\Column(type="integer") private int $id;
*/
private $id;
/** #[ORM\Column(name: 'number_id', type: 'integer')]
* @var int private int $numberId;
*
* @ORM\Column(name="number_id", type="integer")
*/
private $numberId;
/** #[ORM\Column(name: 'name', type: 'string')]
* @var string private string $name;
*
* @ORM\Column(name="name", type="string")
*/
private $name;
/** /**
* @return int * @return int
*/ */
public function getId(): ?int public function getId(): ?int
{ {
return $this->id; return $this->id;
} }
/** /**
* @return int * @return int
*/ */
public function getNumberId(): ?int public function getNumberId(): ?int
{ {
return $this->numberId; return $this->numberId;
} }
/** public function setNumberId(int $numberId): self
* @param int $numberId {
* @return self $this->numberId = $numberId;
*/
public function setNumberId(int $numberId): self
{
$this->numberId = $numberId;
return $this;
}
/** return $this;
* @return string }
*/
public function getName(): ?string
{
return $this->name;
}
/** /**
* @param string $name * @return string
* @return self */
*/ public function getName(): ?string
public function setName(string $name): self {
{ return $this->name;
$this->name = $name; }
return $this;
} public function setName(string $name): self
{
$this->name = $name;
return $this;
}
} }

View File

@ -6,36 +6,22 @@ use Doctrine\ORM\Mapping as ORM;
/** /**
* Camera.flash * Camera.flash
*
* @ORM\Table(name="flash", schema="camera")
* @ORM\Entity
*/ */
#[ORM\Table(name: 'flash', schema: 'camera')]
#[ORM\Entity]
class Flash class Flash
{ {
use FlashTrait; use FlashTrait;
/** #[ORM\Column(name: 'id', type: 'integer', nullable: FALSE)]
* @var integer #[ORM\Id]
* #[ORM\GeneratedValue(strategy: 'IDENTITY')]
* @ORM\Column(name="id", type="integer", nullable=false) #[ORM\SequenceGenerator(sequenceName: 'camera.flash_id_seq', allocationSize: 1, initialValue: 1)]
* @ORM\Id private int $id;
* @ORM\GeneratedValue(strategy="IDENTITY")
* @ORM\SequenceGenerator(sequenceName="camera.flash_id_seq", allocationSize=1, initialValue=1)
*/
private $id;
/** #[ORM\Column(name: 'received', type: 'boolean', nullable: FALSE, options: ['default' => FALSE])]
* @var boolean private bool $received = FALSE;
*
* @ORM\Column(name="received", type="boolean", nullable=false, options={"default" : false})
*/
private $received = false;
#[ORM\Column(name: 'formerly_owned', type: 'boolean', nullable: FALSE, options: ['default' => FALSE])]
/** private bool $formerlyOwned = FALSE;
* @var boolean
*
* @ORM\Column(name="formerly_owned", type="boolean", nullable=false, options={"default" : false})
*/
private $formerlyOwned = false;
} }

View File

@ -2,413 +2,353 @@
namespace App\Entity; namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
trait FlashTrait trait FlashTrait
{ {
use PurchasePriceTrait; use PurchasePriceTrait;
/** #[ORM\Column(name: 'brand', type: 'string', nullable: FALSE)]
* @var string private readonly string $brand;
*
* @ORM\Column(name="brand", type="string", nullable=false)
*/
private $brand;
/** #[ORM\Column(name: 'model', type: 'string', nullable: FALSE)]
* @var string private readonly string $model;
*
* @ORM\Column(name="model", type="string", nullable=false)
*/
private $model;
/** #[ORM\Column(name: 'is_auto_flash', type: 'boolean', nullable: FALSE)]
* @var boolean private bool $isAutoFlash = FALSE;
*
* @ORM\Column(name="is_auto_flash", type="boolean", nullable=false)
*/
private $isAutoFlash = false;
/** #[ORM\Column(name: 'is_ttl', type: 'boolean', nullable: FALSE)]
* @var boolean private bool $isTtl = FALSE;
*
* @ORM\Column(name="is_ttl", type="boolean", nullable=false)
*/
private $isTtl = false;
/** #[ORM\Column(name: 'ttl_type', type: 'string', nullable: FALSE)]
* @var string private string $ttlType = 'N / A';
*
* @ORM\Column(name="ttl_type", type="string", nullable=false)
*/
private $ttlType = 'N / A';
/** #[ORM\Column(name: 'is_p_ttl', type: 'boolean', nullable: FALSE)]
* @var boolean private bool $isPTtl = FALSE;
*
* @ORM\Column(name="is_p_ttl", type="boolean", nullable=false)
*/
private $isPTtl = false;
/** #[ORM\Column(name: 'p_ttl_type', type: 'string', nullable: FALSE)]
* @var string private string $pTtlType = 'N / A';
*
* @ORM\Column(name="p_ttl_type", type="string", nullable=false)
*/
private $pTtlType = 'N / A';
/** #[ORM\Column(name: 'guide_number', type: 'string', nullable: TRUE)]
* @var string private ?string $guideNumber = '';
*
* @ORM\Column(name="guide_number", type="string", nullable=true)
*/
private $guideNumber;
/** #[ORM\Column(name: 'batteries', type: 'string', nullable: FALSE)]
* @var string private string $batteries = '4x AA';
*
* @ORM\Column(name="purchase_price", type="money", nullable=true)
*/
private $purchasePrice;
/** #[ORM\Column(name: 'notes', type: 'text', nullable: TRUE)]
* @var string private readonly ?string $notes;
*
* @ORM\Column(name="batteries", type="string", nullable=false)
*/
private $batteries = '4x AA';
/** #[ORM\Column(name: 'serial', type: 'string', nullable: TRUE)]
* @var string private readonly ?string $serial;
*
* @ORM\Column(name="notes", type="text", nullable=true)
*/
private $notes;
/** public function getId(): int
* @var string {
* return $this->id;
* @ORM\Column(name="serial", type="string", nullable=true) }
*/
private $serial;
/** /**
* Get id * Set brand
* */
* @return integer public function setBrand(string $brand): self
*/ {
public function getId() $this->brand = $brand;
{
return $this->id;
}
/** return $this;
* Set brand }
*
* @param string $brand
*
* @return Flash
*/
public function setBrand($brand)
{
$this->brand = $brand;
return $this; /**
} * Get brand
*
* @return string
*/
public function getBrand()
{
return $this->brand;
}
/** /**
* Get brand * Set model
* *
* @return string * @param string $model
*/ *
public function getBrand() * @return Flash
{ */
return $this->brand; public function setModel($model)
} {
$this->model = $model;
/** return $this;
* Set model }
*
* @param string $model
*
* @return Flash
*/
public function setModel($model)
{
$this->model = $model;
return $this; /**
} * Get model
*
* @return string
*/
public function getModel()
{
return $this->model;
}
/** /**
* Get model * Set isAutoFlash
* *
* @return string * @param bool $isAutoFlash
*/ *
public function getModel() * @return Flash
{ */
return $this->model; public function setIsAutoFlash($isAutoFlash)
} {
$this->isAutoFlash = $isAutoFlash;
/** return $this;
* Set isAutoFlash }
*
* @param boolean $isAutoFlash
*
* @return Flash
*/
public function setIsAutoFlash($isAutoFlash)
{
$this->isAutoFlash = $isAutoFlash;
return $this; /**
} * Get isAutoFlash
*
* @return bool
*/
public function getIsAutoFlash()
{
return $this->isAutoFlash;
}
/** /**
* Get isAutoFlash * Set isTtl
* *
* @return boolean * @param bool $isTtl
*/ *
public function getIsAutoFlash() * @return Flash
{ */
return $this->isAutoFlash; public function setIsTtl($isTtl)
} {
$this->isTtl = $isTtl;
/** return $this;
* Set isTtl }
*
* @param boolean $isTtl
*
* @return Flash
*/
public function setIsTtl($isTtl)
{
$this->isTtl = $isTtl;
return $this; /**
} * Get isTtl
*
* @return bool
*/
public function getIsTtl()
{
return $this->isTtl;
}
/** /**
* Get isTtl * Set ttlType
* *
* @return boolean * @param string $ttlType
*/ *
public function getIsTtl() * @return Flash
{ */
return $this->isTtl; public function setTtlType($ttlType)
} {
$this->ttlType = $ttlType;
/** return $this;
* Set ttlType }
*
* @param string $ttlType
*
* @return Flash
*/
public function setTtlType($ttlType)
{
$this->ttlType = $ttlType;
return $this; /**
} * Get ttlType
*
* @return string
*/
public function getTtlType()
{
return $this->ttlType;
}
/** /**
* Get ttlType * Set isPTtl
* *
* @return string * @param bool $isPTtl
*/ *
public function getTtlType() * @return Flash
{ */
return $this->ttlType; public function setIsPTtl($isPTtl)
} {
$this->isPTtl = $isPTtl;
/** return $this;
* Set isPTtl }
*
* @param boolean $isPTtl
*
* @return Flash
*/
public function setIsPTtl($isPTtl)
{
$this->isPTtl = $isPTtl;
return $this; /**
} * Get isPTtl
*
* @return bool
*/
public function getIsPTtl()
{
return $this->isPTtl;
}
/** /**
* Get isPTtl * Set pTtlType
* *
* @return boolean * @param string $pTtlType
*/ */
public function getIsPTtl() public function setPTtlType($pTtlType): self
{ {
return $this->isPTtl; $this->pTtlType = $pTtlType;
}
/** return $this;
* Set pTtlType }
*
* @param string $pTtlType
*
* @return Flash
*/
public function setPTtlType($pTtlType)
{
$this->pTtlType = $pTtlType;
return $this; /**
} * Get pTtlType
*
* @return string
*/
public function getPTtlType()
{
return $this->pTtlType;
}
/** /**
* Get pTtlType * Set guideNumber
* *
* @return string * @param string $guideNumber
*/ *
public function getPTtlType() * @return self
{ */
return $this->pTtlType; public function setGuideNumber($guideNumber)
} {
$this->guideNumber = $guideNumber;
/** return $this;
* Set guideNumber }
*
* @param string $guideNumber
*
* @return Flash
*/
public function setGuideNumber($guideNumber)
{
$this->guideNumber = $guideNumber;
return $this; /**
} * Get guideNumber
*
* @return string
*/
public function getGuideNumber()
{
return $this->guideNumber;
}
/** /**
* Get guideNumber * Set batteries
* *
* @return string * @param string $batteries
*/ *
public function getGuideNumber() * @return Flash
{ */
return $this->guideNumber; public function setBatteries($batteries): self
} {
$this->batteries = $batteries;
/** return $this;
* Set batteries }
*
* @param string $batteries
*
* @return Flash
*/
public function setBatteries($batteries)
{
$this->batteries = $batteries;
return $this; /**
} * Get batteries
*
* @return string
*/
public function getBatteries()
{
return $this->batteries;
}
/** /**
* Get batteries * Set notes
* *
* @return string * @param string $notes
*/ *
public function getBatteries() * @return Flash
{ */
return $this->batteries; public function setNotes($notes): self
} {
$this->notes = $notes;
/** return $this;
* Set notes }
*
* @param string $notes
*
* @return Flash
*/
public function setNotes($notes)
{
$this->notes = $notes;
return $this; /**
} * Get notes
*
* @return string
*/
public function getNotes()
{
return $this->notes;
}
/** /**
* Get notes * Set serial
* *
* @return string * @param string $serial
*/ *
public function getNotes() * @return Flash
{ */
return $this->notes; public function setSerial($serial): self
} {
$this->serial = $serial;
/** return $this;
* Set serial }
*
* @param string $serial
*
* @return Flash
*/
public function setSerial($serial)
{
$this->serial = $serial;
return $this; /**
} * Get serial
*
* @return string
*/
public function getSerial()
{
return $this->serial;
}
/** /**
* Get serial * Set formerlyOwned
* *
* @return string * @param bool $formerlyOwned
*/ *
public function getSerial() * @return Flash
{ */
return $this->serial; public function setFormerlyOwned($formerlyOwned): self
} {
$this->formerlyOwned = $formerlyOwned;
/** return $this;
* Set formerlyOwned }
*
* @param boolean $formerlyOwned
*
* @return Flash
*/
public function setFormerlyOwned($formerlyOwned)
{
$this->formerlyOwned = $formerlyOwned;
return $this; /**
} * Get formerlyOwned
*
* @return bool
*/
public function getFormerlyOwned()
{
return $this->formerlyOwned;
}
/** /**
* Get formerlyOwned * Set received
* *
* @return boolean * @param bool $received
*/ *
public function getFormerlyOwned() * @return Flash
{ */
return $this->formerlyOwned; public function setReceived($received): self
} {
$this->received = $received;
/** return $this;
* Set received }
*
* @param boolean $received
*
* @return Flash
*/
public function setReceived($received)
{
$this->received = $received;
return $this; /**
} * Get received
*
/** * @return bool
* Get received */
* public function getReceived()
* @return boolean {
*/ return $this->received;
public function getReceived() }
{
return $this->received;
}
} }

File diff suppressed because it is too large Load Diff

View File

@ -2,39 +2,27 @@
namespace App\Entity; namespace App\Entity;
use App\Repository\LensesRepository;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
/** /**
* Camera.lenses * Camera.lenses
*
* @ORM\Table(name="lenses", schema="camera")
* @ORM\Entity(repositoryClass="App\Repository\LensesRepository")
*/ */
#[ORM\Table(name: 'lenses', schema: 'camera')]
#[ORM\Entity(repositoryClass: LensesRepository::class)]
class Lenses class Lenses
{ {
use LensTrait; use LensTrait;
/** #[ORM\Column(name: 'id', type: 'integer', nullable: FALSE)]
* @var integer #[ORM\Id]
* #[ORM\GeneratedValue(strategy: 'IDENTITY')]
* @ORM\Column(name="id", type="integer", nullable=false) #[ORM\SequenceGenerator(sequenceName: 'camera.lenses_id_seq', allocationSize: 1, initialValue: 1)]
* @ORM\Id private int $id;
* @ORM\GeneratedValue(strategy="IDENTITY")
* @ORM\SequenceGenerator(sequenceName="camera.lenses_id_seq", allocationSize=1, initialValue=1)
*/
private $id;
/** #[ORM\Column(name: 'received', type: 'boolean', nullable: FALSE)]
* @var boolean private bool $received = FALSE;
*
* @ORM\Column(name="received", type="boolean", nullable=false)
*/
private $received = false;
/** #[ORM\Column(name: 'formerly_owned', type: 'boolean', nullable: FALSE)]
* @var boolean private bool $formerlyOwned = FALSE;
*
* @ORM\Column(name="formerly_owned", type="boolean", nullable=false)
*/
private $formerlyOwned = false;
} }

View File

@ -2,25 +2,22 @@
namespace App\Entity; namespace App\Entity;
use App\Repository\CameraRepository;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
/** /**
* Camera.previouslyOwnedCamera * Camera.previouslyOwnedCamera
*
* @ORM\Table(name="previously_owned_camera", schema="camera", indexes={@ORM\Index(name="IDX_6EF94C6BC54C8C93", columns={"type_id"})})
* @ORM\Entity(repositoryClass="App\Repository\CameraRepository")
*/ */
#[ORM\Table(name: 'previously_owned_camera', schema: 'camera')]
#[ORM\Index(name: 'IDX_6EF94C6BC54C8C93', columns: ['type_id'])]
#[ORM\Entity(repositoryClass: CameraRepository::class)]
class PreviouslyOwnedCamera class PreviouslyOwnedCamera
{ {
use CameraTrait; use CameraTrait;
/** #[ORM\Column(name: 'id', type: 'integer', nullable: FALSE)]
* @var integer #[ORM\Id]
* #[ORM\GeneratedValue(strategy: 'IDENTITY')]
* @ORM\Column(name="id", type="integer", nullable=false) #[ORM\SequenceGenerator(sequenceName: 'prevously_owned_camera_id_seq', allocationSize: 1, initialValue: 1)]
* @ORM\Id private int $id;
* @ORM\GeneratedValue(strategy="IDENTITY")
* @ORM\SequenceGenerator(sequenceName="prevously_owned_camera_id_seq", allocationSize=1, initialValue=1)
*/
private $id;
} }

View File

@ -6,35 +6,21 @@ use Doctrine\ORM\Mapping as ORM;
/** /**
* Camera.flash * Camera.flash
*
* @ORM\Table(name="previously_owned_flash", schema="camera")
* @ORM\Entity
*/ */
#[ORM\Table(name: 'previously_owned_flash', schema: 'camera')]
#[ORM\Entity]
class PreviouslyOwnedFlash class PreviouslyOwnedFlash
{ {
use FlashTrait; use FlashTrait;
/** #[ORM\Column(name: 'id', type: 'integer', nullable: FALSE)]
* @var integer #[ORM\Id]
* #[ORM\GeneratedValue(strategy: 'IDENTITY')]
* @ORM\Column(name="id", type="integer", nullable=false) private int $id;
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/** #[ORM\Column(name: 'received', type: 'boolean', nullable: FALSE, options: ['default' => TRUE])]
* @var boolean private bool $received = TRUE;
*
* @ORM\Column(name="received", type="boolean", nullable=false, options={"default" : true})
*/
private $received = true;
#[ORM\Column(name: 'formerly_owned', type: 'boolean', nullable: FALSE, options: ['default' => TRUE])]
/** private bool $formerlyOwned = TRUE;
* @var boolean
*
* @ORM\Column(name="formerly_owned", type="boolean", nullable=false, options={"default" : true})
*/
private $formerlyOwned = true;
} }

View File

@ -2,37 +2,26 @@
namespace App\Entity; namespace App\Entity;
use App\Repository\LensesRepository;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
/** /**
* Camera.previouslyOwnedLenses * Camera.previouslyOwnedLenses
*
* @ORM\Table(name="previously_owned_lenses", schema="camera")
* @ORM\Entity(repositoryClass="App\Repository\LensesRepository")
*/ */
#[ORM\Table(name: 'previously_owned_lenses', schema: 'camera')]
#[ORM\Entity(repositoryClass: LensesRepository::class)]
class PreviouslyOwnedLenses class PreviouslyOwnedLenses
{ {
use LensTrait; use LensTrait;
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/** #[ORM\Column(name: 'id', type: 'integer', nullable: FALSE)]
* @var boolean #[ORM\Id]
* #[ORM\GeneratedValue(strategy: 'IDENTITY')]
* @ORM\Column(name="received", type="boolean", nullable=false) private int $id;
*/
private $received = true;
/** #[ORM\Column(name: 'received', type: 'boolean', nullable: FALSE)]
* @var boolean private bool $received = TRUE;
*
* @ORM\Column(name="formerly_owned", type="boolean", nullable=false) #[ORM\Column(name: 'formerly_owned', type: 'boolean', nullable: FALSE)]
*/ private bool $formerlyOwned = TRUE;
private $formerlyOwned = true;
} }

View File

@ -2,33 +2,26 @@
namespace App\Entity; namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
trait PurchasePriceTrait trait PurchasePriceTrait
{ {
/** #[ORM\Column(name: 'purchase_price', type: 'money', nullable: TRUE)]
* Set purchasePrice private ?string $purchasePrice = NULL;
*
* @param string $purchasePrice
*
* @return self
*/
public function setPurchasePrice($purchasePrice): self
{
$this->purchasePrice = $purchasePrice;
return $this; public function setPurchasePrice(?string $purchasePrice): self
} {
$this->purchasePrice = $purchasePrice;
/** return $this;
* Get purchasePrice }
*
* @return string
*/
public function getPurchasePrice()
{
if (empty($this->purchasePrice)) {
return 0;
}
return $this->purchasePrice; public function getPurchasePrice(): string
} {
if (empty($this->purchasePrice)) {
return '0';
}
return $this->purchasePrice;
}
} }

View File

@ -2,68 +2,67 @@
namespace App\Form; namespace App\Form;
use Symfony\Component\Form\{
AbstractType, FormBuilderInterface
};
use Symfony\Component\Form\Extension\Core\Type\{ChoiceType, MoneyType};
use Symfony\Component\OptionsResolver\Exception\AccessException;
use Symfony\Component\OptionsResolver\OptionsResolver;
use App\Entity\Camera; use App\Entity\Camera;
use Symfony\Component\Form\Extension\Core\Type\{ChoiceType, MoneyType};
use Symfony\Component\Form\{AbstractType, FormBuilderInterface};
use Symfony\Component\OptionsResolver\Exception\AccessException;
use Symfony\Component\OptionsResolver\OptionsResolver;
class CameraType extends AbstractType class CameraType extends AbstractType
{ {
/** /**
* {@inheritdoc} * {@inheritDoc}
*/ */
public function buildForm(FormBuilderInterface $builder, array $options): void public function buildForm(FormBuilderInterface $builder, array $options): void
{ {
$builder->add('brand') $builder->add('brand')
->add('type') ->add('type')
->add('isDigital') ->add('isDigital')
->add('mount') ->add('mount')
->add('model') ->add('model')
->add('filmFormat', ChoiceType::class, [ ->add('filmFormat', ChoiceType::class, [
'choices' => [ 'choices' => [
'Small Format' => [ 'Small Format' => [
'35mm' => '135', '35mm' => '135',
'110' => '110', '110' => '110',
], ],
'Medium Format' => [ 'Medium Format' => [
'120' => '120', '120' => '120',
'127' => '127', '127' => '127',
'620' => '620', '620' => '620',
], ],
] ],
]) ])
->add('cropFactor') ->add('cropFactor')
->add('serial') ->add('serial')
->add('purchasePrice', MoneyType::class, [ ->add('purchasePrice', MoneyType::class, [
'currency' => 'USD', 'currency' => 'USD',
]) ])
->add('batteryType') ->add('batteryType')
->add('received') ->add('received')
->add('isWorking') ->add('isWorking')
->add('formerlyOwned') ->add('formerlyOwned')
->add('notes'); ->add('notes');
} }
/** /**
* {@inheritdoc} * {@inheritDoc}
* @throws AccessException *
*/ * @throws AccessException
public function configureOptions(OptionsResolver $resolver): void */
{ public function configureOptions(OptionsResolver $resolver): void
$resolver->setDefaults(array( {
'data_class' => Camera::class $resolver->setDefaults([
)); 'data_class' => Camera::class,
} ]);
}
/** /**
* {@inheritdoc} * {@inheritDoc}
*/ */
public function getBlockPrefix(): string public function getBlockPrefix(): string
{ {
return 'camerabundle_camera'; return 'camerabundle_camera';
} }
} }

View File

@ -2,41 +2,40 @@
namespace App\Form; namespace App\Form;
use Symfony\Component\Form\{ use App\Entity\CameraType;
AbstractType, FormBuilderInterface use Symfony\Component\Form\{AbstractType, FormBuilderInterface};
};
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\OptionsResolver\Exception\AccessException; use Symfony\Component\OptionsResolver\Exception\AccessException;
use App\Entity\CameraType; use Symfony\Component\OptionsResolver\OptionsResolver;
class CameraTypeType extends AbstractType class CameraTypeType extends AbstractType
{ {
/** /**
* {@inheritdoc} * {@inheritDoc}
*/ */
public function buildForm(FormBuilderInterface $builder, array $options): void public function buildForm(FormBuilderInterface $builder, array $options): void
{ {
$builder->add('type') $builder->add('type')
->add('description'); ->add('description');
} }
/** /**
* {@inheritdoc} * {@inheritDoc}
* @throws AccessException *
*/ * @throws AccessException
public function configureOptions(OptionsResolver $resolver): void */
{ public function configureOptions(OptionsResolver $resolver): void
$resolver->setDefaults(array( {
'data_class' => CameraType::class $resolver->setDefaults([
)); 'data_class' => CameraType::class,
} ]);
}
/** /**
* {@inheritdoc} * {@inheritDoc}
*/ */
public function getBlockPrefix(): string public function getBlockPrefix(): string
{ {
return 'camerabundle_cameratype'; return 'camerabundle_cameratype';
} }
} }

View File

@ -3,73 +3,72 @@
namespace App\Form; namespace App\Form;
use App\Entity\Film; use App\Entity\Film;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\{AbstractType, FormBuilderInterface};
use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\OptionsResolver\OptionsResolver;
class FilmType extends AbstractType class FilmType extends AbstractType
{ {
/** /**
* {@inheritdoc} * {@inheritDoc}
*/ */
public function buildForm(FormBuilderInterface $builder, array $options): void public function buildForm(FormBuilderInterface $builder, array $options): void
{ {
$builder->add('brand') $builder->add('brand')
->add('productLine') ->add('productLine')
->add('filmName') ->add('filmName')
->add('filmAlias') ->add('filmAlias')
->add('filmSpeedAsa') ->add('filmSpeedAsa')
->add('filmSpeedDin') ->add('filmSpeedDin')
->add('filmFormat', ChoiceType::class, [ ->add('filmFormat', ChoiceType::class, [
'choices' => [ 'choices' => [
'Small Format' => [ 'Small Format' => [
'35mm' => '135', '35mm' => '135',
'110' => '110', '110' => '110',
], ],
'Medium Format' => [ 'Medium Format' => [
'120' => '120', '120' => '120',
'127' => '127', '127' => '127',
'620' => '620', '620' => '620',
], ],
] ],
]) ])
->add('filmBase',ChoiceType::class, [ ->add('filmBase', ChoiceType::class, [
'choices' => [ 'choices' => [
'Cellulose Triacetate' => 'Cellulose Triacetate', 'Cellulose Triacetate' => 'Cellulose Triacetate',
'Polyester' => 'Polyester', 'Polyester' => 'Polyester',
'Polyethylene Naphtalate' => 'Polyethylene Naphtalate', 'Polyethylene Naphtalate' => 'Polyethylene Naphtalate',
] ],
]) ])
->add('unusedRolls') ->add('unusedRolls')
->add('rollsInCamera') ->add('rollsInCamera')
->add('developedRolls') ->add('developedRolls')
->add('chemistry', ChoiceType::class, [ ->add('chemistry', ChoiceType::class, [
'choices' => [ 'choices' => [
'B & W' => 'B & W', 'B & W' => 'B & W',
'C-41' => 'C-41', 'C-41' => 'C-41',
'E-6' => 'E-6', 'E-6' => 'E-6',
'Other' => 'Other', 'Other' => 'Other',
] ],
]) ])
->add('notes'); ->add('notes');
} }
/** /**
* {@inheritdoc} * {@inheritDoc}
*/ */
public function configureOptions(OptionsResolver $resolver): void public function configureOptions(OptionsResolver $resolver): void
{ {
$resolver->setDefaults(array( $resolver->setDefaults([
'data_class' => Film::class 'data_class' => Film::class,
)); ]);
} }
/** /**
* {@inheritdoc} * {@inheritDoc}
*/ */
public function getBlockPrefix(): string public function getBlockPrefix(): string
{ {
return 'camerabundle_film'; return 'camerabundle_film';
} }
} }

View File

@ -2,53 +2,52 @@
namespace App\Form; namespace App\Form;
use Symfony\Component\Form\{
AbstractType, FormBuilderInterface
};
use Symfony\Component\OptionsResolver\Exception\AccessException;
use Symfony\Component\OptionsResolver\OptionsResolver;
use App\Entity\Flash; use App\Entity\Flash;
use Symfony\Component\Form\{AbstractType, FormBuilderInterface};
use Symfony\Component\OptionsResolver\Exception\AccessException;
use Symfony\Component\OptionsResolver\OptionsResolver;
class FlashType extends AbstractType class FlashType extends AbstractType
{ {
/** /**
* {@inheritdoc} * {@inheritDoc}
*/ */
public function buildForm(FormBuilderInterface $builder, array $options): void public function buildForm(FormBuilderInterface $builder, array $options): void
{ {
$builder->add('brand') $builder->add('brand')
->add('model') ->add('model')
->add('isAutoFlash') ->add('isAutoFlash')
->add('isTtl') ->add('isTtl')
->add('ttlType') ->add('ttlType')
->add('isPTtl') ->add('isPTtl')
->add('pTtlType') ->add('pTtlType')
->add('guideNumber') ->add('guideNumber')
->add('purchasePrice') ->add('purchasePrice')
->add('batteries') ->add('batteries')
->add('notes') ->add('notes')
->add('serial') ->add('serial')
->add('received') ->add('received')
->add('formerlyOwned'); ->add('formerlyOwned');
} }
/** /**
* {@inheritdoc} * {@inheritDoc}
* @throws AccessException *
*/ * @throws AccessException
public function configureOptions(OptionsResolver $resolver): void */
{ public function configureOptions(OptionsResolver $resolver): void
$resolver->setDefaults(array( {
'data_class' => Flash::class $resolver->setDefaults([
)); 'data_class' => Flash::class,
} ]);
}
/** /**
* {@inheritdoc} * {@inheritDoc}
*/ */
public function getBlockPrefix(): string public function getBlockPrefix(): string
{ {
return 'camerabundle_flash'; return 'camerabundle_flash';
} }
} }

View File

@ -2,73 +2,73 @@
namespace App\Form; namespace App\Form;
use Symfony\Component\Form\{
AbstractType, Extension\Core\Type\ChoiceType, FormBuilderInterface
};
use Symfony\Component\OptionsResolver\Exception\AccessException;
use Symfony\Component\OptionsResolver\OptionsResolver;
use App\Entity\Lenses; use App\Entity\Lenses;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\{AbstractType, FormBuilderInterface};
use Symfony\Component\OptionsResolver\Exception\AccessException;
use Symfony\Component\OptionsResolver\OptionsResolver;
class LensesType extends AbstractType class LensesType extends AbstractType
{ {
/** /**
* {@inheritdoc} * {@inheritDoc}
*/ */
public function buildForm(FormBuilderInterface $builder, array $options): void public function buildForm(FormBuilderInterface $builder, array $options): void
{ {
$builder->add('brand') $builder->add('brand')
->add('coatings') ->add('coatings')
->add('productLine') ->add('productLine')
->add('model') ->add('model')
->add('mount') ->add('mount')
->add('imageSize', ChoiceType::class, [ ->add('imageSize', ChoiceType::class, [
'choices' => [ 'choices' => [
'Small Format' => [ 'Small Format' => [
'35mm' => '35mm', '35mm' => '35mm',
'APS-C' => 'APS-C', 'APS-C' => 'APS-C',
'Micro 4/3' => 'Micro 4/3', 'Micro 4/3' => 'Micro 4/3',
], ],
'Medium Format' => [ 'Medium Format' => [
'6x6' => '6x6cm', '6x6' => '6x6cm',
'6x4.5' => '6x4.5cm', '6x4.5' => '6x4.5cm',
'4x4' => '4x4cm', '4x4' => '4x4cm',
] ],
] ],
]) ])
->add('minFStop') ->add('minFStop')
->add('maxFStop') ->add('maxFStop')
->add('minFocalLength') ->add('minFocalLength')
->add('maxFocalLength') ->add('maxFocalLength')
->add('serial') ->add('serial')
->add('purchasePrice') ->add('purchasePrice')
->add('notes') ->add('notes')
->add('received') ->add('received')
->add('formerlyOwned') ->add('formerlyOwned')
->add('frontFilterSize') ->add('frontFilterSize')
->add('rearFilterSize') ->add('rearFilterSize')
->add('isTeleconverter') ->add('isTeleconverter')
->add('designElements') ->add('designElements')
->add('designGroups') ->add('designGroups')
->add('apertureBlades'); ->add('apertureBlades');
} }
/** /**
* {@inheritdoc} * {@inheritDoc}
* @throws AccessException *
*/ * @throws AccessException
public function configureOptions(OptionsResolver $resolver): void */
{ public function configureOptions(OptionsResolver $resolver): void
$resolver->setDefaults(array( {
'data_class' => Lenses::class $resolver->setDefaults([
)); 'data_class' => Lenses::class,
} ]);
}
/** /**
* {@inheritdoc} * {@inheritDoc}
*/ */
public function getBlockPrefix(): string public function getBlockPrefix(): string
{ {
return 'camerabundle_lenses'; return 'camerabundle_lenses';
} }
} }

View File

@ -2,51 +2,52 @@
namespace App\Form; namespace App\Form;
use App\Entity\PreviouslyOwnedCamera;
use Symfony\Component\Form\{AbstractType, FormBuilderInterface}; use Symfony\Component\Form\{AbstractType, FormBuilderInterface};
use Symfony\Component\OptionsResolver\Exception\AccessException; use Symfony\Component\OptionsResolver\Exception\AccessException;
use Symfony\Component\OptionsResolver\OptionsResolver;
use App\Entity\PreviouslyOwnedCamera; use Symfony\Component\OptionsResolver\OptionsResolver;
class PreviouslyOwnedCameraType extends AbstractType class PreviouslyOwnedCameraType extends AbstractType
{ {
/** /**
* {@inheritdoc} * {@inheritDoc}
*/ */
public function buildForm(FormBuilderInterface $builder, array $options): void public function buildForm(FormBuilderInterface $builder, array $options): void
{ {
$builder->add('brand') $builder->add('brand')
->add('mount') ->add('mount')
->add('model') ->add('model')
->add('isDigital') ->add('isDigital')
->add('cropFactor') ->add('cropFactor')
->add('isWorking') ->add('isWorking')
->add('notes') ->add('notes')
->add('serial') ->add('serial')
->add('formerlyOwned') ->add('formerlyOwned')
->add('purchasePrice') ->add('purchasePrice')
->add('batteryType') ->add('batteryType')
->add('filmFormat') ->add('filmFormat')
->add('received') ->add('received')
->add('type'); ->add('type');
} }
/** /**
* {@inheritdoc} * {@inheritDoc}
* @throws AccessException *
*/ * @throws AccessException
public function configureOptions(OptionsResolver $resolver): void */
{ public function configureOptions(OptionsResolver $resolver): void
$resolver->setDefaults(array( {
'data_class' => PreviouslyOwnedCamera::class $resolver->setDefaults([
)); 'data_class' => PreviouslyOwnedCamera::class,
} ]);
}
/** /**
* {@inheritdoc} * {@inheritDoc}
*/ */
public function getBlockPrefix(): string public function getBlockPrefix(): string
{ {
return 'camerabundle_previouslyownedcamera'; return 'camerabundle_previouslyownedcamera';
} }
} }

View File

@ -2,52 +2,53 @@
namespace App\Form; namespace App\Form;
use App\Entity\PreviouslyOwnedFlash;
use Symfony\Component\Form\{AbstractType, FormBuilderInterface}; use Symfony\Component\Form\{AbstractType, FormBuilderInterface};
use Symfony\Component\OptionsResolver\Exception\AccessException; use Symfony\Component\OptionsResolver\Exception\AccessException;
use Symfony\Component\OptionsResolver\OptionsResolver;
use App\Entity\PreviouslyOwnedFlash; use Symfony\Component\OptionsResolver\OptionsResolver;
class PreviouslyOwnedFlashType extends AbstractType class PreviouslyOwnedFlashType extends AbstractType
{ {
/** /**
* {@inheritdoc} * {@inheritDoc}
*/ */
public function buildForm(FormBuilderInterface $builder, array $options): void public function buildForm(FormBuilderInterface $builder, array $options): void
{ {
$builder $builder
->add('brand') ->add('brand')
->add('model') ->add('model')
->add('isAutoFlash') ->add('isAutoFlash')
->add('isTtl') ->add('isTtl')
->add('ttlType') ->add('ttlType')
->add('isPTtl') ->add('isPTtl')
->add('pTtlType') ->add('pTtlType')
->add('guideNumber') ->add('guideNumber')
->add('purchasePrice') ->add('purchasePrice')
->add('batteries') ->add('batteries')
->add('notes') ->add('notes')
->add('serial') ->add('serial')
->add('received') ->add('received')
->add('formerlyOwned'); ->add('formerlyOwned');
} }
/** /**
* {@inheritdoc} * {@inheritDoc}
* @throws AccessException *
*/ * @throws AccessException
public function configureOptions(OptionsResolver $resolver): void */
{ public function configureOptions(OptionsResolver $resolver): void
$resolver->setDefaults(array( {
'data_class' => PreviouslyOwnedFlash::class $resolver->setDefaults([
)); 'data_class' => PreviouslyOwnedFlash::class,
} ]);
}
/** /**
* {@inheritdoc} * {@inheritDoc}
*/ */
public function getBlockPrefix(): string public function getBlockPrefix(): string
{ {
return 'camerabundle_previouslyownedflash'; return 'camerabundle_previouslyownedflash';
} }
} }

View File

@ -2,58 +2,59 @@
namespace App\Form; namespace App\Form;
use App\Entity\PreviouslyOwnedLenses;
use Symfony\Component\Form\{AbstractType, FormBuilderInterface}; use Symfony\Component\Form\{AbstractType, FormBuilderInterface};
use Symfony\Component\OptionsResolver\Exception\AccessException; use Symfony\Component\OptionsResolver\Exception\AccessException;
use Symfony\Component\OptionsResolver\OptionsResolver;
use App\Entity\PreviouslyOwnedLenses; use Symfony\Component\OptionsResolver\OptionsResolver;
class PreviouslyOwnedLensesType extends AbstractType class PreviouslyOwnedLensesType extends AbstractType
{ {
/** /**
* {@inheritdoc} * {@inheritDoc}
*/ */
public function buildForm(FormBuilderInterface $builder, array $options): void public function buildForm(FormBuilderInterface $builder, array $options): void
{ {
$builder->add('brand') $builder->add('brand')
->add('coatings') ->add('coatings')
->add('productLine') ->add('productLine')
->add('model') ->add('model')
->add('minFStop') ->add('minFStop')
->add('maxFStop') ->add('maxFStop')
->add('minFocalLength') ->add('minFocalLength')
->add('maxFocalLength') ->add('maxFocalLength')
->add('serial') ->add('serial')
->add('purchasePrice') ->add('purchasePrice')
->add('notes') ->add('notes')
->add('mount') ->add('mount')
->add('imageSize') ->add('imageSize')
->add('received') ->add('received')
->add('formerlyOwned') ->add('formerlyOwned')
->add('frontFilterSize') ->add('frontFilterSize')
->add('rearFilterSize') ->add('rearFilterSize')
->add('isTeleconverter') ->add('isTeleconverter')
->add('designElements') ->add('designElements')
->add('designGroups') ->add('designGroups')
->add('apertureBlades'); ->add('apertureBlades');
} }
/** /**
* {@inheritdoc} * {@inheritDoc}
* @throws AccessException *
*/ * @throws AccessException
public function configureOptions(OptionsResolver $resolver): void */
{ public function configureOptions(OptionsResolver $resolver): void
$resolver->setDefaults(array( {
'data_class' => PreviouslyOwnedLenses::class $resolver->setDefaults([
)); 'data_class' => PreviouslyOwnedLenses::class,
} ]);
}
/** /**
* {@inheritdoc} * {@inheritDoc}
*/ */
public function getBlockPrefix(): string public function getBlockPrefix(): string
{ {
return 'camerabundle_previouslyownedlenses'; return 'camerabundle_previouslyownedlenses';
} }
} }

View File

@ -18,20 +18,20 @@ use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
class Kernel extends BaseKernel class Kernel extends BaseKernel
{ {
use MicroKernelTrait; use MicroKernelTrait;
protected function configureContainer(ContainerConfigurator $container): void protected function configureContainer(ContainerConfigurator $container): void
{ {
$container->import('../config/{packages}/*.yaml'); $container->import('../config/{packages}/*.yaml');
$container->import('../config/{packages}/'.$this->environment.'/*.yaml'); $container->import('../config/{packages}/' . $this->environment . '/*.yaml');
$container->import('../config/{services}.yaml'); $container->import('../config/{services}.yaml');
$container->import('../config/{services}_'.$this->environment.'.yaml'); $container->import('../config/{services}_' . $this->environment . '.yaml');
} }
protected function configureRoutes(RoutingConfigurator $routes): void protected function configureRoutes(RoutingConfigurator $routes): void
{ {
$routes->import('../config/{routes}/'.$this->environment.'/*.yaml'); $routes->import('../config/{routes}/' . $this->environment . '/*.yaml');
$routes->import('../config/{routes}/*.yaml'); $routes->import('../config/{routes}/*.yaml');
$routes->import('../config/{routes}.yaml'); $routes->import('../config/{routes}.yaml');
} }
} }

View File

@ -2,41 +2,41 @@
namespace App\Repository; namespace App\Repository;
trait AcquireTrait { use ReflectionObject;
use Throwable;
/** trait AcquireTrait
* Move a record from the table represented by $currentRecord {
* into the table represented by $newRecord /**
* * Move a record from the table represented by $currentRecord
* @param mixed $currentRecord * into the table represented by $newRecord
* @param mixed $newRecord *
*/ * @param mixed $currentRecord
protected function moveRecord($currentRecord, $newRecord): void * @param mixed $newRecord
{ */
$em = $this->getEntityManager(); protected function moveRecord($currentRecord, $newRecord): void
{
$em = $this->getEntityManager();
$old = new \ReflectionObject($currentRecord); $old = new ReflectionObject($currentRecord);
$new = new \ReflectionObject($newRecord); $new = new ReflectionObject($newRecord);
foreach ($old->getProperties() as $property) { foreach ($old->getProperties() as $property) {
$propertyName = $property->getName(); $propertyName = $property->getName();
if ($new->hasProperty($propertyName)) { if ($new->hasProperty($propertyName)) {
$newProperty = $new->getProperty($propertyName); $newProperty = $new->getProperty($propertyName);
$newProperty->setAccessible(true); $newProperty->setAccessible(TRUE);
$property->setAccessible(true); $property->setAccessible(TRUE);
$newProperty->setValue($newRecord, $property->getValue($currentRecord)); $newProperty->setValue($newRecord, $property->getValue($currentRecord));
} }
} }
try try {
{ $em->persist($newRecord);
$em->persist($newRecord); $em->remove($currentRecord);
$em->remove($currentRecord); $em->flush();
$em->flush(); } catch (Throwable) {
} dump($newRecord);
catch (\Throwable $e) }
{ }
dump($newRecord);
}
}
} }

View File

@ -3,34 +3,30 @@
namespace App\Repository; namespace App\Repository;
use App\Entity\{Camera, PreviouslyOwnedCamera}; use App\Entity\{Camera, PreviouslyOwnedCamera};
use Doctrine\ORM\{ use Doctrine\ORM\{EntityRepository, ORMInvalidArgumentException};
EntityRepository, ORMInvalidArgumentException
};
class CameraRepository extends EntityRepository { class CameraRepository extends EntityRepository
{
use AcquireTrait;
use AcquireTrait; /**
* @throws ORMInvalidArgumentException
*/
public function deacquire(Camera $currentRecord): void
{
$currentRecord->setFormerlyOwned(TRUE)
->setReceived(TRUE);
/** $this->moveRecord($currentRecord, new PreviouslyOwnedCamera());
* @param Camera $currentRecord }
* @throws ORMInvalidArgumentException
*/
public function deacquire(Camera $currentRecord): void
{
$currentRecord->setFormerlyOwned(true)
->setReceived(true);
$this->moveRecord($currentRecord, new PreviouslyOwnedCamera()); /**
} * @throws ORMInvalidArgumentException
*/
public function reacquire(PreviouslyOwnedCamera $currentRecord): void
{
$currentRecord->setFormerlyOwned(FALSE);
/** $this->moveRecord($currentRecord, new Camera());
* @param PreviouslyOwnedCamera $currentRecord }
* @throws ORMInvalidArgumentException
*/
public function reacquire(PreviouslyOwnedCamera $currentRecord): void
{
$currentRecord->setFormerlyOwned(false);
$this->moveRecord($currentRecord, new Camera());
}
} }

View File

@ -3,34 +3,30 @@
namespace App\Repository; namespace App\Repository;
use App\Entity\{Flash, PreviouslyOwnedFlash}; use App\Entity\{Flash, PreviouslyOwnedFlash};
use Doctrine\ORM\{ use Doctrine\ORM\{EntityRepository, ORMInvalidArgumentException};
EntityRepository, ORMInvalidArgumentException
};
class FlashRepository extends EntityRepository { class FlashRepository extends EntityRepository
{
use AcquireTrait;
use AcquireTrait; /**
* @throws ORMInvalidArgumentException
*/
public function deacquire(Flash $currentRecord): void
{
$currentRecord->setFormerlyOwned(TRUE)
->setReceived(TRUE);
/** $this->moveRecord($currentRecord, new PreviouslyOwnedFlash());
* @param Flash $currentRecord }
* @throws ORMInvalidArgumentException
*/
public function deacquire(Flash $currentRecord): void
{
$currentRecord->setFormerlyOwned(true)
->setReceived(true);
$this->moveRecord($currentRecord, new PreviouslyOwnedFlash()); /**
} * @throws ORMInvalidArgumentException
*/
public function reacquire(PreviouslyOwnedFlash $currentRecord): void
{
$currentRecord->setFormerlyOwned(FALSE);
/** $this->moveRecord($currentRecord, new Flash());
* @param PreviouslyOwnedFlash $currentRecord }
* @throws ORMInvalidArgumentException
*/
public function reacquire(PreviouslyOwnedFlash $currentRecord): void
{
$currentRecord->setFormerlyOwned(false);
$this->moveRecord($currentRecord, new Flash());
}
} }

View File

@ -7,26 +7,20 @@ use Doctrine\ORM\EntityRepository;
class LensesRepository extends EntityRepository class LensesRepository extends EntityRepository
{ {
use AcquireTrait; use AcquireTrait;
/** public function deacquire(Lenses $currentRecord): void
* @param Lenses $currentRecord {
*/ $currentRecord->setFormerlyOwned(TRUE)
public function deacquire(Lenses $currentRecord): void ->setReceived(TRUE);
{
$currentRecord->setFormerlyOwned(true)
->setReceived(true);
$this->moveRecord($currentRecord, new PreviouslyOwnedLenses()); $this->moveRecord($currentRecord, new PreviouslyOwnedLenses());
} }
/** public function reacquire(PreviouslyOwnedLenses $currentRecord): void
* @param PreviouslyOwnedLenses $currentRecord {
*/ $currentRecord->setFormerlyOwned(FALSE);
public function reacquire(PreviouslyOwnedLenses $currentRecord): void
{
$currentRecord->setFormerlyOwned(false);
$this->moveRecord($currentRecord, new Lenses()); $this->moveRecord($currentRecord, new Lenses());
} }
} }

View File

@ -1,31 +1,31 @@
<?php <?php declare(strict_types=1);
namespace App\Types; namespace App\Types;
use Doctrine\DBAL\Types\Type; use App\ValueObject\Money;
use Doctrine\DBAL\Platforms\AbstractPlatform; use Doctrine\DBAL\Platforms\AbstractPlatform;
use App\ValueObject\Money; use Doctrine\DBAL\Types\Type;
class MoneyType extends Type { class MoneyType extends Type
{
public function getSQLDeclaration(array $column, AbstractPlatform $platform): string
{
return 'MONEY';
}
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform): string public function convertToPHPValue($value, AbstractPlatform $platform): float
{ {
return 'MONEY'; return (float) (string) new Money($value);
} }
public function convertToPHPValue($value, AbstractPlatform $platform): float public function getName(): string
{ {
return (float) (string)new Money($value); return 'money';
} }
public function getName(): string public function requiresSQLCommentHint(AbstractPlatform $platform): bool
{ {
return 'money'; return TRUE;
} }
public function requiresSQLCommentHint(AbstractPlatform $platform): bool
{
return TRUE;
}
} }

View File

@ -1,22 +1,25 @@
<?php <?php declare(strict_types=1);
namespace App\ValueObject; namespace App\ValueObject;
class Money { use Stringable;
private $value;
public function __construct($value) class Money implements Stringable
{ {
$this->value = (float)str_replace(['$',','], '', $value); private readonly float $value;
}
public function getValue() public function __construct($value)
{ {
return (float)str_replace(['$',','], '', $this->value); $this->value = (float) str_replace(['$', ','], '', $value);
} }
public function __toString() public function getValue(): float
{ {
return (string)$this->getValue(); return (float) str_replace(['$', ','], '', $this->value);
} }
public function __toString(): string
{
return (string) $this->getValue();
}
} }

View File

@ -1,93 +1,147 @@
{ {
"composer/package-versions-deprecated": {
"version": "1.11.99.3"
},
"doctrine/annotations": { "doctrine/annotations": {
"version": "1.0", "version": "1.0",
"recipe": { "recipe": {
"repo": "github.com/symfony/recipes", "repo": "github.com/symfony/recipes",
"branch": "master", "branch": "master",
"version": "1.0", "version": "1.0",
"ref": "b9cde490c337f6c496d5f403fa6f827cf8b4706d" "ref": "a2759dd6123694c8d901d0ec80006e044c2e6457"
} },
"files": [
"config/routes/annotations.yaml"
]
}, },
"doctrine/cache": { "doctrine/cache": {
"version": "v1.7.1" "version": "1.10.2"
}, },
"doctrine/collections": { "doctrine/collections": {
"version": "v1.5.0" "version": "1.6.7"
}, },
"doctrine/common": { "doctrine/common": {
"version": "v2.8.1" "version": "2.13.3"
}, },
"doctrine/dbal": { "doctrine/dbal": {
"version": "v2.6.3" "version": "2.12.1"
},
"doctrine/deprecations": {
"version": "v0.5.3"
}, },
"doctrine/doctrine-bundle": { "doctrine/doctrine-bundle": {
"version": "1.6", "version": "2.0",
"recipe": { "recipe": {
"repo": "github.com/symfony/recipes", "repo": "github.com/symfony/recipes",
"branch": "master", "branch": "master",
"version": "1.6", "version": "2.0",
"ref": "44d3aa7752dd46f77ba11af2297a25e1dedfb4d0" "ref": "40631978d2c4adc9b11220b13eba539b727c36a8"
} },
"files": [
"config/packages/doctrine.yaml",
"config/packages/prod/doctrine.yaml",
"src/Entity/.gitignore",
"src/Repository/.gitignore"
]
}, },
"doctrine/doctrine-migrations-bundle": { "doctrine/doctrine-migrations-bundle": {
"version": "1.2", "version": "2.2",
"recipe": { "recipe": {
"repo": "github.com/symfony/recipes", "repo": "github.com/symfony/recipes",
"branch": "master", "branch": "master",
"version": "1.2", "version": "2.2",
"ref": "c1431086fec31f17fbcfe6d6d7e92059458facc1" "ref": "baaa439e3e3179e69e3da84b671f0a3e4a2f56ad"
} },
"files": [
"config/packages/doctrine_migrations.yaml",
"migrations/.gitignore"
]
}, },
"doctrine/event-manager": { "doctrine/event-manager": {
"version": "v1.0.0" "version": "1.1.1"
}, },
"doctrine/inflector": { "doctrine/inflector": {
"version": "v1.2.0" "version": "1.4.3"
}, },
"doctrine/instantiator": { "doctrine/instantiator": {
"version": "1.1.0" "version": "1.4.0"
}, },
"doctrine/lexer": { "doctrine/lexer": {
"version": "v1.0.1" "version": "1.2.1"
}, },
"doctrine/migrations": { "doctrine/migrations": {
"version": "v1.8.1" "version": "2.3.2"
}, },
"doctrine/orm": { "doctrine/orm": {
"version": "v2.5.13" "version": "2.7.5"
}, },
"doctrine/persistence": { "doctrine/persistence": {
"version": "v1.0.0" "version": "1.3.8"
},
"doctrine/reflection": {
"version": "v1.0.0"
}, },
"doctrine/sql-formatter": { "doctrine/sql-formatter": {
"version": "1.0.1" "version": "1.1.1"
},
"friendsofphp/proxy-manager-lts": {
"version": "v1.0.3"
}, },
"laminas/laminas-code": { "laminas/laminas-code": {
"version": "3.4.1" "version": "4.0.0"
},
"laminas/laminas-eventmanager": {
"version": "3.2.1"
},
"laminas/laminas-zendframework-bridge": {
"version": "1.0.0"
}, },
"monolog/monolog": { "monolog/monolog": {
"version": "1.23.0"
},
"nikic/php-parser": {
"version": "v4.0.0"
},
"ocramius/package-versions": {
"version": "1.3.0"
},
"ocramius/proxy-manager": {
"version": "2.2.0" "version": "2.2.0"
}, },
"php": { "myclabs/deep-copy": {
"version": "7.4" "version": "1.10.2"
},
"nikic/php-parser": {
"version": "v4.10.4"
},
"phar-io/manifest": {
"version": "2.0.3"
},
"phar-io/version": {
"version": "3.1.1"
},
"phpdocumentor/reflection-common": {
"version": "2.2.0"
},
"phpdocumentor/reflection-docblock": {
"version": "5.3.0"
},
"phpdocumentor/type-resolver": {
"version": "1.6.0"
},
"phpspec/prophecy": {
"version": "v1.15.0"
},
"phpunit/php-code-coverage": {
"version": "9.2.10"
},
"phpunit/php-file-iterator": {
"version": "3.0.6"
},
"phpunit/php-invoker": {
"version": "3.1.1"
},
"phpunit/php-text-template": {
"version": "2.0.4"
},
"phpunit/php-timer": {
"version": "5.0.3"
},
"phpunit/phpunit": {
"version": "9.5",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "master",
"version": "9.3",
"ref": "a6249a6c4392e9169b87abf93225f7f9f59025e6"
},
"files": [
".env.test",
"phpunit.xml.dist",
"tests/bootstrap.php"
]
}, },
"psr/cache": { "psr/cache": {
"version": "1.0.1" "version": "1.0.1"
@ -99,11 +153,59 @@
"version": "1.0.0" "version": "1.0.0"
}, },
"psr/log": { "psr/log": {
"version": "1.0.2" "version": "1.1.3"
}, },
"roave/security-advisories": { "roave/security-advisories": {
"version": "dev-master" "version": "dev-master"
}, },
"sebastian/cli-parser": {
"version": "1.0.1"
},
"sebastian/code-unit": {
"version": "1.0.8"
},
"sebastian/code-unit-reverse-lookup": {
"version": "2.0.3"
},
"sebastian/comparator": {
"version": "4.0.6"
},
"sebastian/complexity": {
"version": "2.0.2"
},
"sebastian/diff": {
"version": "4.0.4"
},
"sebastian/environment": {
"version": "5.1.3"
},
"sebastian/exporter": {
"version": "4.0.4"
},
"sebastian/global-state": {
"version": "5.0.5"
},
"sebastian/lines-of-code": {
"version": "1.0.3"
},
"sebastian/object-enumerator": {
"version": "4.0.4"
},
"sebastian/object-reflector": {
"version": "2.0.4"
},
"sebastian/recursion-context": {
"version": "4.0.4"
},
"sebastian/resource-operations": {
"version": "3.0.3"
},
"sebastian/type": {
"version": "2.3.4"
},
"sebastian/version": {
"version": "3.0.2"
},
"sensio/framework-extra-bundle": { "sensio/framework-extra-bundle": {
"version": "5.2", "version": "5.2",
"recipe": { "recipe": {
@ -111,67 +213,58 @@
"branch": "master", "branch": "master",
"version": "5.2", "version": "5.2",
"ref": "fb7e19da7f013d0d422fa9bce16f5c510e27609b" "ref": "fb7e19da7f013d0d422fa9bce16f5c510e27609b"
} },
"files": [
"config/packages/sensio_framework_extra.yaml"
]
}, },
"symfony/cache": { "symfony/cache": {
"version": "v3.3.13" "version": "v5.2.3"
}, },
"symfony/cache-contracts": { "symfony/cache-contracts": {
"version": "v1.1.1" "version": "v2.2.0"
}, },
"symfony/config": { "symfony/config": {
"version": "v3.3.13" "version": "v5.2.3"
}, },
"symfony/console": { "symfony/console": {
"version": "3.3", "version": "5.1",
"recipe": { "recipe": {
"repo": "github.com/symfony/recipes", "repo": "github.com/symfony/recipes",
"branch": "master", "branch": "master",
"version": "3.3", "version": "5.1",
"ref": "9f94d3ea453cd8a3b95db7f82592d7344fe3a76a" "ref": "c6d02bdfba9da13c22157520e32a602dbee8a75c"
} },
}, "files": [
"symfony/debug": { "bin/console"
"version": "v4.4.9" ]
},
"symfony/debug-bundle": {
"version": "4.1",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "master",
"version": "4.1",
"ref": "f8863cbad2f2e58c4b65fa1eac892ab189971bea"
}
},
"symfony/debug-pack": {
"version": "v1.0.5"
}, },
"symfony/dependency-injection": { "symfony/dependency-injection": {
"version": "v3.3.13" "version": "v5.2.3"
}, },
"symfony/deprecation-contracts": { "symfony/deprecation-contracts": {
"version": "v2.1.2" "version": "v2.2.0"
}, },
"symfony/doctrine-bridge": { "symfony/doctrine-bridge": {
"version": "v4.0.0" "version": "v5.1.11"
}, },
"symfony/dotenv": { "symfony/dotenv": {
"version": "v3.3.13" "version": "v5.2.3"
}, },
"symfony/error-handler": { "symfony/error-handler": {
"version": "v4.4.0" "version": "v5.2.3"
}, },
"symfony/event-dispatcher": { "symfony/event-dispatcher": {
"version": "v3.3.13" "version": "v5.2.3"
}, },
"symfony/event-dispatcher-contracts": { "symfony/event-dispatcher-contracts": {
"version": "v1.1.1" "version": "v2.2.0"
}, },
"symfony/filesystem": { "symfony/filesystem": {
"version": "v3.3.13" "version": "v5.2.3"
}, },
"symfony/finder": { "symfony/finder": {
"version": "v3.3.13" "version": "v5.2.3"
}, },
"symfony/flex": { "symfony/flex": {
"version": "1.0", "version": "1.0",
@ -179,32 +272,40 @@
"repo": "github.com/symfony/recipes", "repo": "github.com/symfony/recipes",
"branch": "master", "branch": "master",
"version": "1.0", "version": "1.0",
"ref": "e921bdbfe20cdefa3b82f379d1cd36df1bc8d115" "ref": "c0eeb50665f0f77226616b6038a9b06c03752d8e"
} },
"files": [
".env"
]
}, },
"symfony/form": { "symfony/form": {
"version": "v4.0.0" "version": "v5.2.3"
}, },
"symfony/framework-bundle": { "symfony/framework-bundle": {
"version": "3.3", "version": "5.2",
"recipe": { "recipe": {
"repo": "github.com/symfony/recipes", "repo": "github.com/symfony/recipes",
"branch": "master", "branch": "master",
"version": "3.3", "version": "5.2",
"ref": "305b268e55e75059f20ec9827a8fd09a35c59866" "ref": "6ec87563dcc85cd0c48856dcfbfc29610506d250"
} },
"files": [
"config/packages/cache.yaml",
"config/packages/framework.yaml",
"config/packages/test/framework.yaml",
"config/preload.php",
"config/routes/dev/framework.yaml",
"config/services.yaml",
"public/index.php",
"src/Controller/.gitignore",
"src/Kernel.php"
]
}, },
"symfony/http-foundation": { "symfony/http-foundation": {
"version": "v3.3.13" "version": "v5.2.3"
}, },
"symfony/http-kernel": { "symfony/http-kernel": {
"version": "v3.3.13" "version": "v5.2.3"
},
"symfony/inflector": {
"version": "v4.0.0"
},
"symfony/intl": {
"version": "v4.0.0"
}, },
"symfony/maker-bundle": { "symfony/maker-bundle": {
"version": "1.0", "version": "1.0",
@ -216,70 +317,78 @@
} }
}, },
"symfony/monolog-bridge": { "symfony/monolog-bridge": {
"version": "v4.1.1" "version": "v5.2.3"
}, },
"symfony/monolog-bundle": { "symfony/monolog-bundle": {
"version": "3.1",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "master",
"version": "3.1",
"ref": "51b7a31438c8aeeda7931a0ece98a945c91e7f20"
}
},
"symfony/options-resolver": {
"version": "v4.0.0"
},
"symfony/orm-pack": {
"version": "v1.0.5"
},
"symfony/polyfill-ctype": {
"version": "v1.8.0"
},
"symfony/polyfill-intl-grapheme": {
"version": "v1.17.0"
},
"symfony/polyfill-intl-icu": {
"version": "v1.6.0"
},
"symfony/polyfill-intl-normalizer": {
"version": "v1.17.0"
},
"symfony/polyfill-mbstring": {
"version": "v1.6.0"
},
"symfony/polyfill-php73": {
"version": "v1.11.0"
},
"symfony/polyfill-php80": {
"version": "v1.17.0"
},
"symfony/profiler-pack": {
"version": "v1.0.3"
},
"symfony/property-access": {
"version": "v4.0.0"
},
"symfony/property-info": {
"version": "v5.1.0"
},
"symfony/routing": {
"version": "3.3", "version": "3.3",
"recipe": { "recipe": {
"repo": "github.com/symfony/recipes", "repo": "github.com/symfony/recipes",
"branch": "master", "branch": "master",
"version": "3.3", "version": "3.3",
"ref": "a249484db698d1a847a30291c8f732414ac47e25" "ref": "d7249f7d560f6736115eee1851d02a65826f0a56"
} },
"files": [
"config/packages/dev/monolog.yaml",
"config/packages/prod/deprecations.yaml",
"config/packages/prod/monolog.yaml",
"config/packages/test/monolog.yaml"
]
},
"symfony/options-resolver": {
"version": "v5.2.3"
},
"symfony/polyfill-ctype": {
"version": "v1.22.1"
},
"symfony/polyfill-intl-grapheme": {
"version": "v1.22.1"
},
"symfony/polyfill-intl-icu": {
"version": "v1.22.1"
},
"symfony/polyfill-intl-normalizer": {
"version": "v1.22.1"
},
"symfony/polyfill-mbstring": {
"version": "v1.22.1"
},
"symfony/polyfill-php72": {
"version": "v1.24.0"
},
"symfony/polyfill-php80": {
"version": "v1.22.1"
},
"symfony/polyfill-php81": {
"version": "v1.23.0"
},
"symfony/property-access": {
"version": "v5.2.3"
},
"symfony/property-info": {
"version": "v5.2.3"
},
"symfony/routing": {
"version": "5.1",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "master",
"version": "5.1",
"ref": "b4f3e7c95e38b606eef467e8a42a8408fc460c43"
},
"files": [
"config/packages/prod/routing.yaml",
"config/packages/routing.yaml",
"config/routes.yaml"
]
}, },
"symfony/service-contracts": { "symfony/service-contracts": {
"version": "v1.1.2" "version": "v2.2.0"
}, },
"symfony/stopwatch": { "symfony/stopwatch": {
"version": "v4.1.1" "version": "v5.2.3"
}, },
"symfony/string": { "symfony/string": {
"version": "v5.1.0" "version": "v5.2.3"
}, },
"symfony/translation": { "symfony/translation": {
"version": "3.3", "version": "3.3",
@ -287,7 +396,7 @@
"repo": "github.com/symfony/recipes", "repo": "github.com/symfony/recipes",
"branch": "master", "branch": "master",
"version": "3.3", "version": "3.3",
"ref": "1fb02a6e1c8f3d4232cce485c9afa868d63b115a" "ref": "2ad9d2545bce8ca1a863e50e92141f0b9d87ffcd"
}, },
"files": [ "files": [
"config/packages/translation.yaml", "config/packages/translation.yaml",
@ -295,22 +404,24 @@
] ]
}, },
"symfony/translation-contracts": { "symfony/translation-contracts": {
"version": "v1.1.2" "version": "v2.3.0"
}, },
"symfony/twig-bridge": { "symfony/twig-bridge": {
"version": "v4.0.0" "version": "v5.2.3"
}, },
"symfony/twig-bundle": { "symfony/twig-bundle": {
"version": "3.3", "version": "5.0",
"recipe": { "recipe": {
"repo": "github.com/symfony/recipes", "repo": "github.com/symfony/recipes",
"branch": "master", "branch": "master",
"version": "3.3", "version": "5.0",
"ref": "f75ac166398e107796ca94cc57fa1edaa06ec47f" "ref": "fab9149bbaa4d5eca054ed93f9e1b66cc500895d"
} },
}, "files": [
"symfony/twig-pack": { "config/packages/test/twig.yaml",
"version": "v1.0.0" "config/packages/twig.yaml",
"templates/base.html.twig"
]
}, },
"symfony/validator": { "symfony/validator": {
"version": "4.3", "version": "4.3",
@ -326,10 +437,10 @@
] ]
}, },
"symfony/var-dumper": { "symfony/var-dumper": {
"version": "v4.1.1" "version": "v5.2.3"
}, },
"symfony/var-exporter": { "symfony/var-exporter": {
"version": "v4.2.0" "version": "v5.2.3"
}, },
"symfony/web-profiler-bundle": { "symfony/web-profiler-bundle": {
"version": "3.3", "version": "3.3",
@ -338,24 +449,23 @@
"branch": "master", "branch": "master",
"version": "3.3", "version": "3.3",
"ref": "6bdfa1a95f6b2e677ab985cd1af2eae35d62e0f6" "ref": "6bdfa1a95f6b2e677ab985cd1af2eae35d62e0f6"
} },
"files": [
"config/packages/dev/web_profiler.yaml",
"config/packages/test/web_profiler.yaml",
"config/routes/dev/web_profiler.yaml"
]
}, },
"symfony/yaml": { "symfony/yaml": {
"version": "v5.0.7" "version": "v5.2.3"
}, },
"twig/extra-bundle": { "theseer/tokenizer": {
"version": "v3.0.3" "version": "1.2.1"
}, },
"twig/twig": { "twig/twig": {
"version": "v2.4.4" "version": "v3.3.0"
}, },
"webimpress/safe-writer": { "webmozart/assert": {
"version": "2.0.0" "version": "1.10.0"
},
"zendframework/zend-code": {
"version": "3.3.0"
},
"zendframework/zend-eventmanager": {
"version": "3.2.1"
} }
} }

11
tests/bootstrap.php Normal file
View File

@ -0,0 +1,11 @@
<?php declare(strict_types=1);
use Symfony\Component\Dotenv\Dotenv;
require dirname(__DIR__) . '/vendor/autoload.php';
if (file_exists(dirname(__DIR__) . '/config/bootstrap.php')) {
require dirname(__DIR__) . '/config/bootstrap.php';
} elseif (method_exists(Dotenv::class, 'bootEnv')) {
(new Dotenv())->bootEnv(dirname(__DIR__) . '/.env');
}

8
tools/common.inc.php Normal file
View File

@ -0,0 +1,8 @@
<?php declare(strict_types=1);
function walk_array(callable $method, array $items): void
{
foreach ($items as $item) {
$method($item);
}
}

6
tools/composer.json Normal file
View File

@ -0,0 +1,6 @@
{
"require": {
"friendsofphp/php-cs-fixer": "^3.6",
"rector/rector": "^0.12.16"
}
}

2149
tools/composer.lock generated Normal file

File diff suppressed because it is too large Load Diff

85
tools/rector.php Normal file
View File

@ -0,0 +1,85 @@
<?php declare(strict_types=1);
use Rector\CodeQuality\Rector\BooleanNot\SimplifyDeMorganBinaryRector;
use Rector\CodeQuality\Rector\Class_\CompleteDynamicPropertiesRector;
use Rector\CodeQuality\Rector\For_\{ForRepeatedCountToOwnVariableRector, ForToForeachRector};
use Rector\CodeQuality\Rector\If_\{ConsecutiveNullCompareReturnsToNullCoalesceQueueRector, SimplifyIfElseToTernaryRector, SimplifyIfReturnBoolRector};
use Rector\CodeQuality\Rector\Ternary\{SimplifyDuplicatedTernaryRector, SimplifyTautologyTernaryRector, SwitchNegatedTernaryRector};
use Rector\CodingStyle\Rector\Class_\AddArrayDefaultToArrayPropertyRector;
use Rector\CodingStyle\Rector\ClassConst\RemoveFinalFromConstRector;
use Rector\CodingStyle\Rector\ClassMethod\NewlineBeforeNewAssignSetRector;
use Rector\CodingStyle\Rector\Encapsed\WrapEncapsedVariableInCurlyBracesRector;
use Rector\CodingStyle\Rector\FuncCall\{CallUserFuncArrayToVariadicRector, CallUserFuncToMethodCallRector, CountArrayToEmptyArrayComparisonRector};
use Rector\CodingStyle\Rector\Stmt\NewlineAfterStatementRector;
use Rector\Core\Configuration\Option;
use Rector\DeadCode\Rector\ClassMethod\{RemoveUselessParamTagRector, RemoveUselessReturnTagRector};
use Rector\DeadCode\Rector\Foreach_\RemoveUnusedForeachKeyRector;
use Rector\DeadCode\Rector\Property\RemoveUselessVarTagRector;
use Rector\DeadCode\Rector\Switch_\RemoveDuplicatedCaseInSwitchRector;
use Rector\Doctrine\Set\DoctrineSetList;
use Rector\EarlyReturn\Rector\Foreach_\ChangeNestedForeachIfsToEarlyContinueRector;
use Rector\EarlyReturn\Rector\If_\{ChangeIfElseValueAssignToEarlyReturnRector, RemoveAlwaysElseRector};
use Rector\Php81\Rector\Property\ReadOnlyPropertyRector;
use Rector\Restoration\Rector\Property\MakeTypedPropertyNullableIfCheckedRector;
use Rector\Set\ValueObject\LevelSetList;
use Rector\Symfony\Set\{SymfonyLevelSetList, SymfonySetList};
use Rector\TypeDeclaration\Rector\ClassMethod\{AddArrayParamDocTypeRector, AddArrayReturnDocTypeRector, AddMethodCallBasedStrictParamTypeRector, ParamTypeByMethodCallTypeRector, ParamTypeByParentCallTypeRector};
use Rector\TypeDeclaration\Rector\Closure\AddClosureReturnTypeRector;
use Rector\TypeDeclaration\Rector\Property\TypedPropertyFromAssignsRector;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
require_once __DIR__ . '/common.inc.php';
return static function (ContainerConfigurator $config): void {
$parameters = $config->parameters();
$parameters->set(Option::AUTO_IMPORT_NAMES, TRUE);
$parameters->set(Option::IMPORT_SHORT_CLASSES, TRUE);
$parameters->set(Option::SKIP, [
ReadOnlyPropertyRector::class,
]);
walk_array([$config, 'import'], [
DoctrineSetList::ANNOTATIONS_TO_ATTRIBUTES,
LevelSetList::UP_TO_PHP_81,
SymfonyLevelSetList::UP_TO_SYMFONY_60,
SymfonySetList::ANNOTATIONS_TO_ATTRIBUTES,
]);
$services = $config->services();
walk_array([$services, 'set'], [
SimplifyDeMorganBinaryRector::class,
CompleteDynamicPropertiesRector::class,
ForRepeatedCountToOwnVariableRector::class,
ForToForeachRector::class,
ConsecutiveNullCompareReturnsToNullCoalesceQueueRector::class,
SimplifyIfElseToTernaryRector::class,
SimplifyIfReturnBoolRector::class,
SimplifyDuplicatedTernaryRector::class,
SimplifyTautologyTernaryRector::class,
SwitchNegatedTernaryRector::class,
AddArrayDefaultToArrayPropertyRector::class,
RemoveFinalFromConstRector::class,
NewlineBeforeNewAssignSetRector::class,
WrapEncapsedVariableInCurlyBracesRector::class,
CallUserFuncArrayToVariadicRector::class,
CallUserFuncToMethodCallRector::class,
CountArrayToEmptyArrayComparisonRector::class,
NewlineAfterStatementRector::class,
RemoveUselessParamTagRector::class,
RemoveUselessReturnTagRector::class,
RemoveUnusedForeachKeyRector::class,
RemoveUselessVarTagRector::class,
RemoveDuplicatedCaseInSwitchRector::class,
ChangeNestedForeachIfsToEarlyContinueRector::class,
ChangeIfElseValueAssignToEarlyReturnRector::class,
RemoveAlwaysElseRector::class,
MakeTypedPropertyNullableIfCheckedRector::class,
AddArrayParamDocTypeRector::class,
AddArrayReturnDocTypeRector::class,
AddMethodCallBasedStrictParamTypeRector::class,
ParamTypeByMethodCallTypeRector::class,
ParamTypeByParentCallTypeRector::class,
AddClosureReturnTypeRector::class,
TypedPropertyFromAssignsRector::class,
]);
};

View File

@ -1,68 +1,68 @@
<?php <?php declare(strict_types=1);
return [ return [
'' => '', '' => '',
'4x4' => '4x4cm', '4x4' => '4x4cm',
'6x4.5' => '6x4.5cm', '6x4.5' => '6x4.5cm',
'6x6' => '6x6cm', '6x6' => '6x6cm',
'35mm' => '35mm', '35mm' => '35mm',
'110' => '110', '110' => '110',
'120' => '120', '120' => '120',
'127' => '127', '127' => '127',
'620' => '620', '620' => '620',
'Aperture blades' => '# of Aperture Blades', 'Aperture blades' => '# of Aperture Blades',
'APS-C' => 'APS-C', 'APS-C' => 'APS-C',
'B & W' => 'B & W', 'B & W' => 'B & W',
'Batteries' => 'Batteries', 'Batteries' => 'Batteries',
'Battery type' => 'Battery Type', 'Battery type' => 'Battery Type',
'Brand' => 'Brand', 'Brand' => 'Brand',
'C-41' => 'C-41', 'C-41' => 'C-41',
'Cellulose Triacetate' => 'Cellulose Triacetate', 'Cellulose Triacetate' => 'Cellulose Triacetate',
'Chemistry' => 'Film Chemistry', 'Chemistry' => 'Film Chemistry',
'Coatings' => 'Coatings', 'Coatings' => 'Coatings',
'Crop factor' => 'Crop Factor', 'Crop factor' => 'Crop Factor',
'Description' => 'Description', 'Description' => 'Description',
'Design elements' => '# of Design Elements', 'Design elements' => '# of Design Elements',
'Design groups' => '# of Design Groups', 'Design groups' => '# of Design Groups',
'Developed rolls' => '# of Developed Rolls', 'Developed rolls' => '# of Developed Rolls',
'E-6' => 'E-6', 'E-6' => 'E-6',
'Film alias' => 'Film Alias', 'Film alias' => 'Film Alias',
'Film base' => 'Film Base', 'Film base' => 'Film Base',
'Film format' => 'Film Format', 'Film format' => 'Film Format',
'Film name' => 'Film Name', 'Film name' => 'Film Name',
'Film speed asa' => 'Film Speed (ASA)', 'Film speed asa' => 'Film Speed (ASA)',
'Film speed din' => 'Film Speed (DIN)', 'Film speed din' => 'Film Speed (DIN)',
'Formerly owned' => 'Formerly Owned', 'Formerly owned' => 'Formerly Owned',
'Front filter size' => 'Front filter size (mm)', 'Front filter size' => 'Front filter size (mm)',
'Guide number' => 'Guide Number', 'Guide number' => 'Guide Number',
'Image size' => 'Image Size', 'Image size' => 'Image Size',
'Is auto flash' => 'Is auto flash', 'Is auto flash' => 'Is auto flash',
'Is digital' => 'Is Digital', 'Is digital' => 'Is Digital',
'Is p ttl' => 'Is P-TTL', 'Is p ttl' => 'Is P-TTL',
'Is teleconverter' => 'Is teleconverter', 'Is teleconverter' => 'Is teleconverter',
'Is ttl' => 'Is TTL', 'Is ttl' => 'Is TTL',
'Is working' => 'Is Working', 'Is working' => 'Is Working',
'Max f stop' => 'Max aperture (smallest f number)', 'Max f stop' => 'Max aperture (smallest f number)',
'Max focal length' => 'Max focal length (mm)', 'Max focal length' => 'Max focal length (mm)',
'Medium Format' => 'Medium Format', 'Medium Format' => 'Medium Format',
'Micro 4/3' => 'μ 4/3', 'Micro 4/3' => 'μ 4/3',
'Min f stop' => 'Min aperture (largest f number)', 'Min f stop' => 'Min aperture (largest f number)',
'Min focal length' => 'Min focal length (mm)', 'Min focal length' => 'Min focal length (mm)',
'Model' => 'Model', 'Model' => 'Model',
'Mount' => 'Mount', 'Mount' => 'Mount',
'Notes' => 'Notes', 'Notes' => 'Notes',
'Other' => 'Other', 'Other' => 'Other',
'P ttl type' => 'P-TTL Type', 'P ttl type' => 'P-TTL Type',
'Polyester' => 'Polyester', 'Polyester' => 'Polyester',
'Polyethylene Naphtalate' => 'Polyethylene Naphtalate', 'Polyethylene Naphtalate' => 'Polyethylene Naphtalate',
'Product line' => 'Product Line', 'Product line' => 'Product Line',
'Purchase price' => 'Purchase Price', 'Purchase price' => 'Purchase Price',
'Rear filter size' => 'Rear filter size (mm)', 'Rear filter size' => 'Rear filter size (mm)',
'Received' => 'Received', 'Received' => 'Received',
'Rolls in camera' => '# of Rolls in a Camera', 'Rolls in camera' => '# of Rolls in a Camera',
'Serial' => 'Serial', 'Serial' => 'Serial',
'Small Format' => 'Small Format', 'Small Format' => 'Small Format',
'Ttl type' => 'TTL Type', 'Ttl type' => 'TTL Type',
'Type' => 'Type', 'Type' => 'Type',
'Unused rolls' => '# of Unused Rolls', 'Unused rolls' => '# of Unused Rolls',
]; ];

View File

@ -1,97 +1,97 @@
<?php <?php declare(strict_types=1);
return [ return [
'This value should be false.' => 'This value should be false.', 'This value should be false.' => 'This value should be false.',
'This value should be true.' => 'This value should be true.', 'This value should be true.' => 'This value should be true.',
'This value should be of type {{ type }}.' => 'This value should be of type {{ type }}.', 'This value should be of type {{ type }}.' => 'This value should be of type {{ type }}.',
'This value should be blank.' => 'This value should be blank.', 'This value should be blank.' => 'This value should be blank.',
'The value you selected is not a valid choice.' => 'The value you selected is not a valid choice.', 'The value you selected is not a valid choice.' => 'The value you selected is not a valid choice.',
'You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.' => 'You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.', 'You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.' => 'You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.',
'You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.' => 'You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.', 'You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.' => 'You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.',
'One or more of the given values is invalid.' => 'One or more of the given values is invalid.', 'One or more of the given values is invalid.' => 'One or more of the given values is invalid.',
'This field was not expected.' => 'This field was not expected.', 'This field was not expected.' => 'This field was not expected.',
'This field is missing.' => 'This field is missing.', 'This field is missing.' => 'This field is missing.',
'This value is not a valid date.' => 'This value is not a valid date.', 'This value is not a valid date.' => 'This value is not a valid date.',
'This value is not a valid datetime.' => 'This value is not a valid datetime.', 'This value is not a valid datetime.' => 'This value is not a valid datetime.',
'This value is not a valid email address.' => 'This value is not a valid email address.', 'This value is not a valid email address.' => 'This value is not a valid email address.',
'The file could not be found.' => 'The file could not be found.', 'The file could not be found.' => 'The file could not be found.',
'The file is not readable.' => 'The file is not readable.', 'The file is not readable.' => 'The file is not readable.',
'The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.' => 'The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.', 'The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.' => 'The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.',
'The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.' => 'The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.', 'The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.' => 'The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.',
'This value should be {{ limit }} or less.' => 'This value should be {{ limit }} or less.', 'This value should be {{ limit }} or less.' => 'This value should be {{ limit }} or less.',
'This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.' => 'This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.', 'This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.' => 'This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.',
'This value should be {{ limit }} or more.' => 'This value should be {{ limit }} or more.', 'This value should be {{ limit }} or more.' => 'This value should be {{ limit }} or more.',
'This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.' => 'This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.', 'This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.' => 'This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.',
'This value should not be blank.' => 'This value should not be blank.', 'This value should not be blank.' => 'This value should not be blank.',
'This value should not be null.' => 'This value should not be null.', 'This value should not be null.' => 'This value should not be null.',
'This value should be null.' => 'This value should be null.', 'This value should be null.' => 'This value should be null.',
'This value is not valid.' => 'This value is not valid.', 'This value is not valid.' => 'This value is not valid.',
'This value is not a valid time.' => 'This value is not a valid time.', 'This value is not a valid time.' => 'This value is not a valid time.',
'This value is not a valid URL.' => 'This value is not a valid URL.', 'This value is not a valid URL.' => 'This value is not a valid URL.',
'The two values should be equal.' => 'The two values should be equal.', 'The two values should be equal.' => 'The two values should be equal.',
'The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.' => 'The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.', 'The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.' => 'The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.',
'The file is too large.' => 'The file is too large.', 'The file is too large.' => 'The file is too large.',
'The file could not be uploaded.' => 'The file could not be uploaded.', 'The file could not be uploaded.' => 'The file could not be uploaded.',
'This value should be a valid number.' => 'This value should be a valid number.', 'This value should be a valid number.' => 'This value should be a valid number.',
'This file is not a valid image.' => 'This file is not a valid image.', 'This file is not a valid image.' => 'This file is not a valid image.',
'This is not a valid IP address.' => 'This is not a valid IP address.', 'This is not a valid IP address.' => 'This is not a valid IP address.',
'This value is not a valid language.' => 'This value is not a valid language.', 'This value is not a valid language.' => 'This value is not a valid language.',
'This value is not a valid locale.' => 'This value is not a valid locale.', 'This value is not a valid locale.' => 'This value is not a valid locale.',
'This value is not a valid country.' => 'This value is not a valid country.', 'This value is not a valid country.' => 'This value is not a valid country.',
'This value is already used.' => 'This value is already used.', 'This value is already used.' => 'This value is already used.',
'The size of the image could not be detected.' => 'The size of the image could not be detected.', 'The size of the image could not be detected.' => 'The size of the image could not be detected.',
'The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.' => 'The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.', 'The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.' => 'The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.',
'The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.' => 'The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.', 'The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.' => 'The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.',
'The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.' => 'The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.', 'The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.' => 'The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.',
'The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.' => 'The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.', 'The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.' => 'The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.',
'This value should be the user\'s current password.' => 'This value should be the user\'s current password.', 'This value should be the user\'s current password.' => 'This value should be the user\'s current password.',
'This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.' => 'This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.', 'This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.' => 'This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.',
'The file was only partially uploaded.' => 'The file was only partially uploaded.', 'The file was only partially uploaded.' => 'The file was only partially uploaded.',
'No file was uploaded.' => 'No file was uploaded.', 'No file was uploaded.' => 'No file was uploaded.',
'No temporary folder was configured in php.ini.' => 'No temporary folder was configured in php.ini, or the configured folder does not exist.', 'No temporary folder was configured in php.ini.' => 'No temporary folder was configured in php.ini, or the configured folder does not exist.',
'Cannot write temporary file to disk.' => 'Cannot write temporary file to disk.', 'Cannot write temporary file to disk.' => 'Cannot write temporary file to disk.',
'A PHP extension caused the upload to fail.' => 'A PHP extension caused the upload to fail.', 'A PHP extension caused the upload to fail.' => 'A PHP extension caused the upload to fail.',
'This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.' => 'This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.', 'This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.' => 'This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.',
'This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.' => 'This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.', 'This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.' => 'This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.',
'This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.' => 'This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.', 'This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.' => 'This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.',
'Invalid card number.' => 'Invalid card number.', 'Invalid card number.' => 'Invalid card number.',
'Unsupported card type or invalid card number.' => 'Unsupported card type or invalid card number.', 'Unsupported card type or invalid card number.' => 'Unsupported card type or invalid card number.',
'This is not a valid International Bank Account Number (IBAN).' => 'This is not a valid International Bank Account Number (IBAN).', 'This is not a valid International Bank Account Number (IBAN).' => 'This is not a valid International Bank Account Number (IBAN).',
'This value is not a valid ISBN-10.' => 'This value is not a valid ISBN-10.', 'This value is not a valid ISBN-10.' => 'This value is not a valid ISBN-10.',
'This value is not a valid ISBN-13.' => 'This value is not a valid ISBN-13.', 'This value is not a valid ISBN-13.' => 'This value is not a valid ISBN-13.',
'This value is neither a valid ISBN-10 nor a valid ISBN-13.' => 'This value is neither a valid ISBN-10 nor a valid ISBN-13.', 'This value is neither a valid ISBN-10 nor a valid ISBN-13.' => 'This value is neither a valid ISBN-10 nor a valid ISBN-13.',
'This value is not a valid ISSN.' => 'This value is not a valid ISSN.', 'This value is not a valid ISSN.' => 'This value is not a valid ISSN.',
'This value is not a valid currency.' => 'This value is not a valid currency.', 'This value is not a valid currency.' => 'This value is not a valid currency.',
'This value should be equal to {{ compared_value }}.' => 'This value should be equal to {{ compared_value }}.', 'This value should be equal to {{ compared_value }}.' => 'This value should be equal to {{ compared_value }}.',
'This value should be greater than {{ compared_value }}.' => 'This value should be greater than {{ compared_value }}.', 'This value should be greater than {{ compared_value }}.' => 'This value should be greater than {{ compared_value }}.',
'This value should be greater than or equal to {{ compared_value }}.' => 'This value should be greater than or equal to {{ compared_value }}.', 'This value should be greater than or equal to {{ compared_value }}.' => 'This value should be greater than or equal to {{ compared_value }}.',
'This value should be identical to {{ compared_value_type }} {{ compared_value }}.' => 'This value should be identical to {{ compared_value_type }} {{ compared_value }}.', 'This value should be identical to {{ compared_value_type }} {{ compared_value }}.' => 'This value should be identical to {{ compared_value_type }} {{ compared_value }}.',
'This value should be less than {{ compared_value }}.' => 'This value should be less than {{ compared_value }}.', 'This value should be less than {{ compared_value }}.' => 'This value should be less than {{ compared_value }}.',
'This value should be less than or equal to {{ compared_value }}.' => 'This value should be less than or equal to {{ compared_value }}.', 'This value should be less than or equal to {{ compared_value }}.' => 'This value should be less than or equal to {{ compared_value }}.',
'This value should not be equal to {{ compared_value }}.' => 'This value should not be equal to {{ compared_value }}.', 'This value should not be equal to {{ compared_value }}.' => 'This value should not be equal to {{ compared_value }}.',
'This value should not be identical to {{ compared_value_type }} {{ compared_value }}.' => 'This value should not be identical to {{ compared_value_type }} {{ compared_value }}.', 'This value should not be identical to {{ compared_value_type }} {{ compared_value }}.' => 'This value should not be identical to {{ compared_value_type }} {{ compared_value }}.',
'The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.' => 'The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.', 'The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.' => 'The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.',
'The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.' => 'The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.', 'The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.' => 'The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.',
'The image is square ({{ width }}x{{ height }}px). Square images are not allowed.' => 'The image is square ({{ width }}x{{ height }}px). Square images are not allowed.', 'The image is square ({{ width }}x{{ height }}px). Square images are not allowed.' => 'The image is square ({{ width }}x{{ height }}px). Square images are not allowed.',
'The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.' => 'The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.', 'The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.' => 'The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.',
'The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.' => 'The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.', 'The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.' => 'The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.',
'An empty file is not allowed.' => 'An empty file is not allowed.', 'An empty file is not allowed.' => 'An empty file is not allowed.',
'The host could not be resolved.' => 'The host could not be resolved.', 'The host could not be resolved.' => 'The host could not be resolved.',
'This value does not match the expected {{ charset }} charset.' => 'This value does not match the expected {{ charset }} charset.', 'This value does not match the expected {{ charset }} charset.' => 'This value does not match the expected {{ charset }} charset.',
'This is not a valid Business Identifier Code (BIC).' => 'This is not a valid Business Identifier Code (BIC).', 'This is not a valid Business Identifier Code (BIC).' => 'This is not a valid Business Identifier Code (BIC).',
'Error' => 'Error', 'Error' => 'Error',
'This is not a valid UUID.' => 'This is not a valid UUID.', 'This is not a valid UUID.' => 'This is not a valid UUID.',
'This value should be a multiple of {{ compared_value }}.' => 'This value should be a multiple of {{ compared_value }}.', 'This value should be a multiple of {{ compared_value }}.' => 'This value should be a multiple of {{ compared_value }}.',
'This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.' => 'This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.', 'This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.' => 'This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.',
'This value should be valid JSON.' => 'This value should be valid JSON.', 'This value should be valid JSON.' => 'This value should be valid JSON.',
'This collection should contain only unique elements.' => 'This collection should contain only unique elements.', 'This collection should contain only unique elements.' => 'This collection should contain only unique elements.',
'This value should be positive.' => 'This value should be positive.', 'This value should be positive.' => 'This value should be positive.',
'This value should be either positive or zero.' => 'This value should be either positive or zero.', 'This value should be either positive or zero.' => 'This value should be either positive or zero.',
'This value should be negative.' => 'This value should be negative.', 'This value should be negative.' => 'This value should be negative.',
'This value should be either negative or zero.' => 'This value should be either negative or zero.', 'This value should be either negative or zero.' => 'This value should be either negative or zero.',
'This value is not a valid timezone.' => 'This value is not a valid timezone.', 'This value is not a valid timezone.' => 'This value is not a valid timezone.',
'This password has been leaked in a data breach, it must not be used. Please use another password.' => 'This password has been leaked in a data breach, it must not be used. Please use another password.', 'This password has been leaked in a data breach, it must not be used. Please use another password.' => 'This password has been leaked in a data breach, it must not be used. Please use another password.',
'This form should not contain extra fields.' => 'This form should not contain extra fields.', 'This form should not contain extra fields.' => 'This form should not contain extra fields.',
'The uploaded file was too large. Please try to upload a smaller file.' => 'The uploaded file was too large. Please try to upload a smaller file.', 'The uploaded file was too large. Please try to upload a smaller file.' => 'The uploaded file was too large. Please try to upload a smaller file.',
'The CSRF token is invalid. Please try to resubmit the form.' => 'The CSRF token is invalid. Please try to resubmit the form.', 'The CSRF token is invalid. Please try to resubmit the form.' => 'The CSRF token is invalid. Please try to resubmit the form.',
]; ];