diff --git a/app/config/services.yml b/app/config/services.yml index b3dd0c60c..56f8f6542 100644 --- a/app/config/services.yml +++ b/app/config/services.yml @@ -161,6 +161,9 @@ services: tags: - { name: twig.extension } + AppBundle\Twig\ViewRenderer: + autowire: true + AppBundle\Association\Form\HelpMessageExtension: class: AppBundle\Association\Form\HelpMessageExtension tags: @@ -171,11 +174,6 @@ services: tags: - { name: kernel.event_listener, event: kernel.request, priority: 100 } - AppBundle\Listener\LegacySiteListener: - autowire: true - tags: - - { name: kernel.event_listener, event: kernel.controller, priority: 100 } - AppBundle\Event\Model\Repository\SpeakerRepository: class: AppBundle\Event\Model\Repository\SpeakerRepository factory: ["@ting", get] diff --git a/htdocs/app.php b/htdocs/app.php index a78bd259c..e034e02d4 100644 --- a/htdocs/app.php +++ b/htdocs/app.php @@ -35,7 +35,6 @@ $kernel = new AppKernel('prod', false); } -$kernel->loadClassCache(); $request = Request::createFromGlobals(); $proxies = [ diff --git a/phpstan.neon b/phpstan.neon index 6247a979f..ba6a41224 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -18,10 +18,3 @@ parameters: stubFiles: - tests/stubs/Ting/Repository/Repository.php.stub - tests/stubs/Ting/Repository/RepositoryFactory.php.stub - - ignoreErrors: - - - message: '#^Method AppBundle\\Controller\\Website\\SiteBaseController\:\:render\(\) overrides @final method Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller\:\:render\(\)\.$#' - identifier: method.parentMethodFinalByPhpDoc - count: 1 - path: sources/AppBundle/Controller/Website/SiteBaseController.php diff --git a/sources/AppBundle/Controller/Admin/LoginAction.php b/sources/AppBundle/Controller/Admin/LoginAction.php index 579a928c1..c1c2a8430 100644 --- a/sources/AppBundle/Controller/Admin/LoginAction.php +++ b/sources/AppBundle/Controller/Admin/LoginAction.php @@ -2,29 +2,22 @@ namespace AppBundle\Controller\Admin; -use AppBundle\Controller\Website\BlocksHandler; +use AppBundle\Twig\ViewRenderer; use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Security\Http\Authentication\AuthenticationUtils; -use Twig\Environment; class LoginAction { /** @var AuthenticationUtils */ private $authenticationUtils; - /** @var BlocksHandler */ - private $blocksHandler; - /** @var Environment */ - private $twig; + private ViewRenderer $view; public function __construct( AuthenticationUtils $authenticationUtils, - BlocksHandler $blocksHandler, - Environment $twig + ViewRenderer $view ) { $this->authenticationUtils = $authenticationUtils; - $this->blocksHandler = $blocksHandler; - $this->twig = $twig; + $this->view = $view; } public function __invoke(Request $request) @@ -40,13 +33,13 @@ public function __invoke(Request $request) $noDomain = parse_url($targetUri, PHP_URL_HOST) === null; $targetPath = $targetUri !== $actualUrl && $noDomain ? $targetUri : null; - return new Response($this->twig->render('admin/login.html.twig', [ + return $this->view->render('admin/login.html.twig', [ 'last_username' => $lastUsername, 'error' => $error, 'target_path' => $targetPath, 'title' => 'Connexion', 'page' => 'connexion', 'class' => 'panel-page', - ] + $this->blocksHandler->getDefaultBlocks())); + ]); } } diff --git a/sources/AppBundle/Controller/Admin/LostPasswordAction.php b/sources/AppBundle/Controller/Admin/LostPasswordAction.php index dee3e4c0a..253f00bd3 100644 --- a/sources/AppBundle/Controller/Admin/LostPasswordAction.php +++ b/sources/AppBundle/Controller/Admin/LostPasswordAction.php @@ -3,24 +3,19 @@ namespace AppBundle\Controller\Admin; use AppBundle\Association\UserMembership\UserService; -use AppBundle\Controller\Website\BlocksHandler; +use AppBundle\Twig\ViewRenderer; use Symfony\Component\Form\Extension\Core\Type\EmailType; use Symfony\Component\Form\Extension\Core\Type\FormType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\FormFactoryInterface; use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface; -use Twig\Environment; class LostPasswordAction { /** @var FormFactoryInterface */ private $formFactory; - /** @var BlocksHandler */ - private $blocksHandler; - /** @var Environment */ - private $twig; + private ViewRenderer $view; /** @var FlashBagInterface */ private $flashBag; /** @var UserService */ @@ -28,15 +23,13 @@ class LostPasswordAction public function __construct( FormFactoryInterface $formFactory, - UserService $userPasswordService, - BlocksHandler $blocksHandler, - Environment $twig, - FlashBagInterface $flashBag + UserService $userPasswordService, + ViewRenderer $view, + FlashBagInterface $flashBag ) { $this->formFactory = $formFactory; $this->userPasswordService = $userPasswordService; - $this->blocksHandler = $blocksHandler; - $this->twig = $twig; + $this->view = $view; $this->flashBag = $flashBag; } @@ -53,11 +46,11 @@ public function __invoke(Request $request) $this->flashBag->add('notice', 'Votre demande a été prise en compte. Si un compte correspond à cet email vous recevez un nouveau mot de passe rapidement.'); } - return new Response($this->twig->render('admin/lost_password.html.twig', [ - 'form' => $form->createView(), - 'title' => 'Mot de passe perdu', - 'page' => 'motdepasse_perdu', - 'class' => 'panel-page', - ] + $this->blocksHandler->getDefaultBlocks())); + return $this->view->render('admin/lost_password.html.twig', [ + 'form' => $form->createView(), + 'title' => 'Mot de passe perdu', + 'page' => 'motdepasse_perdu', + 'class' => 'panel-page', + ]); } } diff --git a/sources/AppBundle/Controller/Website/BlocksHandler.php b/sources/AppBundle/Controller/Website/BlocksHandler.php deleted file mode 100644 index 6c944cb13..000000000 --- a/sources/AppBundle/Controller/Website/BlocksHandler.php +++ /dev/null @@ -1,33 +0,0 @@ - */ - protected $defaultBlocks = []; - - /** - * @param array{ - * community: string, - * header: string, - * sidebar: string, - * social: string, - * footer: string - * } $blocks - * - * @return void - */ - public function setDefaultBlocks(array $blocks) - { - $this->defaultBlocks = $blocks; - } - - /** - * @return array - */ - public function getDefaultBlocks() - { - return $this->defaultBlocks; - } -} diff --git a/sources/AppBundle/Controller/Website/CmsPageController.php b/sources/AppBundle/Controller/Website/CmsPageController.php index a55f9fbee..d670865f1 100644 --- a/sources/AppBundle/Controller/Website/CmsPageController.php +++ b/sources/AppBundle/Controller/Website/CmsPageController.php @@ -4,9 +4,18 @@ use Afup\Site\Corporate\Article; use Afup\Site\Corporate\Rubrique; +use AppBundle\Twig\ViewRenderer; +use Symfony\Bundle\FrameworkBundle\Controller\Controller; -class CmsPageController extends SiteBaseController +class CmsPageController extends Controller { + private ViewRenderer $view; + + public function __construct(ViewRenderer $view) + { + $this->view = $view; + } + public function displayAction($code) { $articleRepository = new Article(null, $GLOBALS['AFUP_DB']); @@ -29,13 +38,10 @@ public function displayAction($code) throw $this->createNotFoundException(); } - return $this->render( - ':site:cms_page/display.html.twig', - [ - 'article' => $article, - 'rubrique' => $rubrique, - ] - ); + return $this->view->render('site/cms_page/display.html.twig', [ + 'article' => $article, + 'rubrique' => $rubrique, + ]); } protected function isRubriqueAllowed($rubrique) diff --git a/sources/AppBundle/Controller/Website/CompanyPublicProfileController.php b/sources/AppBundle/Controller/Website/CompanyPublicProfileController.php index 0dfc553a7..d81effaea 100644 --- a/sources/AppBundle/Controller/Website/CompanyPublicProfileController.php +++ b/sources/AppBundle/Controller/Website/CompanyPublicProfileController.php @@ -6,22 +6,28 @@ use AppBundle\Association\Model\Repository\CompanyMemberRepository; use AppBundle\Association\UserMembership\BadgesComputer; use AppBundle\Offices\OfficesCollection; +use AppBundle\Twig\ViewRenderer; +use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\BinaryFileResponse; -class CompanyPublicProfileController extends SiteBaseController +class CompanyPublicProfileController extends Controller { + private ViewRenderer $view; + + public function __construct(ViewRenderer $view) + { + $this->view = $view; + } + public function indexAction($id, $slug) { $companyMember = $this->checkAndGetCompanyMember($id, $slug); - return $this->render( - ':site:company_public_profile.html.twig', - [ - 'company_member' => $companyMember, - 'offices' => $this->getRelatedAfupOffices($companyMember), - 'badges' => $this->get(BadgesComputer::class)->getCompanyBadges($companyMember), - ] - ); + return $this->view->render('site/company_public_profile.html.twig', [ + 'company_member' => $companyMember, + 'offices' => $this->getRelatedAfupOffices($companyMember), + 'badges' => $this->get(BadgesComputer::class)->getCompanyBadges($companyMember), + ]); } /** diff --git a/sources/AppBundle/Controller/Website/CompanyPublicProfileListController.php b/sources/AppBundle/Controller/Website/CompanyPublicProfileListController.php index ebc3755ac..ebad49b36 100644 --- a/sources/AppBundle/Controller/Website/CompanyPublicProfileListController.php +++ b/sources/AppBundle/Controller/Website/CompanyPublicProfileListController.php @@ -4,9 +4,18 @@ use AppBundle\Association\Model\CompanyMember; use AppBundle\Association\Model\Repository\CompanyMemberRepository; +use AppBundle\Twig\ViewRenderer; +use Symfony\Bundle\FrameworkBundle\Controller\Controller; -class CompanyPublicProfileListController extends SiteBaseController +class CompanyPublicProfileListController extends Controller { + private ViewRenderer $view; + + public function __construct(ViewRenderer $view) + { + $this->view = $view; + } + public function indexAction() { /** @@ -22,11 +31,8 @@ public function indexAction() return $a <=> $b; }); - return $this->render( - ':site:company_public_profile_list.html.twig', - [ - 'company_member_list' => $displayableCompanies, - ] - ); + return $this->view->render(':site:company_public_profile_list.html.twig', [ + 'company_member_list' => $displayableCompanies, + ]); } } diff --git a/sources/AppBundle/Controller/Website/HomeController.php b/sources/AppBundle/Controller/Website/HomeController.php index 89084d94e..e734a6cdd 100644 --- a/sources/AppBundle/Controller/Website/HomeController.php +++ b/sources/AppBundle/Controller/Website/HomeController.php @@ -7,36 +7,40 @@ use Afup\Site\Corporate\Feuille; use AppBundle\Event\Model\Repository\TalkRepository; use AppBundle\Event\Model\Talk; +use AppBundle\Twig\ViewRenderer; +use Symfony\Bundle\FrameworkBundle\Controller\Controller; +use Symfony\Component\HttpFoundation\Response; -class HomeController extends SiteBaseController +class HomeController extends Controller { - const MAX_ARTICLES = 5; - const MAX_MEETUPS = 10; + public const MAX_ARTICLES = 5; + public const MAX_MEETUPS = 10; + private ViewRenderer $view; - public function displayAction() + public function __construct(ViewRenderer $view) { - $afupBdd = $GLOBALS['AFUP_DB']; + $this->view = $view; + } + public function displayAction(): Response + { $articles = new Articles(); $derniers_articles = $articles->chargerDerniersAjouts(self::MAX_ARTICLES); - $branche = new Branche($afupBdd); + $branche = new Branche(); $enfants = $branche->feuillesEnfants(Feuille::ID_FEUILLE_COLONNE_DROITE); $premiereFeuille = array_shift($enfants); $deuxiemeFeuille = array_shift($enfants); - return $this->render( - ':site:home.html.twig', - [ - 'actualites' => $derniers_articles, - 'meetups' => $this->getLatestMeetups(), - 'premiere_feuille' => $premiereFeuille, - 'deuxieme_feuille' => $deuxiemeFeuille, - 'autres_feuilles' => $enfants, - 'talk' => $deuxiemeFeuille ?? $this->getTalkOfTheDay(), - ] - ); + return $this->view->render('site/home.html.twig', [ + 'actualites' => $derniers_articles, + 'meetups' => $this->getLatestMeetups(), + 'premiere_feuille' => $premiereFeuille, + 'deuxieme_feuille' => $deuxiemeFeuille, + 'autres_feuilles' => $enfants, + 'talk' => $deuxiemeFeuille ?? $this->getTalkOfTheDay(), + ]); } /** diff --git a/sources/AppBundle/Controller/Website/HtmlSitemapController.php b/sources/AppBundle/Controller/Website/HtmlSitemapController.php index fd8581476..a98f9ac19 100644 --- a/sources/AppBundle/Controller/Website/HtmlSitemapController.php +++ b/sources/AppBundle/Controller/Website/HtmlSitemapController.php @@ -8,32 +8,33 @@ use AppBundle\Event\Model\Repository\TalkRepository; use AppBundle\Event\Model\Talk; use AppBundle\Site\Model\Repository\ArticleRepository; +use AppBundle\Twig\ViewRenderer; +use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; -class HtmlSitemapController extends SiteBaseController +class HtmlSitemapController extends Controller { /** @var UrlGeneratorInterface */ private $urlGenerator; + private ViewRenderer $view; - public function __construct(UrlGeneratorInterface $urlGenerator) + public function __construct(UrlGeneratorInterface $urlGenerator, ViewRenderer $view) { $this->urlGenerator = $urlGenerator; + $this->view = $view; } public function displayAction() { $branche = new Branche(); - return $this->render( - ':site:sitemap.html.twig', - [ - 'pages' => $this->buildLeafs($branche, Feuille::ID_FEUILLE_HEADER), - 'association' => $this->buildLeafs($branche, Feuille::ID_FEUILLE_ANTENNES), - 'members' => $this->members(), - 'news' => $this->news(), - 'talks' => $this->talks(), - ] - ); + return $this->view->render('site/sitemap.html.twig', [ + 'pages' => $this->buildLeafs($branche, Feuille::ID_FEUILLE_HEADER), + 'association' => $this->buildLeafs($branche, Feuille::ID_FEUILLE_ANTENNES), + 'members' => $this->members(), + 'news' => $this->news(), + 'talks' => $this->talks(), + ]); } private function buildLeafs(Branche $branche, int $id): array diff --git a/sources/AppBundle/Controller/Website/MeetupsController.php b/sources/AppBundle/Controller/Website/MeetupsController.php index db0e78e9d..4357ff4cb 100644 --- a/sources/AppBundle/Controller/Website/MeetupsController.php +++ b/sources/AppBundle/Controller/Website/MeetupsController.php @@ -2,19 +2,25 @@ namespace AppBundle\Controller\Website; +use AppBundle\Twig\ViewRenderer; +use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; -class MeetupsController extends SiteBaseController +class MeetupsController extends Controller { + private ViewRenderer $view; + + public function __construct(ViewRenderer $view) + { + $this->view = $view; + } + public function listAction(Request $request) { - return $this->render( - ':site:meetups/list.html.twig', - [ - 'algolia_app_id' => $this->getParameter('algolia_app_id'), - 'algolia_api_key' => $this->getParameter('algolia_frontend_api_key'), - 'source' => $request->get('src'), - ] - ); + return $this->view->render('site/meetups/list.html.twig',[ + 'algolia_app_id' => $this->getParameter('algolia_app_id'), + 'algolia_api_key' => $this->getParameter('algolia_frontend_api_key'), + 'source' => $request->get('src'), + ]); } } diff --git a/sources/AppBundle/Controller/Website/Member/CompanyController.php b/sources/AppBundle/Controller/Website/Member/CompanyController.php index 621483a93..ede7a75c8 100644 --- a/sources/AppBundle/Controller/Website/Member/CompanyController.php +++ b/sources/AppBundle/Controller/Website/Member/CompanyController.php @@ -6,25 +6,22 @@ use AppBundle\Association\Model\CompanyMember; use AppBundle\Association\Model\Repository\CompanyMemberRepository; use AppBundle\Association\Model\User; -use AppBundle\Controller\Website\BlocksHandler; +use AppBundle\Twig\ViewRenderer; use Assert\Assertion; use Exception; use Symfony\Component\Form\FormFactoryInterface; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Security\Core\Security; -use Twig\Environment; class CompanyController { /** @var CompanyMemberRepository */ private $companyMemberRepository; - /** @var BlocksHandler */ - private $blocksHandler; + private ViewRenderer $view; /** @var FormFactoryInterface */ private $formFactory; /** @var FlashBagInterface */ @@ -33,25 +30,21 @@ class CompanyController private $urlGenerator; /** @var Security */ private $security; - /** @var Environment */ - private $twig; public function __construct( CompanyMemberRepository $companyMemberRepository, - BlocksHandler $blocksHandler, - FormFactoryInterface $formFactory, - FlashBagInterface $flashBag, - UrlGeneratorInterface $urlGenerator, - Security $security, - Environment $twig + ViewRenderer $view, + FormFactoryInterface $formFactory, + FlashBagInterface $flashBag, + UrlGeneratorInterface $urlGenerator, + Security $security ) { $this->companyMemberRepository = $companyMemberRepository; - $this->blocksHandler = $blocksHandler; + $this->view = $view; $this->formFactory = $formFactory; $this->flashBag = $flashBag; $this->urlGenerator = $urlGenerator; $this->security = $security; - $this->twig = $twig; } public function __invoke(Request $request) @@ -80,9 +73,9 @@ public function __invoke(Request $request) return new RedirectResponse($this->urlGenerator->generate('member_company')); } - return new Response($this->twig->render('admin/association/membership/company.html.twig', [ + return $this->view->render('admin/association/membership/company.html.twig', [ 'title' => 'Mon adhésion entreprise', 'form' => $subscribeForm->createView(), - ] + $this->blocksHandler->getDefaultBlocks())); + ]); } } diff --git a/sources/AppBundle/Controller/Website/Member/CompanyPublicProfileController.php b/sources/AppBundle/Controller/Website/Member/CompanyPublicProfileController.php index 5d0f1785f..2214ae203 100644 --- a/sources/AppBundle/Controller/Website/Member/CompanyPublicProfileController.php +++ b/sources/AppBundle/Controller/Website/Member/CompanyPublicProfileController.php @@ -5,11 +5,11 @@ use AppBundle\Association\Form\CompanyPublicProfile; use AppBundle\Association\Model\CompanyMember; use AppBundle\Association\Model\Repository\CompanyMemberRepository; -use AppBundle\Controller\Website\SiteBaseController; +use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\File\UploadedFile; use Symfony\Component\HttpFoundation\Request; -class CompanyPublicProfileController extends SiteBaseController +class CompanyPublicProfileController extends Controller { public function indexAction(Request $request) { diff --git a/sources/AppBundle/Controller/Website/Member/MembersController.php b/sources/AppBundle/Controller/Website/Member/MembersController.php index 951262633..a8caa58fc 100644 --- a/sources/AppBundle/Controller/Website/Member/MembersController.php +++ b/sources/AppBundle/Controller/Website/Member/MembersController.php @@ -1,5 +1,7 @@ companyMemberRepository = $companyMemberRepository; $this->userRepository = $userRepository; $this->companyMemberInvitationRepository = $companyMemberInvitationRepository; - $this->blocksHandler = $blocksHandler; + $this->view = $view; $this->formFactory = $formFactory; $this->collectionFilter = $collectionFilter; $this->security = $security; @@ -89,7 +85,6 @@ public function __construct( $this->urlGenerator = $urlGenerator; $this->invitationMail = $invitationMail; $this->eventDispatcher = $eventDispatcher; - $this->twig = $twig; $this->flashBag = $flashBag; } @@ -143,7 +138,7 @@ public function __invoke(Request $request) ])); } - return new Response($this->twig->render('admin/association/membership/members_company.html.twig', [ + return $this->view->render('admin/association/membership/members_company.html.twig', [ 'title' => 'Les membres de mon entreprise', 'users' => $users, 'invitations' => $pendingInvitations, @@ -151,7 +146,7 @@ public function __invoke(Request $request) 'company' => $company, 'canAddUser' => $canAddUser, 'token' => $this->csrfTokenManager->getToken('member_company_members'), - ] + $this->blocksHandler->getDefaultBlocks())); + ]); } private function addUser( @@ -159,7 +154,7 @@ private function addUser( CompanyMemberInvitation $invitation, CollectionInterface $users, CollectionInterface $pendingInvitations - ) { + ): void { // Check if there is already a pending invitation for this email and this company $matchingUser = $this->collectionFilter->findOne($users, 'getEmail', $invitation->getEmail()); $matchingInvitation = $this->collectionFilter->findOne($pendingInvitations, 'getEmail', $invitation->getEmail()); @@ -178,13 +173,13 @@ private function addUser( ->setStatus(CompanyMemberInvitation::STATUS_PENDING); $this->companyMemberInvitationRepository->save($invitation); // Send mail to the other guy, begging for him to join the company - $this->eventDispatcher->addListener(KernelEvents::TERMINATE, function () use ($company, $invitation) { + $this->eventDispatcher->addListener(KernelEvents::TERMINATE, function () use ($company, $invitation): void { $this->invitationMail->sendInvitation($company, $invitation); }); $this->flashBag->add('notice', sprintf('L\'invitation a été envoyée à l\'adresse %s.', $invitation->getEmail())); } - private function removeInvitation($emailToDelete, CollectionInterface $pendingInvitations) + private function removeInvitation($emailToDelete, CollectionInterface $pendingInvitations): void { /** @var CompanyMemberInvitation $invitationToDelete */ $invitationToDelete = $this->collectionFilter->findOne($pendingInvitations, 'getEmail', $emailToDelete); @@ -197,7 +192,7 @@ private function removeInvitation($emailToDelete, CollectionInterface $pendingIn } } - private function resendInvitation($emailToSend, CollectionInterface $pendingInvitations, CompanyMember $company) + private function resendInvitation($emailToSend, CollectionInterface $pendingInvitations, CompanyMember $company): void { /** @var CompanyMemberInvitation $invitationToSend */ $invitationToSend = $this->collectionFilter->findOne($pendingInvitations, 'getEmail', $emailToSend); @@ -209,7 +204,7 @@ private function resendInvitation($emailToSend, CollectionInterface $pendingInvi } } - private function promoteUser($emailToPromote, CollectionInterface $users) + private function promoteUser($emailToPromote, CollectionInterface $users): void { /** @var User $user */ $user = $this->collectionFilter->findOne($users, 'getEmail', $emailToPromote); @@ -221,7 +216,7 @@ private function promoteUser($emailToPromote, CollectionInterface $users) } } - private function disproveUser($emailToDisapprove, CollectionInterface $users) + private function disproveUser($emailToDisapprove, CollectionInterface $users): void { /** @var User $user */ $user = $this->collectionFilter->findOne($users, 'getEmail', $emailToDisapprove); @@ -239,7 +234,7 @@ private function disproveUser($emailToDisapprove, CollectionInterface $users) } } - private function removeUser($emailToRemove, CollectionInterface $users) + private function removeUser($emailToRemove, CollectionInterface $users): void { /** @var User $user */ $user = $this->collectionFilter->findOne($users, 'getEmail', $emailToRemove); diff --git a/sources/AppBundle/Controller/Website/MemberController.php b/sources/AppBundle/Controller/Website/MemberController.php index 9ef92197e..194812497 100644 --- a/sources/AppBundle/Controller/Website/MemberController.php +++ b/sources/AppBundle/Controller/Website/MemberController.php @@ -8,11 +8,20 @@ use AppBundle\Association\UserMembership\BadgesComputer; use AppBundle\Association\UserMembership\UserService; use AppBundle\GeneralMeeting\GeneralMeetingRepository; +use AppBundle\Twig\ViewRenderer; +use Symfony\Bundle\FrameworkBundle\Controller\Controller; -class MemberController extends SiteBaseController +class MemberController extends Controller { const DAYS_BEFORE_CALL_TO_UPDATE = 15; + private ViewRenderer $view; + + public function __construct(ViewRenderer $view) + { + $this->view = $view; + } + public function indexAction() { /** @var User $user */ @@ -44,20 +53,17 @@ public function indexAction() $displayLinkToGeneralMeetingVote = true; } - return $this->render( - ':site:member/index.html.twig', - [ - 'badges' => $this->get(BadgesComputer::class)->getBadges($user), - 'user' => $user, - 'has_member_subscribed_to_techletter' => $this->get('ting')->get(TechletterSubscriptionsRepository::class)->hasUserSubscribed($user), - 'membership_fee_call_to_update' => null === $daysBeforeMembershipExpiration || $daysBeforeMembershipExpiration < self::DAYS_BEFORE_CALL_TO_UPDATE, - 'has_up_to_date_membership_fee' => $user->hasUpToDateMembershipFee(), - 'office_label' => $user->getNearestOfficeLabel(), - 'has_general_meeting_planned' => $hasGeneralMeetingPlanned, - 'has_user_rspved_to_next_general_meeting' => $generalMeetingFactory->hasUserRspvedToLastGeneralMeeting($user), - 'membershipfee_end_date' => $dateFinCotisation, - 'display_link_to_general_meeting_vote' => $displayLinkToGeneralMeetingVote, - ] - ); + return $this->view->render('site/member/index.html.twig', [ + 'badges' => $this->get(BadgesComputer::class)->getBadges($user), + 'user' => $user, + 'has_member_subscribed_to_techletter' => $this->get('ting')->get(TechletterSubscriptionsRepository::class)->hasUserSubscribed($user), + 'membership_fee_call_to_update' => null === $daysBeforeMembershipExpiration || $daysBeforeMembershipExpiration < self::DAYS_BEFORE_CALL_TO_UPDATE, + 'has_up_to_date_membership_fee' => $user->hasUpToDateMembershipFee(), + 'office_label' => $user->getNearestOfficeLabel(), + 'has_general_meeting_planned' => $hasGeneralMeetingPlanned, + 'has_user_rspved_to_next_general_meeting' => $generalMeetingFactory->hasUserRspvedToLastGeneralMeeting($user), + 'membershipfee_end_date' => $dateFinCotisation, + 'display_link_to_general_meeting_vote' => $displayLinkToGeneralMeetingVote, + ]); } } diff --git a/sources/AppBundle/Controller/Website/MemberShipController.php b/sources/AppBundle/Controller/Website/MemberShipController.php index 4cec66f2c..62335a30d 100644 --- a/sources/AppBundle/Controller/Website/MemberShipController.php +++ b/sources/AppBundle/Controller/Website/MemberShipController.php @@ -33,7 +33,9 @@ use AppBundle\Payment\PayboxResponseFactory; use AppBundle\Security\LegacyAuthenticator; use AppBundle\TechLetter\Model\Repository\SendingRepository; +use AppBundle\Twig\ViewRenderer; use Assert\Assertion; +use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\Finder\Finder; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; @@ -44,19 +46,23 @@ use Symfony\Component\Validator\Constraints as Assert; use Symfony\Component\Validator\Context\ExecutionContextInterface; -class MemberShipController extends SiteBaseController +class MemberShipController extends Controller { use DbLoggerTrait; + private ViewRenderer $view; + + public function __construct(ViewRenderer $view) + { + $this->view = $view; + } + public function becomeMemberAction() { - return $this->render( - ':site:become_member.html.twig', - [ - 'membership_fee_natural_person' => AFUP_COTISATION_PERSONNE_PHYSIQUE, - 'membership_fee_legal_entity' => AFUP_COTISATION_PERSONNE_MORALE - ] - ); + return $this->view->render('site/become_member.html.twig', [ + 'membership_fee_natural_person' => AFUP_COTISATION_PERSONNE_PHYSIQUE, + 'membership_fee_legal_entity' => AFUP_COTISATION_PERSONNE_MORALE + ]); } public function memberAction(Request $request): Response @@ -86,7 +92,7 @@ public function memberAction(Request $request): Response ); } - return $this->render('admin/association/membership/register.html.twig', [ + return $this->view->render('admin/association/membership/register.html.twig', [ 'form' => $form->createView() ]); } @@ -141,7 +147,9 @@ public function companyAction(Request $request) return $this->redirectToRoute('company_membership_payment', ['invoiceNumber' => $invoice['invoice'], 'token' => $invoice['token']]); } - return $this->render(':site/company_membership:adhesion_entreprise.html.twig', ['form' => $subscribeForm->createView()]); + return $this->view->render('site/company_membership/adhesion_entreprise.html.twig', [ + 'form' => $subscribeForm->createView() + ]); } public function paymentAction($invoiceNumber, $token) @@ -171,7 +179,7 @@ public function paymentAction($invoiceNumber, $token) $bankAccountFactory = new BankAccountFactory(); - return $this->render(':site/company_membership:payment.html.twig', [ + return $this->view->render('site/company_membership/payment.html.twig', [ 'paybox' => $paybox, 'invoice' => $invoice, 'bankAccount' => $bankAccountFactory->createApplyableAt(\DateTimeImmutable::createFromFormat('U', $invoice['date_debut'])), @@ -260,7 +268,10 @@ public function memberInvitationAction(Request $request, $invitationId, $token) return $this->redirectToRoute('member_index'); } - return $this->render(':site/company_membership:member_invitation.html.twig', ['company' => $company, 'form' => $userForm->createView()]); + return $this->view->render('site/company_membership/member_invitation.html.twig', [ + 'company' => $company, + 'form' => $userForm->createView() + ]); } public function slackInviteRequestAction(Request $request) @@ -349,7 +360,10 @@ public function contactDetailsAction(Request $request) $this->addFlash('success', 'Votre compte a été modifié !'); } - return $this->render(':admin/association/membership:member_contact_details.html.twig', ['title' => 'Mes coordonnées', 'form' => $userForm->createView()]); + return $this->view->render('admin/association/membership/member_contact_details.html.twig', [ + 'title' => 'Mes coordonnées', + 'form' => $userForm->createView() + ]); } private function getUserId() @@ -440,19 +454,16 @@ public function membershipFeeAction() $paybox = str_replace('INPUT TYPE=SUBMIT', 'INPUT TYPE=SUBMIT class="button button--call-to-action"', $paybox); - return $this->render( - ':admin/association/membership:membershipfee.html.twig', - [ - 'isSubjectedToVat' => $isSubjectedToVat, - 'title' => 'Ma cotisation', - 'cotisations' => $liste_cotisations, - 'time' => time(), - 'montant' => $montant, - 'libelle' => $libelle, - 'paybox' => $paybox, - 'message' => $message, - ] - ); + return $this->view->render('admin/association/membership/membershipfee.html.twig', [ + 'isSubjectedToVat' => $isSubjectedToVat, + 'title' => 'Ma cotisation', + 'cotisations' => $liste_cotisations, + 'time' => time(), + 'montant' => $montant, + 'libelle' => $libelle, + 'paybox' => $paybox, + 'message' => $message, + ]); } private function getCotisations() @@ -537,7 +548,7 @@ public function generalMeetingAction(Request $request) $needsMembersheepFeePayment = $latestDate->getTimestamp() > strtotime("+14 day", (int) $cotisation['date_fin']); if ($needsMembersheepFeePayment) { - return $this->render('admin/association/membership/generalmeeting_membersheepfee.html.twig', [ + return $this->view->render('admin/association/membership/generalmeeting_membersheepfee.html.twig', [ 'title' => $title, 'latest_date' => $latestDate, ]); @@ -640,7 +651,7 @@ public function generalMeetingAction(Request $request) ]; } - return $this->render('admin/association/membership/generalmeeting.html.twig', [ + return $this->view->render('admin/association/membership/generalmeeting.html.twig', [ 'question_results' => $questionResults, 'question' => $currentQuestion, 'vote_for_current_question' => $voteForCurrentQuestion, @@ -750,7 +761,7 @@ private function prepareGeneralMeetingsReportsList() public function techletterAction() { - return $this->render(':site/member:techletter.html.twig', [ + return $this->view->render('site/member/techletter.html.twig', [ 'subscribed' => $this->get('ting')->get(TechletterSubscriptionsRepository::class)->hasUserSubscribed($this->getUser()), 'feeUpToDate' => ($this->getUser() !== null and $this->getUser()->getLastSubscription() > new \DateTime()), 'token' => $this->get('security.csrf.token_manager')->getToken('techletter_subscription'), diff --git a/sources/AppBundle/Controller/Website/NewsController.php b/sources/AppBundle/Controller/Website/NewsController.php index 1461d87fc..7580a62e1 100644 --- a/sources/AppBundle/Controller/Website/NewsController.php +++ b/sources/AppBundle/Controller/Website/NewsController.php @@ -6,12 +6,21 @@ use AppBundle\Site\Form\NewsFiltersType; use AppBundle\Site\Model\Article; use AppBundle\Site\Model\Repository\ArticleRepository; +use AppBundle\Twig\ViewRenderer; +use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; -class NewsController extends SiteBaseController +class NewsController extends Controller { const ARTICLES_PER_PAGE = 5; + private ViewRenderer $view; + + public function __construct(ViewRenderer $view) + { + $this->view = $view; + } + public function displayAction($code) { $articleRepository = $this->getArticleRepository(); @@ -29,16 +38,13 @@ public function displayAction($code) $this->getHeaderImageUrl($article); - return $this->render( - ':site:news/display.html.twig', - [ - 'article' => $article, - 'header_image' => $this->getHeaderImageUrl($article), - 'previous' => $articleRepository->findPrevious($article), - 'next' => $articleRepository->findNext($article), - 'related_event' => $this->getRelatedEvent($article), - ] - ); + return $this->view->render('site/news/display.html.twig', [ + 'article' => $article, + 'header_image' => $this->getHeaderImageUrl($article), + 'previous' => $articleRepository->findPrevious($article), + 'next' => $articleRepository->findNext($article), + 'related_event' => $this->getRelatedEvent($article), + ]); } private function getRelatedEvent(Article $article) @@ -77,17 +83,14 @@ public function listAction(Request $request) $formData = $form->getData(); $filters = $formData ?? []; - return $this->render( - ':site:news/list.html.twig', - [ - 'filters' => $filters, - 'articles' => $this->getArticleRepository()->findPublishedNews($page, self::ARTICLES_PER_PAGE, $filters), - 'total_items' => $this->getArticleRepository()->countPublishedNews($filters), - 'current_page' => $page, - 'articles_per_page' => self::ARTICLES_PER_PAGE, - 'form' => $form->createView(), - ] - ); + return $this->view->render('site/news/list.html.twig', [ + 'filters' => $filters, + 'articles' => $this->getArticleRepository()->findPublishedNews($page, self::ARTICLES_PER_PAGE, $filters), + 'total_items' => $this->getArticleRepository()->countPublishedNews($filters), + 'current_page' => $page, + 'articles_per_page' => self::ARTICLES_PER_PAGE, + 'form' => $form->createView(), + ]); } /** diff --git a/sources/AppBundle/Controller/Website/NewsletterController.php b/sources/AppBundle/Controller/Website/NewsletterController.php index 25086705e..7f9a376bb 100644 --- a/sources/AppBundle/Controller/Website/NewsletterController.php +++ b/sources/AppBundle/Controller/Website/NewsletterController.php @@ -5,13 +5,24 @@ use AppBundle\Mailchimp\Mailchimp; use AppBundle\Mailchimp\SubscriberType; +use AppBundle\Twig\ViewRenderer; +use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; -class NewsletterController extends SiteBaseController +class NewsletterController extends Controller { + private ViewRenderer $view; + + public function __construct(ViewRenderer $view) + { + $this->view = $view; + } + public function subscribeFormAction() { - return $this->render(':site/newsletter:subscribe.html.twig', ['form' => $this->getSubscriberType()->createView()]); + return $this->render('site/newsletter/subscribe.html.twig', [ + 'form' => $this->getSubscriberType()->createView() + ]); } public function subscribeAction(Request $request) @@ -29,7 +40,9 @@ public function subscribeAction(Request $request) } catch (\Exception $e) { $success = false; } - return $this->render(':site/newsletter:postsubscribe.html.twig', ['success' => $success]); + return $this->view->render('site/newsletter/postsubscribe.html.twig', [ + 'success' => $success + ]); } return $this->redirect('/'); diff --git a/sources/AppBundle/Controller/Website/PayboxRedirectController.php b/sources/AppBundle/Controller/Website/PayboxRedirectController.php index 5539f344c..7fe277399 100644 --- a/sources/AppBundle/Controller/Website/PayboxRedirectController.php +++ b/sources/AppBundle/Controller/Website/PayboxRedirectController.php @@ -3,15 +3,24 @@ namespace AppBundle\Controller\Website; use AppBundle\Payment\PayboxResponseFactory; +use AppBundle\Twig\ViewRenderer; +use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; -class PayboxRedirectController extends SiteBaseController +class PayboxRedirectController extends Controller { + private ViewRenderer $view; + + public function __construct(ViewRenderer $view) + { + $this->view = $view; + } + public function indexAction(Request $request, $type = 'success') { $payboxResponse = PayboxResponseFactory::createFromRequest($request); - return $this->render('site/company_membership/paybox_redirect.html.twig', [ + return $this->view->render('site/company_membership/paybox_redirect.html.twig', [ 'payboxResponse' => $payboxResponse, 'status' => $request->get('status'), 'return_type' => $type diff --git a/sources/AppBundle/Controller/Website/SiteBaseController.php b/sources/AppBundle/Controller/Website/SiteBaseController.php deleted file mode 100644 index 717085664..000000000 --- a/sources/AppBundle/Controller/Website/SiteBaseController.php +++ /dev/null @@ -1,37 +0,0 @@ -defaultBlocks = $blocks; - } - - public function setConfiguration(Configuration $conf): void - { - $this->legacyConfiguration = $conf; - } - - /** - * @inheritDoc - */ - protected function render($view, array $parameters = [], Response $response = null): Response - { - return parent::render($view, $parameters + $this->defaultBlocks, $response); - } -} diff --git a/sources/AppBundle/Controller/Website/SiteControllerInterface.php b/sources/AppBundle/Controller/Website/SiteControllerInterface.php deleted file mode 100644 index f15bd4425..000000000 --- a/sources/AppBundle/Controller/Website/SiteControllerInterface.php +++ /dev/null @@ -1,26 +0,0 @@ - string, - * 'header' => string, - * 'sidebar' => string, - * 'social' => string, - * 'footer' => string - * ] - * @return void - */ - public function setDefaultBlocks(array $blocks); - - /** - * @param Configuration $conf - */ - public function setConfiguration(Configuration $conf); -} diff --git a/sources/AppBundle/Controller/Website/StaticController.php b/sources/AppBundle/Controller/Website/StaticController.php index 398f4f576..88efa4f8d 100644 --- a/sources/AppBundle/Controller/Website/StaticController.php +++ b/sources/AppBundle/Controller/Website/StaticController.php @@ -4,19 +4,25 @@ namespace AppBundle\Controller\Website; use AppBundle\Offices\OfficesCollection; +use AppBundle\Twig\ViewRenderer; +use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; -class StaticController extends SiteBaseController +class StaticController extends Controller { + private ViewRenderer $view; + + public function __construct(ViewRenderer $view) + { + $this->view = $view; + } + public function officesAction() { $officesCollection = new OfficesCollection(); - return $this->render( - ':site:offices.html.twig', - [ - 'offices' => $officesCollection->getAllSortedByLabels() - ] - ); + return $this->view->render(':site:offices.html.twig', [ + 'offices' => $officesCollection->getAllSortedByLabels() + ]); } protected function getAperos($url) @@ -53,7 +59,9 @@ protected function getAperos($url) public function superAperoAction() { $aperos = $this->getAperos($this->getParameter('super_apero_csv_url')); - return $this->render(':site:superapero.html.twig', ['aperos' => $aperos]); + return $this->view->render(':site:superapero.html.twig', [ + 'aperos' => $aperos + ]); } public function voidAction(Request $request) @@ -63,6 +71,6 @@ public function voidAction(Request $request) $params = $request->attributes->get('legacyContent'); } - return $this->render('site/base.html.twig', $params); + return $this->view->render('site/base.html.twig', $params); } } diff --git a/sources/AppBundle/Controller/Website/TalksController.php b/sources/AppBundle/Controller/Website/TalksController.php index 240bac736..dca50f5c9 100644 --- a/sources/AppBundle/Controller/Website/TalksController.php +++ b/sources/AppBundle/Controller/Website/TalksController.php @@ -8,20 +8,26 @@ use AppBundle\Event\Model\Repository\TalkRepository; use AppBundle\Offices\OfficesCollection; use AppBundle\Subtitles\Parser; +use AppBundle\Twig\ViewRenderer; +use Symfony\Bundle\FrameworkBundle\Controller\Controller; -class TalksController extends SiteBaseController +class TalksController extends Controller { + private ViewRenderer $view; + + public function __construct(ViewRenderer $view) + { + $this->view = $view; + } + public function listAction() { $officesCollection = new OfficesCollection(); - return $this->render( - ':site:talks/list.html.twig', - [ - 'offices' => $officesCollection->getAllSortedByLabels(), - 'algolia_app_id' => $this->getParameter('algolia_app_id'), - 'algolia_api_key' => $this->getParameter('algolia_frontend_api_key'), - ] - ); + return $this->view->render('site/talks/list.html.twig', [ + 'offices' => $officesCollection->getAllSortedByLabels(), + 'algolia_app_id' => $this->getParameter('algolia_app_id'), + 'algolia_api_key' => $this->getParameter('algolia_frontend_api_key'), + ]); } /** @@ -46,16 +52,13 @@ public function showAction($id, $slug) $parser = new Parser(); $parsedContent = $parser->parse($talk->getTranscript()); - return $this->render( - ':site:talks/show.html.twig', - [ - 'talk' => $talk, - 'event' => $event, - 'speakers' => $speakers, - 'comments' => $comments, - 'transcript' => $parsedContent, - ] - ); + return $this->view->render('site/talks/show.html.twig', [ + 'talk' => $talk, + 'event' => $event, + 'speakers' => $speakers, + 'comments' => $comments, + 'transcript' => $parsedContent, + ]); } public function joindinAction($id, $slug) diff --git a/sources/AppBundle/Controller/Website/TechletterController.php b/sources/AppBundle/Controller/Website/TechletterController.php index fedeed85e..6f240f855 100644 --- a/sources/AppBundle/Controller/Website/TechletterController.php +++ b/sources/AppBundle/Controller/Website/TechletterController.php @@ -3,14 +3,23 @@ namespace AppBundle\Controller\Website; use AppBundle\Association\Model\Repository\TechletterUnsubscriptionsRepository; +use AppBundle\Twig\ViewRenderer; +use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; -class TechletterController extends SiteBaseController +class TechletterController extends Controller { + private ViewRenderer $view; + + public function __construct(ViewRenderer $view) + { + $this->view = $view; + } + public function indexAction() { - return $this->render('site/techletter/index.html.twig'); + return $this->view->render('site/techletter/index.html.twig'); } /** diff --git a/sources/AppBundle/Controller/Website/TechnoWatchController.php b/sources/AppBundle/Controller/Website/TechnoWatchController.php index 8b9ee27fb..e608d2570 100644 --- a/sources/AppBundle/Controller/Website/TechnoWatchController.php +++ b/sources/AppBundle/Controller/Website/TechnoWatchController.php @@ -3,10 +3,11 @@ namespace AppBundle\Controller\Website; use AppBundle\Calendar\TechnoWatchCalendarGenerator; +use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; -class TechnoWatchController extends SiteBaseController +class TechnoWatchController extends Controller { public function calendarAction(Request $request) { diff --git a/sources/AppBundle/Listener/LegacySiteListener.php b/sources/AppBundle/Listener/LegacySiteListener.php deleted file mode 100644 index 1a09abc5f..000000000 --- a/sources/AppBundle/Listener/LegacySiteListener.php +++ /dev/null @@ -1,52 +0,0 @@ -security = $security; - $this->blocksHandler = $blocksHandler; - } - - public function onKernelController(FilterControllerEvent $event) - { - if ($event->isMasterRequest() === false) { - return; - } - - require_once __DIR__ . '/../../Afup/Bootstrap/Http.php'; - - $page = new Page($GLOBALS['AFUP_DB']); - $blocks = [ - 'community' => $page->community(), - 'header' => $page->header($_SERVER['REQUEST_URI'], $this->security->getUser()), - 'sidebar' => $page->getRightColumn(), - 'social' => $page->social(), - 'footer' => $page->footer() - ]; - $this->blocksHandler->setDefaultBlocks($blocks); - // TODO: remove once SiteControllerInterface is removed in favor of BlocksHandler - $controller = $event->getController(); - if (!is_array($controller) || [] === $controller || !$controller[0] instanceof SiteControllerInterface) { - return; - } - /** @var SiteControllerInterface $controller */ - $controller = $controller[0]; - $controller->setDefaultBlocks($blocks); - $controller->setConfiguration($GLOBALS['AFUP_CONF']); - } -} diff --git a/sources/AppBundle/Twig/ViewRenderer.php b/sources/AppBundle/Twig/ViewRenderer.php new file mode 100644 index 000000000..b7ab91b11 --- /dev/null +++ b/sources/AppBundle/Twig/ViewRenderer.php @@ -0,0 +1,44 @@ +security = $security; + $this->requestStack = $requestStack; + $this->twig = $twig; + } + + public function render(string $view, array $parameters = []): Response + { + $blocks = []; + if ($this->requestStack->getCurrentRequest()) { + $requestUri = $this->requestStack->getCurrentRequest()->getRequestUri(); + $page = new Page(); + $blocks = [ + 'community' => $page->community(), + 'header' => $page->header($requestUri, $this->security->getUser()), + 'sidebar' => $page->getRightColumn(), + 'social' => $page->social(), + 'footer' => $page->footer() + ]; + } + + $content = $this->twig->render($view, $parameters + $blocks); + + $response = new Response(); + return $response->setContent($content); + } +}