calmip / gramc3 Goto Github PK
View Code? Open in Web Editor NEWLicense: GNU General Public License v3.0
License: GNU General Public License v3.0
Depuis 2009 un ensemble de règles d'écriture de code PHP simplifie la reprise du code écrit et le travail collaboratif.
Ces règles sont devenus les standards PSR (https://en.wikipedia.org/wiki/PHP_Standard_Recommendation ; https://www.php-fig.org/psr/), adressant différents aspects du code : autoload, indentation et alignements, logging, ...
Ne pas avoir de code ayant un style fixe produit des commit git et des soucis d'alignement dans les éditeurs (parfois le code est indenté avec des tabulations, parfois avec des espaces, les ouvertures et fermetures d'accolade ne sont pas forcement identiques dans différentes sections du code, ce qui se traduit pas de difficultés à relire le code et d'apporter des contributions productives.
L'implémentation du standard PSR-12 (version actuelle qui améliore PSR-0 et PSR-2) permettrait d'implémenter un style commun et reconnu et des outils comme PHP_codesniffer (binaires phpcs
et phpcbf
) permettraient de détecter et voire automatiquement corriger le code afin de garder un style PSR-12 uniforme.
De plus, le suivi des standards permet aux outils d'analyse de mieux lire le code pour différentes fonctions comme l'analyse de compatibilité avec des versions de PHP, trouver les blocs de code non factorisés, ...
Les outils d'intégration continue permettent de dérouler des scripts de tests avec différents outils (phpunit avec code coverage et des outils comme ceux de la liste ci-dessous) permettant entre autre la détection de problèmes et un éventuel reporting.
Contexte: version de la branche feature/criann, commit
Différentes pages de la section Administrateur sont indisponibles (remontent des Exceptions) dû à des champs de la DB qui sont manquants voire même de table(s) manquante(s).
Par exemple, la page /gramc3/projet/donnees
retourne :
An exception occurred while executing 'SELECT t0.etat_version AS etat_version_1, t0.prj_l_labo AS prj_l_labo_2, t0.prj_titre AS prj_titre_3, t0.dem_heures AS dem_heures_4, t0.attr_heures AS attr_heures_5, t0.politique AS politique_6, t0.prj_sous_thematique AS prj_sous_thematique_7, t0.prj_financement AS prj_financement_8, t0.prj_genci_machines AS prj_genci_machines_9, t0.prj_genci_centre AS prj_genci_centre_10, t0.prj_genci_heures AS prj_genci_heures_11, t0.prj_resume AS prj_resume_12, t0.prj_expose AS prj_expose_13, t0.prj_justif_renouv AS prj_justif_renouv_14, t0.prj_algorithme AS prj_algorithme_15, t0.prj_conception AS prj_conception_16, t0.prj_developpement AS prj_developpement_17, t0.prj_parallelisation AS prj_parallelisation_18, t0.prj_utilisation AS prj_utilisation_19, t0.prj_fiche AS prj_fiche_20, t0.prj_fiche_val AS prj_fiche_val_21, t0.prj_genci_dari AS prj_genci_dari_22, t0.code_nom AS code_nom_23, t0.code_langage AS code_langage_24, t0.code_c AS code_c_25, t0.code_cpp AS code_cpp_26, t0.code_for AS code_for_27, t0.code_autre AS code_autre_28, t0.code_licence AS code_licence_29, t0.code_util_sur_mach AS code_util_sur_mach_30, t0.code_heures_p_job AS code_heures_p_job_31, t0.code_ram_p_coeur AS code_ram_p_coeur_32, t0.gpu AS gpu_33, t0.code_ram_part AS code_ram_part_34, t0.code_eff_paral AS code_eff_paral_35, t0.code_vol_donn_tmp AS code_vol_donn_tmp_36, t0.dem_logiciels AS dem_logiciels_37, t0.dem_bib AS dem_bib_38, t0.dem_post_trait AS dem_post_trait_39, t0.dem_form_maison AS dem_form_maison_40, t0.dem_form_prise AS dem_form_prise_41, t0.dem_form_debogage AS dem_form_debogage_42, t0.dem_form_optimisation AS dem_form_optimisation_43, t0.dem_form_autres AS dem_form_autres_44, t0.dem_form_0 AS dem_form_0_45, t0.dem_form_1 AS dem_form_1_46, t0.dem_form_2 AS dem_form_2_47, t0.dem_form_3 AS dem_form_3_48, t0.dem_form_4 AS dem_form_4_49, t0.dem_form_5 AS dem_form_5_50, t0.dem_form_6 AS dem_form_6_51, t0.dem_form_7 AS dem_form_7_52, t0.dem_form_8 AS dem_form_8_53, t0.dem_form_9 AS dem_form_9_54, t0.dem_form_fortran AS dem_form_fortran_55, t0.dem_form_c AS dem_form_c_56, t0.dem_form_cpp AS dem_form_cpp_57, t0.dem_form_python AS dem_form_python_58, t0.dem_form_mpi AS dem_form_mpi_59, t0.dem_form_openmp AS dem_form_openmp_60, t0.dem_form_openacc AS dem_form_openacc_61, t0.dem_form_paraview AS dem_form_paraview_62, t0.libelle_thematique AS libelle_thematique_63, t0.attr_accept AS attr_accept_64, t0.rap_conf AS rap_conf_65, t0.maj_stamp AS maj_stamp_66, t0.sond_vol_donn_perm AS sond_vol_donn_perm_67, t0.sond_duree_donn_perm AS sond_duree_donn_perm_68, t0.prj_fiche_len AS prj_fiche_len_69, t0.penal_heures AS penal_heures_70, t0.attr_heures_ete AS attr_heures_ete_71, t0.sond_justif_donn_perm AS sond_justif_donn_perm_72, t0.dem_form_autres_autres AS dem_form_autres_autres_73, t0.cgu AS cgu_74, t0.id_version AS id_version_75, t0.data_metadataformat AS data_metadataformat_76, t0.data_tailledatasets AS data_tailledatasets_77, t0.data_nombredatasets AS data_nombredatasets_78, t0.fct_stamp AS fct_stamp_79, t0.maj_ind AS maj_ind_80, t0.prj_id_thematique AS prj_id_thematique_81, t0.prj_id_rattachement AS prj_id_rattachement_82, t0.id_session AS id_session_83, t0.id_projet AS id_projet_84 FROM version t0 WHERE t0.id_session IS NULL’:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 't0.dem_form_0' in 'field list'
Il pourrait également être intéressant d'étudier le cas d'un champ de type JSON pour stocker les données de formulaire dont la structure peut évoluer au gré des besoins (https://mariadb.com/kb/en/json_search/ , https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/types.html#json).
Le mode dev requiert de saisir dans un fichier adresses.txt
la liste des adresses IP individuelles pour autoriser l'accès au mode dev.
Dans un contexte dual stack (IPv4 et IPv6 par poste) et/ou de taille de réseau parfois grand (par exemple /24 pour IPv4 et /64 pour IPv6), il serait intéressant d'utiliser des fonctions qui permettraient de detecter si l'IP du visiteur fait partie d'une liste d'IP et/ou subnets (IPv4 et/ou IPv6).
Il existe un module qui peut être facilement chargé avec composer
pour étendre les fonctionnalités de traitement des adresses IPv4 et IPv6 et notamment tester si une adresse est dans un subnet, ce qui permettrait de saisir des adresses et/ou subnets IPv4 et IPv6 dans le fichiers adresses.txt
afin d'arriver à un résultat plus compact.
URL : https://packagist.org/packages/mlocati/ip-lib
Comme le fichier index.php
, qui réalise le test, charge le fichier bootstrap.php
qui charge l'autoloader, les fonctions du module seraient directement accessibles.
Dans la documentation à la base du projet, il est spécifier de lancer 2 commandes afin de générer un fichier .htaccess
mais ces commandes tentent de lire les fichiers de configurations qui sont dans une étape qui après les deux commandes, ce qui provoque des erreurs aux moment de lancer les 2 commandes.
root@gramc:/var/www/html/gramc3# ./composer.phar remove symfony/apache-pack
Do not run Composer as root/super user! See https://getcomposer.org/root for details
Continue as root/super user [yes]?
symfony/apache-pack is not required in your composer.json and has not been removed
./composer.json has been updated
Running composer update symfony/apache-pack
Loading composer repositories with package information
Updating dependencies
Package "symfony/apache-pack" listed for update is not locked.
Nothing to modify in lock file
Installing dependencies from lock file (including require-dev)
Nothing to install, update or remove
Package twig/extensions is abandoned, you should avoid using it. No replacement was suggested.
Generating autoload files
composer/package-versions-deprecated: Generating version class...
composer/package-versions-deprecated: ...done generating version class
87 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
Run composer recipes at any time to see the status of your Symfony recipes.
Executing script cache:clear [KO]
[KO]
Script cache:clear returned with error code 1
!!
!! In ParameterBag.php line 100:
!!
!! You have requested a non-existent parameter "mailadmin".
!!
!!
!!
Script @auto-scripts was called via post-update-cmd
L'ordre des actions devrait donc être :
.yaml
de l'application.htaccess
Le dossier vendor
est normalement généré par composer
suivant ce qui est écrit dans les fichiers composer.json
(qui décrit les dépendances de l'applications avec les versions utilisables en suivant la SemVer de composer
ainsi que d'autres éléments comme des alias de scripts) et composer.lock
(versions des modules qui ont été testés et conformes avec les versions spécifiées dans composer.json
).
Le dossier vendor
n'a, à priori, pas besoin d'être peuplé dans le dépôt git car il doit être 100% reconstructible depuis le contenu des deux fichiers composer.*
qui décrivent les dépendances pour l'application.
vendor
vendor
dans un fichier .gitignore
à la base du projetcomposer install
après le git clone
afin de récupérer les dépendancesAfin de valider la configuration de la partie envoi de mail depuis l'application, il faut définir des paramètres MAILER_*
qui permettent au module symfony/mailer d'utiliser le transport smtp.
Le service DOIT avoir TLS d'activé sinon le test d'envoi de mail échoue sur une erreur OpenSSL.
Fichier config/services.yaml
:
...
mailer_transport: '%env(MAILER_TRANSPORT)%'
mailer_host: '%env(MAILER_HOST)%'
mailer_user: '%env(MAILER_USER)%'
mailer_password: '%env(MAILER_PASSWORD)%'
...
Fichier .env.local
:
MAILER_RECIPIENT[email protected]
MAILER_TRANSPORT=smtp
MAILER_HOST=localhost
MAILER_USER=null
MAILER_PASSWORD=null
root@gramc:/var/www/html/gramc3# ./bin/console app:send-a-mail [email protected]
In SocketStream.php line 154:
Warning: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error mess
ages:
error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed
app:send-a-mail [-h|--help] [-q|--quiet] [-v|vv|vvv|--verbose] [-V|--version] [--ansi] [--no-ansi] [-n|--no-interaction] [-e|--env ENV] [--no-debug] [--] <command> <dest>
CN=localhost
, ajouter le dossier /etc/ssl/certs
dans le fichier de configuration php.ini
du SAPI cli utilisé et de lancer la commande c_rehash
pour regénérer le fichier ca-certificates.crt
qui agrège les clés publiques du systèmeUne commande Symfony ./bin/console cache:clear
peut être nécessaire pour valider les changements avant de refaire un essai d'envoi de mail ./bin/console app:send-a-mail [email protected]
.
testé sous Ubuntu 20.04
Par défaut postfix vient avec un certificat snake-oil self-signed ayant pour CN=<short_hostname>
et le module s'attend à un CN=localhost
.
Un contournement est de :
localhost
(en premier) avec l'IP non-localhost de la machine dans le fichier /etc/hosts
(ex: aaa.bbb.ccc.ddd localhost gramc.domain.tld gramc
)make-ssl-cert generate-default-snakeoil --force-overwrite
c_rehash
localhost
de la ligne aaa.bbb.ccc.ddd
dans /etc/hosts
/etc/php/7.4/cli/php.ini
[openssl]
openssl.capath=/etc/ssl/certs
La bibliothèque de parse YAML, déclenchée par des scripts du projet, ne supporte pas d'avoir des clés YAML dupliquées.
Lors de la phase d'installation, un jeu de 2 commandes doivent êtres lancés afin de générer un fichier .htaccess adéquat. Le problème est que ces commandes utilisent les fichiers YAML de configuration et que si des clés YAML sont dupliquées, la bibliothèque retourne en erreur.
Par exemple :
root@gramc:/var/www/html/gramc3# ./composer.phar remove symfony/apache-pack
Do not run Composer as root/super user! See https://getcomposer.org/root for details
Continue as root/super user [yes]?
symfony/apache-pack is not required in your composer.json and has not been removed
./composer.json has been updated
Running composer update symfony/apache-pack
Loading composer repositories with package information
Updating dependencies
Package "symfony/apache-pack" listed for update is not locked.
Nothing to modify in lock file
Installing dependencies from lock file (including require-dev)
Package operations: 0 installs, 0 updates, 1 removal
- Removing symfony/apache-pack (v1.0.1)
Package twig/extensions is abandoned, you should avoid using it. No replacement was suggested.
Generating autoload files
composer/package-versions-deprecated: Generating version class...
composer/package-versions-deprecated: ...done generating version class
87 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
Symfony operations: 1 recipe (72830c83b3ff33fbf202fda374aef8c2)
- Unconfiguring symfony/apache-pack (>=1.0): From github.com/symfony/recipes-contrib:master
Executing script cache:clear [KO]
[KO]
Script cache:clear returned with error code 1
!!
!! In FileLoader.php line 180:
!!
!! The file "/var/www/gramc3/config/services.yaml" does not contain valid YAML
!! : Duplicate key "password_consoupload" detected at line 146 (near "password
!! _consoupload: '%env(PASSWORD_CONSOUPLOAD)%'") in /var/www/gramc3/config/ser
!! vices.yaml (which is loaded in resource "/var/www/gramc3/config/services.ya
!! ml").
!!
!!
!! In YamlFileLoader.php line 693:
!!
!! The file "/var/www/gramc3/config/services.yaml" does not contain valid YAML
!! : Duplicate key "password_consoupload" detected at line 146 (near "password
!! _consoupload: '%env(PASSWORD_CONSOUPLOAD)%'").
!!
!!
!! In Parser.php line 345:
!!
!! Duplicate key "password_consoupload" detected at line 146 (near "password_c
!! onsoupload: '%env(PASSWORD_CONSOUPLOAD)%'").
!!
!!
!!
Script @auto-scripts was called via post-update-cmd
La solution qui semble la plus pertinente est donc de s'assurer qu'aucune clé YAML ne soit dupliquée dans le fichier exemple services.yaml.dist
Les clés dupliquées :
password_consoupload
mailer_transport
mailer_host
mailer_user
mailer_password
Contexte: Version de gramc v3: feature/criann
Lors de la première utilisation des différents menus du mode Administrateur, alors qu'aucune session n'a été créée, des Exceptions sont remontées.
Lorsque l'on cliques sur "Projets ( par session )" on obtient le message suivant
Error:
Call to a member function getIdSession() on null
at src/Controller/ProjetController.php:862
at App\Controller\ProjetController->sessionAction()
(vendor/symfony/http-kernel/HttpKernel.php:158)
at Symfony\Component\HttpKernel\HttpKernel->handleRaw()
(vendor/symfony/http-kernel/HttpKernel.php:80)
at Symfony\Component\HttpKernel\HttpKernel->handle()
(vendor/symfony/http-kernel/Kernel.php:201)
at Symfony\Component\HttpKernel\Kernel->handle()
(public/index.php:66)
Error
in src/Controller/ProjetController.php (line 862)
'nombreTermine' => $nombreTermine,
'nombreAnnule' => $nombreAnnule,
'nombreEditionFil' => $nombreEditionFil,
'nombreExpertiseFil' => $nombreExpertiseFil,
'form' => $form->createView(), // formulaire
'idSession' => $session->getIdSession(), // formulaire
'session' => $session,
'versions' => $versions,
'versions_suppl' => $versions_suppl,
'nombreNouveaux' => $nombreNouveaux,
'demHeures' => $demHeures,
in vendor/symfony/http-kernel/HttpKernel.php -> sessionAction (line 158)
in vendor/symfony/http-kernel/HttpKernel.php -> handleRaw (line 80)
in vendor/symfony/http-kernel/Kernel.php -> handle (line 201)
Kernel->handle()
in public/index.php (line 66)
Level | Channel | Message |
---|---|---|
INFO10:13:09 | request | Matched route "projet_session".{ "route": "projet_session", "route_parameters": { "_route": "projet_session", "_controller": "App\Controller\ProjetController::sessionAction" }, "request_uri": "https://gramc.criann.fr/gramc3/projet/session", "method": "GET" } |
DEBUG10:13:09 | security | Read existing security token from the session.{ "key": "_security_global_security_context", "token_class": "Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken" } |
DEBUG10:13:09 | doctrine | SELECT t0.eppn AS eppn_1, t0.id_individu AS id_individu_2 FROM sso t0 WHERE t0.eppn = ? LIMIT 1[ 1 ] |
DEBUG10:13:09 | doctrine | SELECT t0.creation_stamp AS creation_stamp_1, t0.nom AS nom_2, t0.prenom AS prenom_3, t0.mail AS mail_4, t0.admin AS admin_5, t0.sysadmin AS sysadmin_6, t0.obs AS obs_7, t0.expert AS expert_8, t0.president AS president_9, t0.desactive AS desactive_10, t0.id_individu AS id_individu_11, t0.id_statut AS id_statut_12, t0.id_labo AS id_labo_13, t0.id_etab AS id_etab_14 FROM individu t0 WHERE t0.id_individu = ? LIMIT 1[ 1 ] |
DEBUG10:13:09 | security | User was reloaded from a user provider.{ "provider": "App\Security\User\GramcUserProvider", "username": 1 } |
DEBUG10:13:09 | event | Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\DebugHandlersListener::configure".{ "event": "kernel.request", "listener": "Symfony\Component\HttpKernel\EventListener\DebugHandlersListener::configure" } |
DEBUG10:13:09 | event | Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\ValidateRequestListener::onKernelRequest".{ "event": "kernel.request", "listener": "Symfony\Component\HttpKernel\EventListener\ValidateRequestListener::onKernelRequest" } |
DEBUG10:13:09 | event | Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\SessionListener::onKernelRequest".{ "event": "kernel.request", "listener": "Symfony\Component\HttpKernel\EventListener\SessionListener::onKernelRequest" } |
DEBUG10:13:09 | event | Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\LocaleListener::setDefaultLocale".{ "event": "kernel.request", "listener": "Symfony\Component\HttpKernel\EventListener\LocaleListener::setDefaultLocale" } |
DEBUG10:13:09 | event | Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\RouterListener::onKernelRequest".{ "event": "kernel.request", "listener": "Symfony\Component\HttpKernel\EventListener\RouterListener::onKernelRequest" } |
DEBUG10:13:09 | event | Notified event "kernel.request" to listener "Symfony\Bundle\FrameworkBundle\EventListener\ResolveControllerNameSubscriber::resolveControllerName".{ "event": "kernel.request", "listener": "Symfony\Bundle\FrameworkBundle\EventListener\ResolveControllerNameSubscriber::resolveControllerName" } |
DEBUG10:13:09 | event | Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\LocaleListener::onKernelRequest".{ "event": "kernel.request", "listener": "Symfony\Component\HttpKernel\EventListener\LocaleListener::onKernelRequest" } |
DEBUG10:13:09 | event | Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\LocaleAwareListener::onKernelRequest".{ "event": "kernel.request", "listener": "Symfony\Component\HttpKernel\EventListener\LocaleAwareListener::onKernelRequest" } |
DEBUG10:13:09 | event | Notified event "kernel.request" to listener "Symfony\Bundle\SecurityBundle\Debug\TraceableFirewallListener::configureLogoutUrlGenerator".{ "event": "kernel.request", "listener": "Symfony\Bundle\SecurityBundle\Debug\TraceableFirewallListener::configureLogoutUrlGenerator" } |
DEBUG10:13:09 | event | Notified event "kernel.request" to listener "Symfony\Bundle\SecurityBundle\Debug\TraceableFirewallListener::onKernelRequest".{ "event": "kernel.request", "listener": "Symfony\Bundle\SecurityBundle\Debug\TraceableFirewallListener::onKernelRequest" } |
DEBUG10:13:09 | doctrine | SELECT t0.cle AS cle_1, t0.val AS val_2, t0.id_param AS id_param_3 FROM param t0 WHERE t0.cle = ? LIMIT 1[ "now" ] |
DEBUG10:13:09 | doctrine | SELECT t0.cle AS cle_1, t0.val AS val_2, t0.id_param AS id_param_3 FROM param t0 WHERE t0.cle = ? LIMIT 1[ "DateString" ] |
DEBUG10:13:09 | doctrine | SELECT t0.cle AS cle_1, t0.val AS val_2, t0.id_param AS id_param_3 FROM param t0 WHERE t0.cle = ? LIMIT 1[ "DateShift" ] |
DEBUG10:13:09 | doctrine | SELECT t0.cle AS cle_1, t0.val AS val_2, t0.id_param AS id_param_3 FROM param t0 WHERE t0.cle = ? LIMIT 1[ "NewDate" ] |
DEBUG10:13:09 | doctrine | SELECT s0_.type_session AS type_session_0, s0_.hparannee AS hparannee_1, s0_.comm_global AS comm_global_2, s0_.date_debut_session AS date_debut_session_3, s0_.date_fin_session AS date_fin_session_4, s0_.etat_session AS etat_session_5, s0_.id_session AS id_session_6, s0_.id_president AS id_president_7 FROM session s0_ WHERE s0_.etat_session <> ? ORDER BY s0_.id_session DESC[ 9 ] |
DEBUG10:13:09 | doctrine | SELECT s0_.type_session AS type_session_0, s0_.hparannee AS hparannee_1, s0_.comm_global AS comm_global_2, s0_.date_debut_session AS date_debut_session_3, s0_.date_fin_session AS date_fin_session_4, s0_.etat_session AS etat_session_5, s0_.id_session AS id_session_6, s0_.id_president AS id_president_7 FROM session s0_ WHERE s0_.etat_session <> ? ORDER BY s0_.id_session DESC[ 9 ] |
INFO10:13:09 | php | User Deprecated: The "Sensio\Bundle\FrameworkExtraBundle\Configuration\Method" annotation is deprecated since version 5.2. Use "Symfony\Component\Routing\Annotation\Route" instead.{ "exception": {} } |
DEBUG10:13:09 | event | Notified event "kernel.controller" to listener "Symfony\Bundle\FrameworkBundle\DataCollector\RouterDataCollector::onKernelController".{ "event": "kernel.controller", "listener": "Symfony\Bundle\FrameworkBundle\DataCollector\RouterDataCollector::onKernelController" } |
DEBUG10:13:09 | event | Notified event "kernel.controller" to listener "Symfony\Component\HttpKernel\DataCollector\RequestDataCollector::onKernelController".{ "event": "kernel.controller", "listener": "Symfony\Component\HttpKernel\DataCollector\RequestDataCollector::onKernelController" } |
DEBUG10:13:09 | event | Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\ControllerListener::onKernelController".{ "event": "kernel.controller", "listener": "Sensio\Bundle\FrameworkExtraBundle\EventListener\ControllerListener::onKernelController" } |
DEBUG10:13:09 | event | Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\ParamConverterListener::onKernelController".{ "event": "kernel.controller", "listener": "Sensio\Bundle\FrameworkExtraBundle\EventListener\ParamConverterListener::onKernelController" } |
DEBUG10:13:09 | event | Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\HttpCacheListener::onKernelController".{ "event": "kernel.controller", "listener": "Sensio\Bundle\FrameworkExtraBundle\EventListener\HttpCacheListener::onKernelController" } |
DEBUG10:13:09 | event | Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\TemplateListener::onKernelController".{ "event": "kernel.controller", "listener": "Sensio\Bundle\FrameworkExtraBundle\EventListener\TemplateListener::onKernelController" } |
DEBUG10:13:09 | event | Notified event "debug.security.authorization.vote" to listener "Symfony\Bundle\SecurityBundle\EventListener\VoteListener::onVoterVote".{ "event": "debug.security.authorization.vote", "listener": "Symfony\Bundle\SecurityBundle\EventListener\VoteListener::onVoterVote" } |
DEBUG10:13:09 | event | Notified event "debug.security.authorization.vote" to listener "Symfony\Bundle\SecurityBundle\EventListener\VoteListener::onVoterVote".{ "event": "debug.security.authorization.vote", "listener": "Symfony\Bundle\SecurityBundle\EventListener\VoteListener::onVoterVote" } |
DEBUG10:13:09 | event | Notified event "kernel.controller_arguments" to listener "Symfony\Component\HttpKernel\EventListener\ErrorListener::onControllerArguments".{ "event": "kernel.controller_arguments", "listener": "Symfony\Component\HttpKernel\EventListener\ErrorListener::onControllerArguments" } |
DEBUG10:13:09 | event | Notified event "kernel.controller_arguments" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\SecurityListener::onKernelControllerArguments".{ "event": "kernel.controller_arguments", "listener": "Sensio\Bundle\FrameworkExtraBundle\EventListener\SecurityListener::onKernelControllerArguments" } |
DEBUG10:13:09 | event | Notified event "kernel.controller_arguments" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\IsGrantedListener::onKernelControllerArguments".{ "event": "kernel.controller_arguments", "listener": "Sensio\Bundle\FrameworkExtraBundle\EventListener\IsGrantedListener::onKernelControllerArguments" } |
DEBUG10:13:09 | doctrine | SELECT s0_.type_session AS type_session_0, s0_.hparannee AS hparannee_1, s0_.comm_global AS comm_global_2, s0_.date_debut_session AS date_debut_session_3, s0_.date_fin_session AS date_fin_session_4, s0_.etat_session AS etat_session_5, s0_.id_session AS id_session_6, s0_.id_president AS id_president_7 FROM session s0_ WHERE s0_.etat_session <> ? ORDER BY s0_.id_session DESC[ 9 ] |
DEBUG10:13:09 | doctrine | SELECT t0.type_session AS type_session_1, t0.hparannee AS hparannee_2, t0.comm_global AS comm_global_3, t0.date_debut_session AS date_debut_session_4, t0.date_fin_session AS date_fin_session_5, t0.etat_session AS etat_session_6, t0.id_session AS id_session_7, t0.id_president AS id_president_8 FROM session t0 ORDER BY t0.id_session DESC |
DEBUG10:13:09 | doctrine | SELECT v0_.etat_version AS etat_version_0, v0_.prj_l_labo AS prj_l_labo_1, v0_.prj_titre AS prj_titre_2, v0_.dem_heures AS dem_heures_3, v0_.attr_heures AS attr_heures_4, v0_.politique AS politique_5, v0_.prj_genci_dari AS prj_genci_dari_6, v0_.sond_vol_donn_perm AS sond_vol_donn_perm_7, v0_.penal_heures AS penal_heures_8, v0_.id_version AS id_version_9, v0_.maj_ind AS maj_ind_10, v0_.prj_id_thematique AS prj_id_thematique_11, v0_.prj_id_rattachement AS prj_id_rattachement_12, v0_.id_session AS id_session_13, v0_.id_projet AS id_projet_14 FROM version v0_ INNER JOIN session s1_ ON v0_.id_session = s1_.id_session WHERE (s1_.id_session = ? AND NOT v0_.etat_version = ?)[ null, 10 ] |
DEBUG10:13:09 | doctrine | SELECT t0.libelle_thematique AS libelle_thematique_1, t0.id_thematique AS id_thematique_2, t0.id_meta_thematique AS id_meta_thematique_3 FROM thematique t0 |
DEBUG10:13:09 | doctrine | SELECT t0.libelle_rattachement AS libelle_rattachement_1, t0.id_rattachement AS id_rattachement_2 FROM rattachement t0 |
CRITICAL10:13:09 | php | Uncaught Error: Call to a member function getIdSession() on null{ "exception": {} } |
INFO10:13:09 | php | User Deprecated: The "Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent::getException()" method is deprecated since Symfony 4.4, use "getThrowable()" instead.{ "exception": {} } |
INFO10:13:09 | php | User Deprecated: The "Symfony\Component\Debug\Exception\FatalThrowableError" class is deprecated since Symfony 4.4.{ "exception": {} } |
INFO10:13:09 | php | User Deprecated: The "Symfony\Component\Debug\Exception\FatalErrorException" class is deprecated since Symfony 4.4, use "Symfony\Component\ErrorHandler\Error\FatalError" instead.{ "exception": {} } |
WARNING10:13:09 | app | Error to /gramc3/projet/session{ "exception": {}, "request": { "attributes": {}, "request": {}, "query": {}, "server": {}, "files": {}, "cookies": {}, "headers": {} } } |
ERROR10:13:09 | app | App\EventListener\ExceptionListener::onKernelException:241 Exception Symfony\Component\Debug\Exception\FatalThrowableError : Call to a member function getIdSession() on null À partir de URL : /projet/session |
CRITICAL10:13:09 | request | Uncaught PHP Exception Error: "Call to a member function getIdSession() on null" at /var/www/gramc3/src/Controller/ProjetController.php line 862{ "exception": {} } |
DEBUG10:13:09 | event | Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\DebugHandlersListener::configure".{ "event": "kernel.request", "listener": "Symfony\Component\HttpKernel\EventListener\DebugHandlersListener::configure" } |
DEBUG10:13:09 | event | Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\ValidateRequestListener::onKernelRequest".{ "event": "kernel.request", "listener": "Symfony\Component\HttpKernel\EventListener\ValidateRequestListener::onKernelRequest" } |
DEBUG10:13:09 | event | Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\SessionListener::onKernelRequest".{ "event": "kernel.request", "listener": "Symfony\Component\HttpKernel\EventListener\SessionListener::onKernelRequest" } |
DEBUG10:13:09 | event | Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\LocaleListener::setDefaultLocale".{ "event": "kernel.request", "listener": "Symfony\Component\HttpKernel\EventListener\LocaleListener::setDefaultLocale" } |
DEBUG10:13:09 | event | Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\RouterListener::onKernelRequest".{ "event": "kernel.request", "listener": "Symfony\Component\HttpKernel\EventListener\RouterListener::onKernelRequest" } |
DEBUG10:13:09 | event | Notified event "kernel.request" to listener "Symfony\Bundle\FrameworkBundle\EventListener\ResolveControllerNameSubscriber::resolveControllerName".{ "event": "kernel.request", "listener": "Symfony\Bundle\FrameworkBundle\EventListener\ResolveControllerNameSubscriber::resolveControllerName" } |
DEBUG10:13:09 | event | Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\LocaleListener::onKernelRequest".{ "event": "kernel.request", "listener": "Symfony\Component\HttpKernel\EventListener\LocaleListener::onKernelRequest" } |
DEBUG10:13:09 | event | Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\LocaleAwareListener::onKernelRequest".{ "event": "kernel.request", "listener": "Symfony\Component\HttpKernel\EventListener\LocaleAwareListener::onKernelRequest" } |
DEBUG10:13:09 | event | Notified event "kernel.request" to listener "Symfony\Bundle\SecurityBundle\Debug\TraceableFirewallListener::configureLogoutUrlGenerator".{ "event": "kernel.request", "listener": "Symfony\Bundle\SecurityBundle\Debug\TraceableFirewallListener::configureLogoutUrlGenerator" } |
DEBUG10:13:09 | event | Notified event "kernel.request" to listener "Symfony\Bundle\SecurityBundle\Debug\TraceableFirewallListener::onKernelRequest".{ "event": "kernel.request", "listener": "Symfony\Bundle\SecurityBundle\Debug\TraceableFirewallListener::onKernelRequest" } |
DEBUG10:13:09 | event | Notified event "kernel.controller" to listener "Symfony\Bundle\FrameworkBundle\DataCollector\RouterDataCollector::onKernelController".{ "event": "kernel.controller", "listener": "Symfony\Bundle\FrameworkBundle\DataCollector\RouterDataCollector::onKernelController" } |
DEBUG10:13:09 | event | Notified event "kernel.controller" to listener "Symfony\Component\HttpKernel\DataCollector\RequestDataCollector::onKernelController".{ "event": "kernel.controller", "listener": "Symfony\Component\HttpKernel\DataCollector\RequestDataCollector::onKernelController" } |
DEBUG10:13:09 | event | Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\ControllerListener::onKernelController".{ "event": "kernel.controller", "listener": "Sensio\Bundle\FrameworkExtraBundle\EventListener\ControllerListener::onKernelController" } |
DEBUG10:13:09 | event | Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\ParamConverterListener::onKernelController".{ "event": "kernel.controller", "listener": "Sensio\Bundle\FrameworkExtraBundle\EventListener\ParamConverterListener::onKernelController" } |
DEBUG10:13:09 | event | Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\HttpCacheListener::onKernelController".{ "event": "kernel.controller", "listener": "Sensio\Bundle\FrameworkExtraBundle\EventListener\HttpCacheListener::onKernelController" } |
DEBUG10:13:09 | event | Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\TemplateListener::onKernelController".{ "event": "kernel.controller", "listener": "Sensio\Bundle\FrameworkExtraBundle\EventListener\TemplateListener::onKernelController" } |
DEBUG10:13:09 | event | Notified event "kernel.controller_arguments" to listener "Symfony\Component\HttpKernel\EventListener\ErrorListener::onControllerArguments".{ "event": "kernel.controller_arguments", "listener": "Symfony\Component\HttpKernel\EventListener\ErrorListener::onControllerArguments" } |
DEBUG10:13:09 | event | Notified event "kernel.controller_arguments" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\SecurityListener::onKernelControllerArguments".{ "event": "kernel.controller_arguments", "listener": "Sensio\Bundle\FrameworkExtraBundle\EventListener\SecurityListener::onKernelControllerArguments" } |
DEBUG10:13:09 | event | Notified event "kernel.controller_arguments" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\IsGrantedListener::onKernelControllerArguments".{ "event": "kernel.controller_arguments", "listener": "Sensio\Bundle\FrameworkExtraBundle\EventListener\IsGrantedListener::onKernelControllerArguments" } |
## Etapes pour reproduire
Afin que Symfony puisse correctement utiliser le module rewrite d'Apache, les directives Rewrite*
doivent être autorisées, ce qui n'est pas le cas dans la configuration d'Apache 2.4 par défaut. Il faut autoriser certaines directives via la directive AllowOverride.
Sous Ubuntu ou par défaut depuis Apache 2.3.9, la directive AllowOverride
vaut None
par défaut alors que pour le module Rewrite il faut avoir à minima FileInfo
.
De même, le fichier .htaccess
généré utilise la directive DirectoryIndex
pour spécifier le fichier par défaut. Cette directive nécessite l'option AllowOverride
Indexes
.
Enfin, pour pouvoir lire le fichier .htaccess, il faut également la surcharge Options
Il serait intéressant que la documentation est fasse état afin de simplifier la phase d'installation.
Sur la base d'une copie de gramc3 dans /var/www/gramc3
et d'un lien symbolique ln -s /var/www/gramc3/public /var/www/html/gramc3
avec la variable export BASE="/gramc3"
dans /etc/apache2/envvars
comme dans la documentation.
Un exemple minimal de virtualhost incluant les valeurs nécessaires pour la directive AllowOverride
:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
<Directory /var/www>
AllowOverride FileInfo Indexes Options=MultiViews
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Pour l'utilisation de la Fédération, il faut que le site soit accessible via HTTPS donc une version minimale serait
<VirtualHost *:80>
ServerName gramc.domain.tld
ServerAdmin webmaster@localhost
RewriteEngine On
# This will enable the Rewrite capabilities
RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
</VirtualHost>
<VirtualHost *:443>
ServerName gramc.domain.tld
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory /var/www/html>
Options +FollowSymLinks
AllowOverride FileInfo Indexes Options=MultiViews
</Directory>
<Location /Shibboleth.sso>
AuthType None
SetHandler shib
Require all granted
</Location>
ShibCompatValidUser On
<Location /gramc3/login>
AuthType shibboleth
ShibRequestSetting requireSession 1
ShibRequestSetting applicationId default
# Require shibboleth
require shib-session
</Location>
UseCanonicalName On
<IfModule mod_ssl.c>
SSLEngine On
SSLCertificateFile /etc/ssl/certs/server.crt
SSLCertificateKeyFile /etc/ssl/private/server.key
SSLCertificateChainFile /etc/ssl/certs/sectigo-chain.crt
</IfModule>
</VirtualHost>
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.