Deploying Symfony on Heroku - symfony

I'm trying to deploy a Symfony 5.2 on Heroku, I've already configured the Procfile and the required Config Vars such APP_ENV (prod), APP_SECRET and others related to the project.
Procfile:
web: vendor/bin/heroku-php-apache2 public/
composer.json:
{
"type": "project",
"license": "proprietary",
"require": {
"php": "^7.2.5",
"ext-ctype": "*",
"ext-iconv": "*",
"knplabs/knp-paginator-bundle": "^5.2",
"lexik/jwt-authentication-bundle": "^2.8",
"nelmio/cors-bundle": "^2.0",
"sensio/framework-extra-bundle": "^5.5",
"symfony/asset": "5.1.*",
"symfony/console": "5.1.*",
"symfony/dotenv": "5.1.*",
"symfony/flex": "^1.3.1",
"symfony/framework-bundle": "5.1.*",
"symfony/mailer": "5.1.*",
"symfony/orm-pack": "^1.0",
"symfony/security-bundle": "5.1.*",
"symfony/serializer": "5.1.*",
"symfony/yaml": "5.1.*",
"twig/twig": "^3.0"
},
"require-dev": {
"doctrine/doctrine-fixtures-bundle": "^3.3",
"symfony/maker-bundle": "^1.19",
"symfony/profiler-pack": "^1.0"
},
"config": {
"optimize-autoloader": true,
"preferred-install": {
"*": "dist"
},
"sort-packages": true
},
"autoload": {
"psr-4": {
"App\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"App\\Tests\\": "tests/"
}
},
"replace": {
"paragonie/random_compat": "2.*",
"symfony/polyfill-ctype": "*",
"symfony/polyfill-iconv": "*",
"symfony/polyfill-php72": "*",
"symfony/polyfill-php71": "*",
"symfony/polyfill-php70": "*",
"symfony/polyfill-php56": "*"
},
"scripts": {
"auto-scripts": {
"cache:clear": "symfony-cmd",
"assets:install %PUBLIC_DIR%": "symfony-cmd"
},
"post-install-cmd": [
"#auto-scripts"
],
"post-update-cmd": [
"#auto-scripts"
],
"compile": [
"php bin/console doctrine:migrations:migrate"
]
},
"conflict": {
"symfony/symfony": "*"
},
"extra": {
"symfony": {
"allow-contrib": false,
"require": "5.1.*"
}
}
}
No matter what I do I always end up with an error related to something missing such as:
PHP Fatal error: Uncaught Error: Class 'Symfony\Bundle\TwigBundle\TwigBundle' not found in /tmp/build_271a300c_/vendor/symfony/framework-bundle/Kernel/MicroKernelTrait.php:74
My guess is the problem is related with everything ending up in this /tmp/build_271a300c_ folder and when the project is deployed it lost the refereed folder. But I have no idea what to do with this information I appreciate any help.

Solved the problem with, what I think, is nothing more than a workaround.
The deploy process was complaining always about the require-dev dependencies, so I did:
Moved all require-dev to require;
Run composer update to refresh the composer.lock file;
Pushed and tried the deploy again with success.
This solution was take for many people in other issues I read, I'm just describing step-by-step what was done to fix it. Still, I don't think it's the correct fix for this, after all the dev-dependencies shouldn't being installed on prod environment.

Related

Try to update Sonata, have error with jms-serializer

I need to update my bundles for security reasons but when i try to do a composer update, i have a lot of problem with sonata.
First, SonataCore, sonataMedia and JMS-serializer disappear.
bundles.php
If a tried to reinstall SonataCore with composer require sonata-project/core-bundle
i have this error: Problem 1 - Root composer.json requires sonata-project/core-bundle ^3.20 -> satisfiable by sonata-project/core-bundle[3.20.0]. - sonata-project/core-bundle 3.20.0 requires sonata-project/form-extensions ^0.1 -> found sonata-project/form-extensions[0.1.0, 0.1.1, 0.1.2] but the package is fixed to 1.16.1 (lock file version) by a partial update and that version does not match. Make sure you list it as an argument for the update command.
If a tried to reinstall SonataMedia with composer require sonata-project/media-bundle,
i have this error: Problem 1 - sonata-project/media-bundle[4.1.0, ..., 4.1.5] require doctrine/persistence ^2.0 -> found doctrine/persistence[2.0.0, ..., 2.5.3] but the package is fixed to 1.3.8 (lock file version) by a partial update and that version does not match. Make sure you list it as an argument for the update command. - Root composer.json requires sonata-project/media-bundle ^4.1 -> satisfiable by sonata-project/media-bundle[4.1.0, ..., 4.1.5].
I can install JMS-Serializer but then, i have an error with jms_serializer.handler_registry even though i use it nowhere in my code (but it appears in the cache).
My composer.json :
"type": "project",
"license": "proprietary",
"require": {
"php": "^7.1.3",
"ext-ctype": "*",
"ext-iconv": "*",
"ext-json": "*",
"composer/package-versions-deprecated": "1.11.99.5",
"dekalee/mailjet-bundle": "^2.1",
"doctrine/common": "^2",
"doctrine/doctrine-bundle": "^2",
"doctrine/doctrine-migrations-bundle": "^2",
"doctrine/orm": "^2",
"friendsofsymfony/rest-bundle": "^2.6",
"friendsofsymfony/user-bundle": "~2.0",
"guzzlehttp/guzzle": "^6.5",
"hslavich/oneloginsaml-bundle": "^1.4",
"jmose/command-scheduler-bundle": "^2.2",
"jms/serializer-bundle": "^4.0",
"michaeldegroot/doctrine-encrypt-bundle": "^4.0",
"nelmio/api-doc-bundle": "^3.5",
"paragonie/halite": "^4",
"phpoffice/phpspreadsheet": "^1.10",
"sonata-project/admin-bundle": "^3.56",
"sonata-project/doctrine-orm-admin-bundle": "^3.12",
"sonata-project/formatter-bundle": "^4.1",
"sonata-project/intl-bundle": "^2.7",
"sonata-project/user-bundle": "^4.5",
"symfony/console": "4.4.*",
"symfony/dotenv": "4.4.*",
"symfony/flex": "^1.3.1",
"symfony/framework-bundle": "4.4.*",
"symfony/mailer": "4.4.*",
"symfony/mime": "4.4.*",
"symfony/monolog-bundle": "^3.5",
"symfony/serializer": "4.4.*",
"symfony/swiftmailer-bundle": "^3.4",
"symfony/translation": "4.4.*",
"symfony/twig-bundle": "4.4.*",
"symfony/yaml": "4.4.*",
"twig/extra-bundle": "^2.12|^3.0",
"twig/twig": "^2.12|^3.0",
"vich/uploader-bundle": "^1.12"
},
"require-dev": {
"sonata-project/easy-extends-bundle": "^2.5",
"symfony/debug-bundle": "4.4.*",
"symfony/maker-bundle": "^1.14",
"symfony/stopwatch": "4.4.*",
"symfony/web-profiler-bundle": "4.4.*"
},
"config": {
"preferred-install": {
"*": "dist"
},
"sort-packages": true,
"allow-plugins": {
"ocramius/package-versions": true,
"symfony/flex": true
}
},
"autoload": {
"psr-4": {
"App\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"App\\Tests\\": "tests/"
}
},
"replace": {
"paragonie/random_compat": "2.*",
"symfony/polyfill-ctype": "*",
"symfony/polyfill-iconv": "*",
"symfony/polyfill-php71": "*",
"symfony/polyfill-php70": "*",
"symfony/polyfill-php56": "*"
},
"scripts": {
"auto-scripts": {
"cache:clear": "symfony-cmd",
"assets:install %PUBLIC_DIR%": "symfony-cmd"
},
"post-install-cmd": [
"#auto-scripts"
],
"post-update-cmd": [
"#auto-scripts"
]
},
"conflict": {
"symfony/symfony": "*"
},
"extra": {
"symfony": {
"allow-contrib": "true",
"require": "4.4.*"
}
}
}
I'm a novice in project management so i have no idea how to resolve all of this, i hope you can help me.

sh: symfony-cmd: command not found

I have downgraded a Symfony 5.2 app template to use Symfony 4.4 in order to allow the use of some libraries that require an older version of Symfony. The problem is that when I do composer install, I get this error near the end of the installation:
sh: symfony-cmd: command not found
It seems that the installations are mostly successful, as my vendor folder is created and populated. But I'm worried about the error.
What does this error mean? How do I fix it?
====
Edit: Here's my composer.json file:
{
"type": "project",
"license": "proprietary",
"minimum-stability": "dev",
"prefer-stable": true,
"require": {
"php": ">=7.4.0",
"ext-ctype": "*",
"ext-iconv": "*",
"ext-json": "*",
"composer/package-versions-deprecated": "1.11.99.1",
"cweagans/composer-patches": "^1.7",
"doctrine/doctrine-bundle": "^2.4",
"doctrine/doctrine-migrations-bundle": "^3.1",
"doctrine/orm": "^2.9",
"phpdocumentor/reflection-docblock": "*",
"sensio/framework-extra-bundle": "*",
"symfony/framework-bundle": "4.4.*",
"symfony/http-client": "*",
"symfony/intl": "*",
"symfony/mailer": "*",
"symfony/mime": "*",
"symfony/monolog-bundle": "^3.1",
"symfony/notifier": "*",
"symfony/process": "*",
"symfony/property-access": "*",
"symfony/property-info": "*",
"symfony/proxy-manager-bridge": "*",
"symfony/security-bundle": "*",
"symfony/serializer": "*",
"symfony/string": "*",
"symfony/translation": "*",
"symfony/twig-bundle": "*",
"symfony/validator": "*",
"symfony/web-link": "*",
"symfony/yaml": "*",
"twig/extra-bundle": "*",
"twig/twig": "*"
},
"require-dev": {
"doctrine/doctrine-fixtures-bundle": "^3.4",
"roave/security-advisories": "dev-master",
"symfony/browser-kit": "*",
"symfony/css-selector": "*",
"symfony/debug-bundle": "*",
"symfony/maker-bundle": "*",
"symfony/phpunit-bridge": "*",
"symfony/stopwatch": "*",
"symfony/var-dumper": "*",
"symfony/web-profiler-bundle": "*",
"vimeo/psalm": "^4.9"
},
"config": {
"optimize-autoloader": true,
"preferred-install": {
"*": "dist"
},
"sort-packages": true
},
"autoload": {
"psr-4": {
"App\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"App\\Tests\\": "tests/"
}
},
"replace": {
"symfony/polyfill-ctype": "*",
"symfony/polyfill-iconv": "*",
"symfony/polyfill-php72": "*"
},
"scripts": {
"auto-scripts": {
"cache:clear": "symfony-cmd",
"assets:install %PUBLIC_DIR%": "symfony-cmd"
},
"post-install-cmd": [
"#auto-scripts"
],
"post-update-cmd": [
"#auto-scripts"
]
},
"conflict": {
"symfony/symfony": "*"
},
"extra": {
"symfony": {
"allow-contrib": false,
"require": "5.2.*"
},
"patches": {
"symfony/maker-bundle": {
"Provide flag to force annotation in make entity command": "https://raw.githubusercontent.com/vklux/maker-bundle-force-annotation/master/maker-force-annotation-flag.patch"
}
}
}
}
For those who have the symfony/flex package installed and are still getting the error, make sure the symfony/flex package is allowed to execute code when running composer.
This is because since Composer 2.2.0 the allow-plugins option adds a layer of security that allows you to restrict which Composer plugins can execute code at startup time.
So make sure you have the appropriate line in the allow-plugins config in your composer.json file
"config": {
// other config...
"allow-plugins": {
"symfony/flex": true
}
},
symfony-cmd is a part of Symfony Flex. Your composer.json does not contain any requirement for Flex, so running composer require symfony/flex might resolve that problem.
While adding symfony/flex to the project is one solution, keep in mind that Flex is optional. If you want to get rid of the error without installing Flex, simply remove the symfony-cmd command references from your composer.json.
Before:
"scripts": {
"auto-scripts": {
"cache:clear": "symfony-cmd",
"assets:install %PUBLIC_DIR%": "symfony-cmd"
},
"post-install-cmd": [
"#auto-scripts"
],
"post-update-cmd": [
"#auto-scripts"
]
},
After:
"scripts": {
"auto-scripts": {},
"post-install-cmd": [],
"post-update-cmd": []
},
I ran into a special case were an old deploy script added --no-plugins to my composer command. Removing that solved my issue with using deployer v6.
set('composer_options', '{{composer_action}} --verbose --prefer-dist --no-progress --no-interaction --no-dev --optimize-autoloader');
Apparently you need plugins for flex to work, and I'm assuming since the scripts block has some commands you need that too. So having no script/plugins will break your installation.

Symfony : downgrade PHP version

On my initial environment, I have a PHP 7.2.5.
But on the production environment, the version is 7.2.1.
I want to downgrade the version of PHP, but dependencies require 7.2.5 (the localhost:8000 is working fine).
{
"name": "symfony/website-skeleton",
"type": "project",
"license": "MIT",
"description": "A skeleton to start a new Symfony website",
"minimum-stability": "dev",
"prefer-stable": true,
"require": {
"php": ">=7.2",
"ext-ctype": "*",
"ext-iconv": "*",
"knplabs/knp-menu-bundle": "^3.1",
"sensio/framework-extra-bundle": "^5.1",
"symfony/asset": "*",
"symfony/console": "*",
"symfony/dotenv": "*",
"symfony/expression-language": "*",
"symfony/flex": "^1.3.1",
"symfony/form": "5.2.*",
"symfony/framework-bundle": "*",
"symfony/http-client": "*",
"symfony/intl": "*",
"symfony/mailer": "*",
"symfony/mime": "*",
"symfony/monolog-bundle": "^3.1",
"symfony/notifier": "*",
"symfony/orm-pack": "*",
"symfony/process": "*",
"symfony/security-bundle": "5.2.*",
"symfony/serializer-pack": "*",
"symfony/string": "*",
"symfony/translation": "*",
"symfony/twig-pack": "*",
"symfony/validator": "*",
"symfony/web-link": "*",
"symfony/yaml": "*"
},
"require-dev": {
"doctrine/doctrine-fixtures-bundle": "^3.4",
"symfony/debug-pack": "*",
"symfony/maker-bundle": "^1.0",
"symfony/profiler-pack": "*",
"symfony/test-pack": "*"
},
"config": {
"optimize-autoloader": true,
"preferred-install": {
"*": "dist"
},
"sort-packages": true
},
"autoload": {
"psr-4": {
"App\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"App\\Tests\\": "tests/"
}
},
"replace": {
"symfony/polyfill-ctype": "*",
"symfony/polyfill-iconv": "*",
"symfony/polyfill-php72": "*"
},
"scripts": {
"auto-scripts": {
"cache:clear": "symfony-cmd",
"assets:install %PUBLIC_DIR%": "symfony-cmd"
},
"post-install-cmd": [
"#auto-scripts"
],
"post-update-cmd": [
"#auto-scripts"
]
},
"conflict": {
"symfony/symfony": "*"
},
"extra": {
"symfony": {
"allow-contrib": false,
"require": "5.2.*"
}
}
}
How can I fix this error ? For now, if I don't use any composer command, it's fine, but I guess if I use any composer require I'll have an error due to PHP version ?
How can I downgrade all dependencies at the same time than php version ?
Symfony 5.2 requires PHP 7.2.5, so there is no way that you can use Symfony 5.2 with any lower PHP version. The latest Symfony version compatible with PHP 7.2.1 is v4.4.
To perform the downgrade of Symfony, this is the part you need to check:
"extra": {
"symfony": {
"allow-contrib": false,
"require": "5.2.*"
}
}
It specifically asks symfony/flex to use Symfony 5.2. If you want to downgrade Symfony, edit the version here and run composer update.
Keep in mind that this works best when all Symfony components are required without any specific version constraint. symfony/security-bundle should be used with a * requirement, as all other components

composer cannot find my installed package

I have a package in a private github repository.
When I run composer require my_vendor/my_package the package gets added to composer.json and shows up in the vendor directory.
When I run composer remove my_vendor/my_package it gives me a warning:
Package "my_vendor/my_package" listed for update is not installed.
Ignoring.
So when I run composer prohibits my_vendor/my_package it says
Could not find package "my_vendor/my_package" in your project
If I run composer show (after requiring the package) it is not displayed in the list.
This package has a dependency (lexik/authenticationbundle) which is correctly installed, removed and show in list of installed packages (but not listed in the tree view since it is a dependency of a non existent package)...
I have no clue on what could explain this behavior.
Any suggestion?
edit (adding composer.json content)
{
"type": "project",
"license": "proprietary",
"require": {
"php": "^7.1.3",
"ext-ctype": "*",
"ext-iconv": "*",
"api-platform/api-pack": "^1.1",
"composer/composer": "^1.6",
"symfony/console": "^4.1",
"symfony/flex": "^1.0",
"symfony/framework-bundle": "^4.1",
"symfony/lts": "^4#dev",
"symfony/orm-pack": "^1.0",
"symfony/web-server-bundle": "^4.1",
"symfony/yaml": "^4.1"
},
"require-dev": {
"symfony/dotenv": "^4.1"
},
"repositories": [
{
"type": "vcs",
"url": "https://github.com/my_repo/my_package.git"
}
],
"config": {
"preferred-install": {
"*": "dist"
},
"sort-packages": true
},
"autoload": {
"psr-4": {
"App\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"App\\Tests\\": "tests/"
}
},
"replace": {
"symfony/polyfill-ctype": "*",
"symfony/polyfill-iconv": "*",
"symfony/polyfill-php71": "*",
"symfony/polyfill-php70": "*",
"symfony/polyfill-php56": "*"
},
"scripts": {
"auto-scripts": {
"assets:install %PUBLIC_DIR%": "symfony-cmd",
"cache:clear": "symfony-cmd"
},
"post-install-cmd": [
"#auto-scripts"
],
"post-package-install": [
"App\\Utility\\Bootstrap\\Setup::execute",
"#auto-scripts"
],
"pre-package-uninstall": [
"App\\Utility\\Bootstrap\\Demolish::execute",
"#auto-scripts"
]
},
"conflict": {
"symfony/symfony": "*"
},
"extra": {
"symfony": {
"id": "01C1K60FQVPP7FCAC3YB6639RZ",
"allow-contrib": true
}
}
}
Furthermore, creating a new project and requiring the package correctly adds it to the list of installed packages, thus removing it works fine. Then I tried to delete lock file and running a composer update and eventually I tried to require/remove it but with no luck.
It appears that what was preventing composer to correctly configure required package was a die() in the post-package-install script.
Removing the statement solved the issue.

Imports are highlighted like the packages do not exist (Symfony 4)

I'm working on a Symfony 4 project with PhpStorm 2018.1
It has become common for me to see the use declarations highlighted as if they haven't been installed with composer.
The class belongs to a package which is not directly required in your
composer.json. Please add the package into your composer.json.
The following are installed and show in my composer.json file:
stof/doctrine-extensions-bundle
symfony/orm-pack
Am I missing something here or is this a PhpStorm issue?
composer.json
{
"type": "project",
"license": "proprietary",
"platform": {
"php": "7.1"
},
"require": {
"php": "^7.1",
"ext-iconv": "*",
"sensio/framework-extra-bundle": "^5.1",
"stof/doctrine-extensions-bundle": "^1.3",
"symfony/asset": "^4.1",
"symfony/console": "^4.1",
"symfony/expression-language": "^4.1",
"symfony/flex": "^1.0",
"symfony/form": "^4.1",
"symfony/framework-bundle": "^4.1",
"symfony/lts": "^4#dev",
"symfony/maker-bundle": "^1.5",
"symfony/monolog-bundle": "^3.3",
"symfony/orm-pack": "^1.0",
"symfony/process": "^4.1",
"symfony/profiler-pack": "^1.0",
"symfony/security-bundle": "^4.1",
"symfony/security-guard": "^4.1",
"symfony/serializer-pack": "*",
"symfony/swiftmailer-bundle": "^3.1",
"symfony/twig-bundle": "^4.1",
"symfony/validator": "^4.1",
"symfony/var-dumper": "^4.1",
"symfony/web-link": "^4.1",
"symfony/webpack-encore-pack": "^1.0",
"symfony/yaml": "^4.1"
},
"require-dev": {
"doctrine/doctrine-fixtures-bundle": "^3.0",
"symfony/debug-pack": "*",
"symfony/dotenv": "^4.1",
"symfony/test-pack": "^1.0",
"symfony/web-server-bundle": "^4.1"
},
"config": {
"preferred-install": {
"*": "dist"
},
"sort-packages": true
},
"autoload": {
"psr-4": {
"App\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"App\\Tests\\": "tests/"
}
},
"replace": {
"symfony/polyfill-iconv": "*",
"symfony/polyfill-php71": "*",
"symfony/polyfill-php70": "*",
"symfony/polyfill-php56": "*"
},
"scripts": {
"auto-scripts": {
"cache:clear": "symfony-cmd",
"assets:install %PUBLIC_DIR%": "symfony-cmd"
},
"post-install-cmd": [
"#auto-scripts"
],
"post-update-cmd": [
"#auto-scripts"
]
},
"conflict": {
"symfony/symfony": "*"
},
"extra": {
"symfony": {
"allow-contrib": true
}
}
}
What this message is telling you is that the highlighted classes are only available because the packages containing them have been installed as dependencies of some other packages you require (in this case it's probably because of the symfony/orm-pack package). Generally, relying on such transitive dependencies is not something I would do. Though for the Symfony pack that's something acceptable IMO.
If you are still concerned about this message, you can get rid of it by unpacking symfony/orm-pack (see also http://fabien.potencier.org/symfony4-unpack-the-packs.html):
$ composer unpack symfony/orm-pack
Your import path is correct, your composer.json looks good also.
Try to delete the vendor directory then try to launch composer install.
Try to install Symfony Plugin in your PHPStorm.
EDIT
Do you have the line below in your config/bundles.php ?
Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true],

Resources