├── .env ├── .env.test ├── .gitignore ├── README.md ├── bin ├── console └── phpunit ├── composer.json ├── composer.lock ├── config ├── bootstrap.php ├── bundles.php ├── packages │ ├── cache.yaml │ ├── dev │ │ ├── debug.yaml │ │ ├── easy_log_handler.yaml │ │ ├── monolog.yaml │ │ ├── routing.yaml │ │ ├── swiftmailer.yaml │ │ └── web_profiler.yaml │ ├── doctrine.yaml │ ├── doctrine_migrations.yaml │ ├── framework.yaml │ ├── prod │ │ ├── doctrine.yaml │ │ └── monolog.yaml │ ├── routing.yaml │ ├── security.yaml │ ├── sensio_framework_extra.yaml │ ├── swiftmailer.yaml │ ├── test │ │ ├── framework.yaml │ │ ├── monolog.yaml │ │ ├── routing.yaml │ │ ├── swiftmailer.yaml │ │ ├── validator.yaml │ │ └── web_profiler.yaml │ ├── translation.yaml │ ├── twig.yaml │ └── validator.yaml ├── routes.yaml ├── routes │ ├── annotations.yaml │ └── dev │ │ ├── twig.yaml │ │ └── web_profiler.yaml └── services.yaml ├── phpunit.xml.dist ├── public └── index.php ├── src ├── Controller │ ├── .gitignore │ ├── CartController.php │ └── ProductController.php ├── DataFixtures │ └── AppFixtures.php ├── Entity │ ├── .gitignore │ └── Product.php ├── Kernel.php ├── Migrations │ ├── .gitignore │ └── Version20190926192607.php └── Repository │ ├── .gitignore │ └── ProductRepository.php ├── symfony.lock ├── templates ├── base.html.twig ├── cart │ └── index.html.twig └── product │ └── index.html.twig ├── tests └── .gitignore └── translations └── .gitignore /.env: -------------------------------------------------------------------------------- 1 | # In all environments, the following files are loaded if they exist, 2 | # the later taking precedence over the former: 3 | # 4 | # * .env contains default values for the environment variables needed by the app 5 | # * .env.local uncommitted file with local overrides 6 | # * .env.$APP_ENV committed environment-specific defaults 7 | # * .env.$APP_ENV.local uncommitted environment-specific overrides 8 | # 9 | # Real environment variables win over .env files. 10 | # 11 | # DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES. 12 | # 13 | # Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2). 14 | # https://symfony.com/doc/current/best_practices/configuration.html#infrastructure-related-configuration 15 | 16 | ###> symfony/framework-bundle ### 17 | APP_ENV=dev 18 | APP_SECRET=69d698a7eb1794785bf70246cb0fec80 19 | #TRUSTED_PROXIES=127.0.0.1,127.0.0.2 20 | #TRUSTED_HOSTS='^localhost|example\.com$' 21 | ###< symfony/framework-bundle ### 22 | 23 | ###> doctrine/doctrine-bundle ### 24 | # Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url 25 | # For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db" 26 | # Configure your db driver and server_version in config/packages/doctrine.yaml 27 | DATABASE_URL=sqlite:///%kernel.project_dir%/var/data.db 28 | ###< doctrine/doctrine-bundle ### 29 | 30 | ###> symfony/swiftmailer-bundle ### 31 | # For Gmail as a transport, use: "gmail://username:password@localhost" 32 | # For a generic SMTP server, use: "smtp://localhost:25?encryption=&auth_mode=" 33 | # Delivery is disabled by default via "null://localhost" 34 | MAILER_URL=null://localhost 35 | ###< symfony/swiftmailer-bundle ### 36 | -------------------------------------------------------------------------------- /.env.test: -------------------------------------------------------------------------------- 1 | # define your env variables for the test env here 2 | KERNEL_CLASS='App\Kernel' 3 | APP_SECRET='$ecretf0rt3st' 4 | SYMFONY_DEPRECATIONS_HELPER=999999 5 | PANTHER_APP_ENV=panther 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | ###> symfony/framework-bundle ### 3 | /.env.local 4 | /.env.local.php 5 | /.env.*.local 6 | /public/bundles/ 7 | /var/ 8 | /vendor/ 9 | ###< symfony/framework-bundle ### 10 | 11 | ###> symfony/phpunit-bridge ### 12 | .phpunit 13 | .phpunit.result.cache 14 | /phpunit.xml 15 | ###< symfony/phpunit-bridge ### 16 | 17 | ###> symfony/web-server-bundle ### 18 | /.web-server-pid 19 | ###< symfony/web-server-bundle ### 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # cours-symfony-session-panier 2 | Code de départ et final de la vidéo sur la session avec Symfony 3 | 4 | # Installation 5 | 1. Clonez le dépot chez vous 6 | 2. Lancez la migration : `php bin/console d:m:m` 7 | 3. Lancez la fixture : `php bin/console d:f:l --no-interaction` 8 | 4. Lancez le serveur interne : `php bin/console s:r` 9 | 5. Installez vous confortablement et suivez la vidéo :) 10 | -------------------------------------------------------------------------------- /bin/console: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | getParameterOption(['--env', '-e'], null, true)) { 23 | putenv('APP_ENV='.$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = $env); 24 | } 25 | 26 | if ($input->hasParameterOption('--no-debug', true)) { 27 | putenv('APP_DEBUG='.$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = '0'); 28 | } 29 | 30 | require dirname(__DIR__).'/config/bootstrap.php'; 31 | 32 | if ($_SERVER['APP_DEBUG']) { 33 | umask(0000); 34 | 35 | if (class_exists(Debug::class)) { 36 | Debug::enable(); 37 | } 38 | } 39 | 40 | $kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']); 41 | $application = new Application($kernel); 42 | $application->run($input); 43 | -------------------------------------------------------------------------------- /bin/phpunit: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | =1.2) 9 | if (is_array($env = @include dirname(__DIR__).'/.env.local.php')) { 10 | foreach ($env as $k => $v) { 11 | $_ENV[$k] = $_ENV[$k] ?? (isset($_SERVER[$k]) && 0 !== strpos($k, 'HTTP_') ? $_SERVER[$k] : $v); 12 | } 13 | } elseif (!class_exists(Dotenv::class)) { 14 | throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.'); 15 | } else { 16 | // load all the .env files 17 | (new Dotenv(false))->loadEnv(dirname(__DIR__).'/.env'); 18 | } 19 | 20 | $_SERVER += $_ENV; 21 | $_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) ?: 'dev'; 22 | $_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV']; 23 | $_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = (int) $_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN) ? '1' : '0'; 24 | -------------------------------------------------------------------------------- /config/bundles.php: -------------------------------------------------------------------------------- 1 | ['all' => true], 5 | Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true], 6 | Doctrine\Bundle\DoctrineCacheBundle\DoctrineCacheBundle::class => ['all' => true], 7 | Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], 8 | Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], 9 | Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], 10 | Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle::class => ['all' => true], 11 | Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], 12 | Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], 13 | Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], 14 | Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true, 'test' => true], 15 | Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true], 16 | Symfony\Bundle\WebServerBundle\WebServerBundle::class => ['dev' => true], 17 | Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], 18 | ]; 19 | -------------------------------------------------------------------------------- /config/packages/cache.yaml: -------------------------------------------------------------------------------- 1 | framework: 2 | cache: 3 | # Put the unique name of your app here: the prefix seed 4 | # is used to compute stable namespaces for cache keys. 5 | #prefix_seed: your_vendor_name/app_name 6 | 7 | # The app cache caches to the filesystem by default. 8 | # Other options include: 9 | 10 | # Redis 11 | #app: cache.adapter.redis 12 | #default_redis_provider: redis://localhost 13 | 14 | # APCu (not recommended with heavy random-write workloads as memory fragmentation can cause perf issues) 15 | #app: cache.adapter.apcu 16 | 17 | # Namespaced pools use the above "app" backend by default 18 | #pools: 19 | #my.dedicated.cache: null 20 | -------------------------------------------------------------------------------- /config/packages/dev/debug.yaml: -------------------------------------------------------------------------------- 1 | debug: 2 | # Forwards VarDumper Data clones to a centralized server allowing to inspect dumps on CLI or in your browser. 3 | # See the "server:dump" command to start a new server. 4 | dump_destination: "tcp://%env(VAR_DUMPER_SERVER)%" 5 | -------------------------------------------------------------------------------- /config/packages/dev/easy_log_handler.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | EasyCorp\EasyLog\EasyLogHandler: 3 | public: false 4 | arguments: ['%kernel.logs_dir%/%kernel.environment%.log'] 5 | 6 | #// FIXME: How to add this configuration automatically without messing up with the monolog configuration? 7 | #monolog: 8 | # handlers: 9 | # buffered: 10 | # type: buffer 11 | # handler: easylog 12 | # channels: ['!event'] 13 | # level: debug 14 | # easylog: 15 | # type: service 16 | # id: EasyCorp\EasyLog\EasyLogHandler 17 | -------------------------------------------------------------------------------- /config/packages/dev/monolog.yaml: -------------------------------------------------------------------------------- 1 | monolog: 2 | handlers: 3 | main: 4 | type: stream 5 | path: "%kernel.logs_dir%/%kernel.environment%.log" 6 | level: debug 7 | channels: ["!event"] 8 | # uncomment to get logging in your browser 9 | # you may have to allow bigger header sizes in your Web server configuration 10 | #firephp: 11 | # type: firephp 12 | # level: info 13 | #chromephp: 14 | # type: chromephp 15 | # level: info 16 | console: 17 | type: console 18 | process_psr_3_messages: false 19 | channels: ["!event", "!doctrine", "!console"] 20 | -------------------------------------------------------------------------------- /config/packages/dev/routing.yaml: -------------------------------------------------------------------------------- 1 | framework: 2 | router: 3 | strict_requirements: true 4 | -------------------------------------------------------------------------------- /config/packages/dev/swiftmailer.yaml: -------------------------------------------------------------------------------- 1 | # See https://symfony.com/doc/current/email/dev_environment.html 2 | swiftmailer: 3 | # send all emails to a specific address 4 | #delivery_addresses: ['me@example.com'] 5 | -------------------------------------------------------------------------------- /config/packages/dev/web_profiler.yaml: -------------------------------------------------------------------------------- 1 | web_profiler: 2 | toolbar: true 3 | intercept_redirects: false 4 | 5 | framework: 6 | profiler: { only_exceptions: false } 7 | -------------------------------------------------------------------------------- /config/packages/doctrine.yaml: -------------------------------------------------------------------------------- 1 | doctrine: 2 | dbal: 3 | # configure these for your database server 4 | driver: 'pdo_mysql' 5 | server_version: '5.7' 6 | charset: utf8mb4 7 | default_table_options: 8 | charset: utf8mb4 9 | collate: utf8mb4_unicode_ci 10 | 11 | url: '%env(resolve:DATABASE_URL)%' 12 | orm: 13 | auto_generate_proxy_classes: true 14 | naming_strategy: doctrine.orm.naming_strategy.underscore 15 | auto_mapping: true 16 | mappings: 17 | App: 18 | is_bundle: false 19 | type: annotation 20 | dir: '%kernel.project_dir%/src/Entity' 21 | prefix: 'App\Entity' 22 | alias: App 23 | -------------------------------------------------------------------------------- /config/packages/doctrine_migrations.yaml: -------------------------------------------------------------------------------- 1 | doctrine_migrations: 2 | dir_name: '%kernel.project_dir%/src/Migrations' 3 | # namespace is arbitrary but should be different from App\Migrations 4 | # as migrations classes should NOT be autoloaded 5 | namespace: DoctrineMigrations 6 | -------------------------------------------------------------------------------- /config/packages/framework.yaml: -------------------------------------------------------------------------------- 1 | framework: 2 | secret: '%env(APP_SECRET)%' 3 | #csrf_protection: true 4 | #http_method_override: true 5 | 6 | # Enables session support. Note that the session will ONLY be started if you read or write from it. 7 | # Remove or comment this section to explicitly disable session support. 8 | session: 9 | handler_id: null 10 | cookie_secure: auto 11 | cookie_samesite: lax 12 | 13 | #esi: true 14 | #fragments: true 15 | php_errors: 16 | log: true 17 | -------------------------------------------------------------------------------- /config/packages/prod/doctrine.yaml: -------------------------------------------------------------------------------- 1 | doctrine: 2 | orm: 3 | auto_generate_proxy_classes: false 4 | metadata_cache_driver: 5 | type: service 6 | id: doctrine.system_cache_provider 7 | query_cache_driver: 8 | type: service 9 | id: doctrine.system_cache_provider 10 | result_cache_driver: 11 | type: service 12 | id: doctrine.result_cache_provider 13 | 14 | services: 15 | doctrine.result_cache_provider: 16 | class: Symfony\Component\Cache\DoctrineProvider 17 | public: false 18 | arguments: 19 | - '@doctrine.result_cache_pool' 20 | doctrine.system_cache_provider: 21 | class: Symfony\Component\Cache\DoctrineProvider 22 | public: false 23 | arguments: 24 | - '@doctrine.system_cache_pool' 25 | 26 | framework: 27 | cache: 28 | pools: 29 | doctrine.result_cache_pool: 30 | adapter: cache.app 31 | doctrine.system_cache_pool: 32 | adapter: cache.system 33 | -------------------------------------------------------------------------------- /config/packages/prod/monolog.yaml: -------------------------------------------------------------------------------- 1 | monolog: 2 | handlers: 3 | main: 4 | type: fingers_crossed 5 | action_level: error 6 | handler: nested 7 | excluded_http_codes: [404, 405] 8 | nested: 9 | type: stream 10 | path: "%kernel.logs_dir%/%kernel.environment%.log" 11 | level: debug 12 | console: 13 | type: console 14 | process_psr_3_messages: false 15 | channels: ["!event", "!doctrine"] 16 | deprecation: 17 | type: stream 18 | path: "%kernel.logs_dir%/%kernel.environment%.deprecations.log" 19 | deprecation_filter: 20 | type: filter 21 | handler: deprecation 22 | max_level: info 23 | channels: ["php"] 24 | -------------------------------------------------------------------------------- /config/packages/routing.yaml: -------------------------------------------------------------------------------- 1 | framework: 2 | router: 3 | strict_requirements: null 4 | utf8: true 5 | -------------------------------------------------------------------------------- /config/packages/security.yaml: -------------------------------------------------------------------------------- 1 | security: 2 | # https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers 3 | providers: 4 | in_memory: { memory: null } 5 | firewalls: 6 | dev: 7 | pattern: ^/(_(profiler|wdt)|css|images|js)/ 8 | security: false 9 | main: 10 | anonymous: true 11 | 12 | # activate different ways to authenticate 13 | # https://symfony.com/doc/current/security.html#firewalls-authentication 14 | 15 | # https://symfony.com/doc/current/security/impersonating_user.html 16 | # switch_user: true 17 | 18 | # Easy way to control access for large sections of your site 19 | # Note: Only the *first* access control that matches will be used 20 | access_control: 21 | # - { path: ^/admin, roles: ROLE_ADMIN } 22 | # - { path: ^/profile, roles: ROLE_USER } 23 | -------------------------------------------------------------------------------- /config/packages/sensio_framework_extra.yaml: -------------------------------------------------------------------------------- 1 | sensio_framework_extra: 2 | router: 3 | annotations: false 4 | -------------------------------------------------------------------------------- /config/packages/swiftmailer.yaml: -------------------------------------------------------------------------------- 1 | swiftmailer: 2 | url: '%env(MAILER_URL)%' 3 | spool: { type: 'memory' } 4 | -------------------------------------------------------------------------------- /config/packages/test/framework.yaml: -------------------------------------------------------------------------------- 1 | framework: 2 | test: true 3 | session: 4 | storage_id: session.storage.mock_file 5 | -------------------------------------------------------------------------------- /config/packages/test/monolog.yaml: -------------------------------------------------------------------------------- 1 | monolog: 2 | handlers: 3 | main: 4 | type: stream 5 | path: "%kernel.logs_dir%/%kernel.environment%.log" 6 | level: debug 7 | channels: ["!event"] 8 | -------------------------------------------------------------------------------- /config/packages/test/routing.yaml: -------------------------------------------------------------------------------- 1 | framework: 2 | router: 3 | strict_requirements: true 4 | -------------------------------------------------------------------------------- /config/packages/test/swiftmailer.yaml: -------------------------------------------------------------------------------- 1 | swiftmailer: 2 | disable_delivery: true 3 | -------------------------------------------------------------------------------- /config/packages/test/validator.yaml: -------------------------------------------------------------------------------- 1 | framework: 2 | validation: 3 | not_compromised_password: false 4 | -------------------------------------------------------------------------------- /config/packages/test/web_profiler.yaml: -------------------------------------------------------------------------------- 1 | web_profiler: 2 | toolbar: false 3 | intercept_redirects: false 4 | 5 | framework: 6 | profiler: { collect: false } 7 | -------------------------------------------------------------------------------- /config/packages/translation.yaml: -------------------------------------------------------------------------------- 1 | framework: 2 | default_locale: en 3 | translator: 4 | default_path: '%kernel.project_dir%/translations' 5 | fallbacks: 6 | - en 7 | -------------------------------------------------------------------------------- /config/packages/twig.yaml: -------------------------------------------------------------------------------- 1 | twig: 2 | default_path: '%kernel.project_dir%/templates' 3 | debug: '%kernel.debug%' 4 | strict_variables: '%kernel.debug%' 5 | -------------------------------------------------------------------------------- /config/packages/validator.yaml: -------------------------------------------------------------------------------- 1 | framework: 2 | validation: 3 | email_validation_mode: html5 4 | 5 | # Enables validator auto-mapping support. 6 | # For instance, basic validation constraints will be inferred from Doctrine's metadata. 7 | #auto_mapping: 8 | # App\Entity\: [] 9 | -------------------------------------------------------------------------------- /config/routes.yaml: -------------------------------------------------------------------------------- 1 | #index: 2 | # path: / 3 | # controller: App\Controller\DefaultController::index 4 | -------------------------------------------------------------------------------- /config/routes/annotations.yaml: -------------------------------------------------------------------------------- 1 | controllers: 2 | resource: ../../src/Controller/ 3 | type: annotation 4 | -------------------------------------------------------------------------------- /config/routes/dev/twig.yaml: -------------------------------------------------------------------------------- 1 | _errors: 2 | resource: '@TwigBundle/Resources/config/routing/errors.xml' 3 | prefix: /_error 4 | -------------------------------------------------------------------------------- /config/routes/dev/web_profiler.yaml: -------------------------------------------------------------------------------- 1 | web_profiler_wdt: 2 | resource: '@WebProfilerBundle/Resources/config/routing/wdt.xml' 3 | prefix: /_wdt 4 | 5 | web_profiler_profiler: 6 | resource: '@WebProfilerBundle/Resources/config/routing/profiler.xml' 7 | prefix: /_profiler 8 | -------------------------------------------------------------------------------- /config/services.yaml: -------------------------------------------------------------------------------- 1 | # This file is the entry point to configure your own services. 2 | # Files in the packages/ subdirectory configure your dependencies. 3 | 4 | # Put parameters here that don't need to change on each machine where the app is deployed 5 | # https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration 6 | parameters: 7 | 8 | services: 9 | # default configuration for services in *this* file 10 | _defaults: 11 | autowire: true # Automatically injects dependencies in your services. 12 | autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. 13 | 14 | # makes classes in src/ available to be used as services 15 | # this creates a service per class whose id is the fully-qualified class name 16 | App\: 17 | resource: '../src/*' 18 | exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}' 19 | 20 | # controllers are imported separately to make sure services can be injected 21 | # as action arguments even if you don't extend any base controller class 22 | App\Controller\: 23 | resource: '../src/Controller' 24 | tags: ['controller.service_arguments'] 25 | 26 | # add more service definitions when explicit configuration is needed 27 | # please note that last definitions always *replace* previous ones 28 | -------------------------------------------------------------------------------- /phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | tests 21 | 22 | 23 | 24 | 25 | 26 | src 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 | handle($request); 26 | $response->send(); 27 | $kernel->terminate($request, $response); 28 | -------------------------------------------------------------------------------- /src/Controller/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liorchamla/cours-symfony-session-panier/93bb46c9ee8342465525439ed2427fc021727678/src/Controller/.gitignore -------------------------------------------------------------------------------- /src/Controller/CartController.php: -------------------------------------------------------------------------------- 1 | render('cart/index.html.twig', []); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/Controller/ProductController.php: -------------------------------------------------------------------------------- 1 | render('product/index.html.twig', [ 17 | 'products' => $productRepository->findAll() 18 | ]); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/DataFixtures/AppFixtures.php: -------------------------------------------------------------------------------- 1 | addProvider(new \Bezhanov\Faker\Provider\Commerce($faker)); 15 | $faker->addProvider(new \Liior\Faker\Prices($faker)); 16 | 17 | for ($i = 0; $i < 10; $i++) { 18 | $product = new Product(); 19 | $product->setTitle($faker->productName) 20 | ->setPrice($faker->price(20, 200)) 21 | ->setImage($faker->imageUrl(400, 400)); 22 | 23 | $manager->persist($product); 24 | } 25 | 26 | $manager->flush(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/Entity/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liorchamla/cours-symfony-session-panier/93bb46c9ee8342465525439ed2427fc021727678/src/Entity/.gitignore -------------------------------------------------------------------------------- /src/Entity/Product.php: -------------------------------------------------------------------------------- 1 | id; 37 | } 38 | 39 | public function getTitle(): ?string 40 | { 41 | return $this->title; 42 | } 43 | 44 | public function setTitle(string $title): self 45 | { 46 | $this->title = $title; 47 | 48 | return $this; 49 | } 50 | 51 | public function getImage(): ?string 52 | { 53 | return $this->image; 54 | } 55 | 56 | public function setImage(string $image): self 57 | { 58 | $this->image = $image; 59 | 60 | return $this; 61 | } 62 | 63 | public function getPrice(): ?float 64 | { 65 | return $this->price; 66 | } 67 | 68 | public function setPrice(float $price): self 69 | { 70 | $this->price = $price; 71 | 72 | return $this; 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /src/Kernel.php: -------------------------------------------------------------------------------- 1 | getProjectDir().'/config/bundles.php'; 21 | foreach ($contents as $class => $envs) { 22 | if ($envs[$this->environment] ?? $envs['all'] ?? false) { 23 | yield new $class(); 24 | } 25 | } 26 | } 27 | 28 | public function getProjectDir(): string 29 | { 30 | return \dirname(__DIR__); 31 | } 32 | 33 | protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader): void 34 | { 35 | $container->addResource(new FileResource($this->getProjectDir().'/config/bundles.php')); 36 | $container->setParameter('container.dumper.inline_class_loader', true); 37 | $confDir = $this->getProjectDir().'/config'; 38 | 39 | $loader->load($confDir.'/{packages}/*'.self::CONFIG_EXTS, 'glob'); 40 | $loader->load($confDir.'/{packages}/'.$this->environment.'/**/*'.self::CONFIG_EXTS, 'glob'); 41 | $loader->load($confDir.'/{services}'.self::CONFIG_EXTS, 'glob'); 42 | $loader->load($confDir.'/{services}_'.$this->environment.self::CONFIG_EXTS, 'glob'); 43 | } 44 | 45 | protected function configureRoutes(RouteCollectionBuilder $routes): void 46 | { 47 | $confDir = $this->getProjectDir().'/config'; 48 | 49 | $routes->import($confDir.'/{routes}/'.$this->environment.'/**/*'.self::CONFIG_EXTS, '/', 'glob'); 50 | $routes->import($confDir.'/{routes}/*'.self::CONFIG_EXTS, '/', 'glob'); 51 | $routes->import($confDir.'/{routes}'.self::CONFIG_EXTS, '/', 'glob'); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/Migrations/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liorchamla/cours-symfony-session-panier/93bb46c9ee8342465525439ed2427fc021727678/src/Migrations/.gitignore -------------------------------------------------------------------------------- /src/Migrations/Version20190926192607.php: -------------------------------------------------------------------------------- 1 | abortIf($this->connection->getDatabasePlatform()->getName() !== 'sqlite', 'Migration can only be executed safely on \'sqlite\'.'); 24 | 25 | $this->addSql('CREATE TABLE product (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, title VARCHAR(255) NOT NULL, image VARCHAR(255) NOT NULL, price DOUBLE PRECISION NOT NULL)'); 26 | } 27 | 28 | public function down(Schema $schema) : void 29 | { 30 | // this down() migration is auto-generated, please modify it to your needs 31 | $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'sqlite', 'Migration can only be executed safely on \'sqlite\'.'); 32 | 33 | $this->addSql('DROP TABLE product'); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/Repository/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liorchamla/cours-symfony-session-panier/93bb46c9ee8342465525439ed2427fc021727678/src/Repository/.gitignore -------------------------------------------------------------------------------- /src/Repository/ProductRepository.php: -------------------------------------------------------------------------------- 1 | createQueryBuilder('p') 29 | ->andWhere('p.exampleField = :val') 30 | ->setParameter('val', $value) 31 | ->orderBy('p.id', 'ASC') 32 | ->setMaxResults(10) 33 | ->getQuery() 34 | ->getResult() 35 | ; 36 | } 37 | */ 38 | 39 | /* 40 | public function findOneBySomeField($value): ?Product 41 | { 42 | return $this->createQueryBuilder('p') 43 | ->andWhere('p.exampleField = :val') 44 | ->setParameter('val', $value) 45 | ->getQuery() 46 | ->getOneOrNullResult() 47 | ; 48 | } 49 | */ 50 | } 51 | -------------------------------------------------------------------------------- /symfony.lock: -------------------------------------------------------------------------------- 1 | { 2 | "doctrine/annotations": { 3 | "version": "1.0", 4 | "recipe": { 5 | "repo": "github.com/symfony/recipes", 6 | "branch": "master", 7 | "version": "1.0", 8 | "ref": "cb4152ebcadbe620ea2261da1a1c5a9b8cea7672" 9 | }, 10 | "files": [ 11 | "./config/routes/annotations.yaml" 12 | ] 13 | }, 14 | "doctrine/cache": { 15 | "version": "v1.8.0" 16 | }, 17 | "doctrine/collections": { 18 | "version": "v1.6.2" 19 | }, 20 | "doctrine/common": { 21 | "version": "v2.11.0" 22 | }, 23 | "doctrine/data-fixtures": { 24 | "version": "v1.3.2" 25 | }, 26 | "doctrine/dbal": { 27 | "version": "v2.9.2" 28 | }, 29 | "doctrine/doctrine-bundle": { 30 | "version": "1.6", 31 | "recipe": { 32 | "repo": "github.com/symfony/recipes", 33 | "branch": "master", 34 | "version": "1.6", 35 | "ref": "5e476e8edf3fa8e7f045ad034f89bb464424f5c1" 36 | }, 37 | "files": [ 38 | "./config/packages/doctrine.yaml", 39 | "./config/packages/prod/doctrine.yaml", 40 | "./src/Entity/.gitignore", 41 | "./src/Repository/.gitignore" 42 | ] 43 | }, 44 | "doctrine/doctrine-cache-bundle": { 45 | "version": "1.3.5" 46 | }, 47 | "doctrine/doctrine-fixtures-bundle": { 48 | "version": "3.0", 49 | "recipe": { 50 | "repo": "github.com/symfony/recipes", 51 | "branch": "master", 52 | "version": "3.0", 53 | "ref": "fc52d86631a6dfd9fdf3381d0b7e3df2069e51b3" 54 | }, 55 | "files": [ 56 | "./src/DataFixtures/AppFixtures.php" 57 | ] 58 | }, 59 | "doctrine/doctrine-migrations-bundle": { 60 | "version": "1.2", 61 | "recipe": { 62 | "repo": "github.com/symfony/recipes", 63 | "branch": "master", 64 | "version": "1.2", 65 | "ref": "c1431086fec31f17fbcfe6d6d7e92059458facc1" 66 | }, 67 | "files": [ 68 | "./config/packages/doctrine_migrations.yaml", 69 | "./src/Migrations/.gitignore" 70 | ] 71 | }, 72 | "doctrine/event-manager": { 73 | "version": "v1.0.0" 74 | }, 75 | "doctrine/inflector": { 76 | "version": "v1.3.0" 77 | }, 78 | "doctrine/instantiator": { 79 | "version": "1.2.0" 80 | }, 81 | "doctrine/lexer": { 82 | "version": "1.1.0" 83 | }, 84 | "doctrine/migrations": { 85 | "version": "2.1.1" 86 | }, 87 | "doctrine/orm": { 88 | "version": "v2.6.4" 89 | }, 90 | "doctrine/persistence": { 91 | "version": "1.1.1" 92 | }, 93 | "doctrine/reflection": { 94 | "version": "v1.0.0" 95 | }, 96 | "easycorp/easy-log-handler": { 97 | "version": "1.0", 98 | "recipe": { 99 | "repo": "github.com/symfony/recipes", 100 | "branch": "master", 101 | "version": "1.0", 102 | "ref": "70062abc2cd58794d2a90274502f81b55cd9951b" 103 | }, 104 | "files": [ 105 | "./config/packages/dev/easy_log_handler.yaml" 106 | ] 107 | }, 108 | "egulias/email-validator": { 109 | "version": "2.1.11" 110 | }, 111 | "fig/link-util": { 112 | "version": "1.0.0" 113 | }, 114 | "fzaninotto/faker": { 115 | "version": "v1.8.0" 116 | }, 117 | "jdorn/sql-formatter": { 118 | "version": "v1.2.17" 119 | }, 120 | "liorchamla/faker-prices": { 121 | "version": "v1.0.1" 122 | }, 123 | "mbezhanov/faker-provider-collection": { 124 | "version": "1.2.1" 125 | }, 126 | "monolog/monolog": { 127 | "version": "1.25.1" 128 | }, 129 | "nikic/php-parser": { 130 | "version": "v4.2.4" 131 | }, 132 | "ocramius/package-versions": { 133 | "version": "1.4.0" 134 | }, 135 | "ocramius/proxy-manager": { 136 | "version": "2.2.3" 137 | }, 138 | "phpdocumentor/reflection-common": { 139 | "version": "2.0.0" 140 | }, 141 | "phpdocumentor/reflection-docblock": { 142 | "version": "4.3.2" 143 | }, 144 | "phpdocumentor/type-resolver": { 145 | "version": "1.0.1" 146 | }, 147 | "psr/cache": { 148 | "version": "1.0.1" 149 | }, 150 | "psr/container": { 151 | "version": "1.0.0" 152 | }, 153 | "psr/link": { 154 | "version": "1.0.0" 155 | }, 156 | "psr/log": { 157 | "version": "1.1.0" 158 | }, 159 | "sensio/framework-extra-bundle": { 160 | "version": "5.2", 161 | "recipe": { 162 | "repo": "github.com/symfony/recipes", 163 | "branch": "master", 164 | "version": "5.2", 165 | "ref": "fb7e19da7f013d0d422fa9bce16f5c510e27609b" 166 | }, 167 | "files": [ 168 | "./config/packages/sensio_framework_extra.yaml" 169 | ] 170 | }, 171 | "swiftmailer/swiftmailer": { 172 | "version": "v6.2.1" 173 | }, 174 | "symfony/asset": { 175 | "version": "v4.3.4" 176 | }, 177 | "symfony/browser-kit": { 178 | "version": "v4.3.4" 179 | }, 180 | "symfony/cache": { 181 | "version": "v4.3.4" 182 | }, 183 | "symfony/cache-contracts": { 184 | "version": "v1.1.5" 185 | }, 186 | "symfony/config": { 187 | "version": "v4.3.4" 188 | }, 189 | "symfony/console": { 190 | "version": "3.3", 191 | "recipe": { 192 | "repo": "github.com/symfony/recipes", 193 | "branch": "master", 194 | "version": "3.3", 195 | "ref": "482d233eb8de91ebd042992077bbd5838858890c" 196 | }, 197 | "files": [ 198 | "./bin/console", 199 | "./config/bootstrap.php" 200 | ] 201 | }, 202 | "symfony/css-selector": { 203 | "version": "v4.3.4" 204 | }, 205 | "symfony/debug": { 206 | "version": "v4.3.4" 207 | }, 208 | "symfony/debug-bundle": { 209 | "version": "4.1", 210 | "recipe": { 211 | "repo": "github.com/symfony/recipes", 212 | "branch": "master", 213 | "version": "4.1", 214 | "ref": "f8863cbad2f2e58c4b65fa1eac892ab189971bea" 215 | }, 216 | "files": [ 217 | "./config/packages/dev/debug.yaml" 218 | ] 219 | }, 220 | "symfony/debug-pack": { 221 | "version": "v1.0.7" 222 | }, 223 | "symfony/dependency-injection": { 224 | "version": "v4.3.4" 225 | }, 226 | "symfony/doctrine-bridge": { 227 | "version": "v4.3.4" 228 | }, 229 | "symfony/dom-crawler": { 230 | "version": "v4.3.4" 231 | }, 232 | "symfony/dotenv": { 233 | "version": "v4.3.4" 234 | }, 235 | "symfony/event-dispatcher": { 236 | "version": "v4.3.4" 237 | }, 238 | "symfony/event-dispatcher-contracts": { 239 | "version": "v1.1.5" 240 | }, 241 | "symfony/expression-language": { 242 | "version": "v4.3.4" 243 | }, 244 | "symfony/filesystem": { 245 | "version": "v4.3.4" 246 | }, 247 | "symfony/finder": { 248 | "version": "v4.3.4" 249 | }, 250 | "symfony/flex": { 251 | "version": "1.0", 252 | "recipe": { 253 | "repo": "github.com/symfony/recipes", 254 | "branch": "master", 255 | "version": "1.0", 256 | "ref": "dc3fc2e0334a4137c47cfd5a3ececc601fa61a0b" 257 | }, 258 | "files": [ 259 | "./.env" 260 | ] 261 | }, 262 | "symfony/form": { 263 | "version": "v4.3.4" 264 | }, 265 | "symfony/framework-bundle": { 266 | "version": "4.2", 267 | "recipe": { 268 | "repo": "github.com/symfony/recipes", 269 | "branch": "master", 270 | "version": "4.2", 271 | "ref": "61ad963f28c091b8bb9449507654b9c7d8bbb53c" 272 | }, 273 | "files": [ 274 | "./config/bootstrap.php", 275 | "./config/packages/cache.yaml", 276 | "./config/packages/framework.yaml", 277 | "./config/packages/test/framework.yaml", 278 | "./config/services.yaml", 279 | "./public/index.php", 280 | "./src/Controller/.gitignore", 281 | "./src/Kernel.php" 282 | ] 283 | }, 284 | "symfony/http-client": { 285 | "version": "v4.3.4" 286 | }, 287 | "symfony/http-client-contracts": { 288 | "version": "v1.1.6" 289 | }, 290 | "symfony/http-foundation": { 291 | "version": "v4.3.4" 292 | }, 293 | "symfony/http-kernel": { 294 | "version": "v4.3.4" 295 | }, 296 | "symfony/inflector": { 297 | "version": "v4.3.4" 298 | }, 299 | "symfony/intl": { 300 | "version": "v4.3.4" 301 | }, 302 | "symfony/maker-bundle": { 303 | "version": "1.0", 304 | "recipe": { 305 | "repo": "github.com/symfony/recipes", 306 | "branch": "master", 307 | "version": "1.0", 308 | "ref": "fadbfe33303a76e25cb63401050439aa9b1a9c7f" 309 | } 310 | }, 311 | "symfony/mime": { 312 | "version": "v4.3.4" 313 | }, 314 | "symfony/monolog-bridge": { 315 | "version": "v4.3.4" 316 | }, 317 | "symfony/monolog-bundle": { 318 | "version": "3.3", 319 | "recipe": { 320 | "repo": "github.com/symfony/recipes", 321 | "branch": "master", 322 | "version": "3.3", 323 | "ref": "6240c6d43e8237a32452f057f81816820fd56ab6" 324 | }, 325 | "files": [ 326 | "./config/packages/dev/monolog.yaml", 327 | "./config/packages/prod/monolog.yaml", 328 | "./config/packages/test/monolog.yaml" 329 | ] 330 | }, 331 | "symfony/options-resolver": { 332 | "version": "v4.3.4" 333 | }, 334 | "symfony/orm-pack": { 335 | "version": "v1.0.6" 336 | }, 337 | "symfony/phpunit-bridge": { 338 | "version": "4.3", 339 | "recipe": { 340 | "repo": "github.com/symfony/recipes", 341 | "branch": "master", 342 | "version": "4.3", 343 | "ref": "b0582341f1df39aaf3a9a866cdbe49937da35984" 344 | }, 345 | "files": [ 346 | "./.env.test", 347 | "./bin/phpunit", 348 | "./config/bootstrap.php", 349 | "./phpunit.xml.dist", 350 | "./tests/.gitignore" 351 | ] 352 | }, 353 | "symfony/polyfill-intl-icu": { 354 | "version": "v1.12.0" 355 | }, 356 | "symfony/polyfill-intl-idn": { 357 | "version": "v1.12.0" 358 | }, 359 | "symfony/polyfill-mbstring": { 360 | "version": "v1.12.0" 361 | }, 362 | "symfony/polyfill-php72": { 363 | "version": "v1.12.0" 364 | }, 365 | "symfony/polyfill-php73": { 366 | "version": "v1.12.0" 367 | }, 368 | "symfony/process": { 369 | "version": "v4.3.4" 370 | }, 371 | "symfony/profiler-pack": { 372 | "version": "v1.0.4" 373 | }, 374 | "symfony/property-access": { 375 | "version": "v4.3.4" 376 | }, 377 | "symfony/property-info": { 378 | "version": "v4.3.4" 379 | }, 380 | "symfony/routing": { 381 | "version": "4.2", 382 | "recipe": { 383 | "repo": "github.com/symfony/recipes", 384 | "branch": "master", 385 | "version": "4.2", 386 | "ref": "4c107a8d23a16b997178fbd4103b8d2f54f688b7" 387 | }, 388 | "files": [ 389 | "./config/packages/dev/routing.yaml", 390 | "./config/packages/routing.yaml", 391 | "./config/packages/test/routing.yaml", 392 | "./config/routes.yaml" 393 | ] 394 | }, 395 | "symfony/security-bundle": { 396 | "version": "3.3", 397 | "recipe": { 398 | "repo": "github.com/symfony/recipes", 399 | "branch": "master", 400 | "version": "3.3", 401 | "ref": "e5a0228251d1dd2bca4c8ef918e14423c06db625" 402 | }, 403 | "files": [ 404 | "./config/packages/security.yaml" 405 | ] 406 | }, 407 | "symfony/security-core": { 408 | "version": "v4.3.4" 409 | }, 410 | "symfony/security-csrf": { 411 | "version": "v4.3.4" 412 | }, 413 | "symfony/security-guard": { 414 | "version": "v4.3.4" 415 | }, 416 | "symfony/security-http": { 417 | "version": "v4.3.4" 418 | }, 419 | "symfony/serializer": { 420 | "version": "v4.3.4" 421 | }, 422 | "symfony/serializer-pack": { 423 | "version": "v1.0.2" 424 | }, 425 | "symfony/service-contracts": { 426 | "version": "v1.1.6" 427 | }, 428 | "symfony/stopwatch": { 429 | "version": "v4.3.4" 430 | }, 431 | "symfony/swiftmailer-bundle": { 432 | "version": "2.5", 433 | "recipe": { 434 | "repo": "github.com/symfony/recipes", 435 | "branch": "master", 436 | "version": "2.5", 437 | "ref": "429afc6c6778a1fdddb52a4f708cd94ff2c9960f" 438 | }, 439 | "files": [ 440 | "./config/packages/dev/swiftmailer.yaml", 441 | "./config/packages/swiftmailer.yaml", 442 | "./config/packages/test/swiftmailer.yaml" 443 | ] 444 | }, 445 | "symfony/test-pack": { 446 | "version": "v1.0.6" 447 | }, 448 | "symfony/translation": { 449 | "version": "3.3", 450 | "recipe": { 451 | "repo": "github.com/symfony/recipes", 452 | "branch": "master", 453 | "version": "3.3", 454 | "ref": "2ad9d2545bce8ca1a863e50e92141f0b9d87ffcd" 455 | }, 456 | "files": [ 457 | "./config/packages/translation.yaml", 458 | "./translations/.gitignore" 459 | ] 460 | }, 461 | "symfony/translation-contracts": { 462 | "version": "v1.1.6" 463 | }, 464 | "symfony/twig-bridge": { 465 | "version": "v4.3.4" 466 | }, 467 | "symfony/twig-bundle": { 468 | "version": "3.3", 469 | "recipe": { 470 | "repo": "github.com/symfony/recipes", 471 | "branch": "master", 472 | "version": "3.3", 473 | "ref": "369b5b29dc52b2c190002825ae7ec24ab6f962dd" 474 | }, 475 | "files": [ 476 | "./config/packages/twig.yaml", 477 | "./config/routes/dev/twig.yaml", 478 | "./templates/base.html.twig" 479 | ] 480 | }, 481 | "symfony/validator": { 482 | "version": "4.3", 483 | "recipe": { 484 | "repo": "github.com/symfony/recipes", 485 | "branch": "master", 486 | "version": "4.3", 487 | "ref": "d902da3e4952f18d3bf05aab29512eb61cabd869" 488 | }, 489 | "files": [ 490 | "./config/packages/test/validator.yaml", 491 | "./config/packages/validator.yaml" 492 | ] 493 | }, 494 | "symfony/var-dumper": { 495 | "version": "v4.3.4" 496 | }, 497 | "symfony/var-exporter": { 498 | "version": "v4.3.4" 499 | }, 500 | "symfony/web-link": { 501 | "version": "v4.3.4" 502 | }, 503 | "symfony/web-profiler-bundle": { 504 | "version": "3.3", 505 | "recipe": { 506 | "repo": "github.com/symfony/recipes", 507 | "branch": "master", 508 | "version": "3.3", 509 | "ref": "6bdfa1a95f6b2e677ab985cd1af2eae35d62e0f6" 510 | }, 511 | "files": [ 512 | "./config/packages/dev/web_profiler.yaml", 513 | "./config/packages/test/web_profiler.yaml", 514 | "./config/routes/dev/web_profiler.yaml" 515 | ] 516 | }, 517 | "symfony/web-server-bundle": { 518 | "version": "3.3", 519 | "recipe": { 520 | "repo": "github.com/symfony/recipes", 521 | "branch": "master", 522 | "version": "3.3", 523 | "ref": "dae9b39fd6717970be7601101ce5aa960bf53d9a" 524 | } 525 | }, 526 | "symfony/yaml": { 527 | "version": "v4.3.4" 528 | }, 529 | "twig/twig": { 530 | "version": "v2.11.3" 531 | }, 532 | "webmozart/assert": { 533 | "version": "1.5.0" 534 | }, 535 | "zendframework/zend-code": { 536 | "version": "3.3.2" 537 | }, 538 | "zendframework/zend-eventmanager": { 539 | "version": "3.2.1" 540 | } 541 | } 542 | -------------------------------------------------------------------------------- /templates/base.html.twig: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {% block title %}Welcome! 7 | {% endblock %} 8 | 9 | {% block stylesheets %} 10 | 11 | 12 | {% endblock %} 13 | 14 | 15 | 33 | 34 |
{% block body %}{% endblock %} 35 |
36 | {% block javascripts %}{% endblock %} 37 | 38 | 39 | -------------------------------------------------------------------------------- /templates/cart/index.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'base.html.twig' %} 2 | 3 | {% block title %}Hello CartController! 4 | {% endblock %} 5 | 6 | {% block body %} 7 |
8 |

Votre panier

9 |
10 | 11 |

Surprise, c'est vide !

12 | {% endblock %} 13 | -------------------------------------------------------------------------------- /templates/product/index.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'base.html.twig' %} 2 | 3 | {% block title %}Les produits 4 | {% endblock %} 5 | 6 | {% block body %} 7 |
8 |

Les produits

9 |
10 | 11 |
12 | {% for product in products %} 13 |
14 |
15 |

16 | {{ product.title }} 17 | - 18 | {{ product.price }} 19 | € 20 |

21 | Image de {{ product.title }} 22 |
23 | 24 | 25 | Ajouter 26 | 27 |
28 | 29 |
30 | {% endfor %} 31 |
32 | {% endblock %} 33 | -------------------------------------------------------------------------------- /tests/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liorchamla/cours-symfony-session-panier/93bb46c9ee8342465525439ed2427fc021727678/tests/.gitignore -------------------------------------------------------------------------------- /translations/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liorchamla/cours-symfony-session-panier/93bb46c9ee8342465525439ed2427fc021727678/translations/.gitignore --------------------------------------------------------------------------------