src/StartPlatz/Bundle/AcceleratorBundle/Controller/AcceleratorStartupController.php line 73

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace App\StartPlatz\Bundle\AcceleratorBundle\Controller;
  3. use App\StartPlatz\Bundle\MemberBundle\Entity\Member;
  4. use App\StartPlatz\Bundle\MemberBundle\Entity\MemberTeam;
  5. use App\StartPlatz\Bundle\MemberBundle\Entity\Team;
  6. use App\StartPlatz\Bundle\MentorsBundle\Service\WordPressMenuService;
  7. use App\StartPlatz\Bundle\StartupBundle\Entity\Startup;
  8. use App\StartPlatz\Bundle\StartupBundle\Entity\StartupRelevance;
  9. use App\StartPlatz\Bundle\UserBundle\Entity\User;
  10. use Doctrine\ORM\EntityManagerInterface;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  15. use Symfony\Component\Routing\Annotation\Route;
  16. /**
  17.  * Controller für öffentliche Accelerator Startup Seiten.
  18.  *
  19.  * Handles:
  20.  * - Grid-Übersicht aller KI-Accelerator Startups
  21.  * - Detail-Ansicht einzelner Startups
  22.  */
  23. class AcceleratorStartupController extends AbstractController
  24. {
  25.     public function __construct(
  26.         private readonly EntityManagerInterface $entityManager,
  27.         private readonly SessionInterface $session,
  28.         private readonly WordPressMenuService $wordPressMenuService
  29.     ) {
  30.     }
  31.     /**
  32.      * Grid-Übersicht aller KI-Accelerator Startups.
  33.      */
  34.     #[Route('/accelerator/startups'name'accelerator_startups')]
  35.     #[Route('/en/accelerator/startups'name'accelerator_startups_en')]
  36.     public function indexAction(Request $request): Response
  37.     {
  38.                 $isEnglish str_contains($request->getPathInfo(), '/en/');
  39.         $menu $this->wordPressMenuService->getAcceleratorMenu($isEnglish$request->getPathInfo());
  40.         // Layout-Parameter für A/B-Testing (v1, v2, v7, v7a, v7b, etc.)
  41.         $layout $request->query->get('layout''v1');
  42.         if (!preg_match('/^v[0-9]+[a-z]*$/'$layout)) {
  43.             $layout 'v1';
  44.         }
  45.         $startups $this->entityManager->getRepository(Startup::class)->findKiAcceleratorStartups();
  46.         $teamIds array_map(fn ($entity) => $entity->getTeamId(), $startups);
  47.         $teams   $this->entityManager->getRepository(Team::class)->findBy(['id' => $teamIds]);
  48.         $teamIds array_map(fn ($entity) => $entity->getId(), $teams);
  49.         $teams   array_combine($teamIds$teams);
  50.         return $this->render('@StartPlatzAccelerator/AcceleratorStartup/index.html.twig', [
  51.             'startups'   => $startups,
  52.             'teams'      => $teams,
  53.             'menu'       => $menu,
  54.             'isEnglish'  => $isEnglish,
  55.             'pageTitle'  => $isEnglish 'AI Accelerator Startups' 'KI Accelerator Startups',
  56.             'layout'     => $layout,
  57.         ]);
  58.     }
  59.     /**
  60.      * Detail-Ansicht eines einzelnen KI-Accelerator Startups.
  61.      */
  62.     #[Route('/accelerator/startup/{id}-{slug}'name'accelerator_startup_detail'requirements: ['id' => '\d+'])]
  63.     #[Route('/en/accelerator/startup/{id}-{slug}'name'accelerator_startup_detail_en'requirements: ['id' => '\d+'])]
  64.     public function detailAction(Request $requestint $idstring $slug): Response
  65.     {
  66.                 $isEnglish str_contains($request->getPathInfo(), '/en/');
  67.         $menu $this->wordPressMenuService->getAcceleratorMenu($isEnglish$request->getPathInfo());
  68.         // User activity tracking
  69.         if ($user $this->getUser()) {
  70.             $this->entityManager->getRepository(User::class)->writeActivity($user);
  71.         }
  72.         // Find startup - must be KI Accelerator and have public visibility
  73.         $startup $this->entityManager->getRepository(Startup::class)->findOneBy([
  74.             'id' => $id,
  75.             'visibility' => 'public'
  76.         ]);
  77.         if (!$startup || $startup->getKiAccelerator() === null) {
  78.             $this->session->getFlashBag()->add('notice''Startup nicht gefunden');
  79.             return $this->redirectToRoute($isEnglish 'accelerator_startups_en' 'accelerator_startups');
  80.         }
  81.         // Redirect to correct slug if needed
  82.         if ($slug !== $startup->getSlug()) {
  83.             return $this->redirectToRoute(
  84.                 $isEnglish 'accelerator_startup_detail_en' 'accelerator_startup_detail',
  85.                 ['id' => $id'slug' => $startup->getSlug()]
  86.             );
  87.         }
  88.         // Team and access rights
  89.         $team null;
  90.         $rightToAccessTeam false;
  91.         $userMember null;
  92.         if ($user $this->getUser()) {
  93.             $userMember $this->entityManager->getRepository(Member::class)->find($user->getMemberId());
  94.         }
  95.         if ($teamId $startup->getTeamId()) {
  96.             $team $this->entityManager->getRepository(Team::class)->find($teamId);
  97.             if ($team && $userMember) {
  98.                 $rightToAccessTeam $this->entityManager->getRepository(MemberTeam::class)->checkAccessRight($userMember$team);
  99.             }
  100.         }
  101.         // Track relevance
  102.         $this->entityManager->getRepository(StartupRelevance::class)->updateByUserAction($id'click');
  103.         // Back URL for navigation
  104.         $backUrl $this->generateUrl($isEnglish 'accelerator_startups_en' 'accelerator_startups');
  105.         // Internal page URL (for CTA on public page)
  106.         $internalPageUrl $this->generateUrl(
  107.             $isEnglish 'accelerator_startup_internal_en' 'accelerator_startup_internal',
  108.             ['id' => $id'slug' => $startup->getSlug()]
  109.         );
  110.         return $this->render('@StartPlatzAccelerator/AcceleratorStartup/detail.html.twig', [
  111.             'startup'           => $startup,
  112.             'team'              => $team,
  113.             'rightToAccessTeam' => $rightToAccessTeam,
  114.             'userMember'        => $userMember,
  115.             'menu'              => $menu,
  116.             'isEnglish'         => $isEnglish,
  117.             'pageTitle'         => $startup->getName(),
  118.             'backUrl'           => $backUrl,
  119.             'internalPageUrl'   => $internalPageUrl,
  120.         ]);
  121.     }
  122.     /**
  123.      * Interne Detail-Ansicht eines KI-Accelerator Startups (Login erforderlich).
  124.      * Ebene 3: Vertiefte Informationen nur für eingeloggte Mitglieder.
  125.      */
  126.     #[Route('/accelerator/startup/{id}-{slug}/internal'name'accelerator_startup_internal'requirements: ['id' => '\d+'])]
  127.     #[Route('/en/accelerator/startup/{id}-{slug}/internal'name'accelerator_startup_internal_en'requirements: ['id' => '\d+'])]
  128.     public function internalAction(Request $requestint $idstring $slug): Response
  129.     {
  130.                 $isEnglish str_contains($request->getPathInfo(), '/en/');
  131.         $menu $this->wordPressMenuService->getAcceleratorMenu($isEnglish$request->getPathInfo());
  132.         // Find startup
  133.         $startup $this->entityManager->getRepository(Startup::class)->findOneBy([
  134.             'id' => $id,
  135.             'visibility' => 'public'
  136.         ]);
  137.         if (!$startup || $startup->getKiAccelerator() === null) {
  138.             $this->session->getFlashBag()->add('notice''Startup nicht gefunden');
  139.             return $this->redirectToRoute($isEnglish 'accelerator_startups_en' 'accelerator_startups');
  140.         }
  141.         // Redirect to correct slug if needed
  142.         if ($slug !== $startup->getSlug()) {
  143.             return $this->redirectToRoute(
  144.                 $isEnglish 'accelerator_startup_internal_en' 'accelerator_startup_internal',
  145.                 ['id' => $id'slug' => $startup->getSlug()]
  146.             );
  147.         }
  148.         // Check if user is logged in
  149.         $user $this->getUser();
  150.         if (!$user) {
  151.             // Redirect to login with return URL
  152.             return $this->redirectToRoute('login', [
  153.                 'targetPath' => $request->getUri()
  154.             ]);
  155.         }
  156.         // User activity tracking
  157.         $this->entityManager->getRepository(User::class)->writeActivity($user);
  158.         // Get member for role-based CTAs
  159.         $userMember $this->entityManager->getRepository(Member::class)->find($user->getMemberId());
  160.         // Team and access rights
  161.         $team null;
  162.         $rightToAccessTeam false;
  163.         if ($teamId $startup->getTeamId()) {
  164.             $team $this->entityManager->getRepository(Team::class)->find($teamId);
  165.             if ($team && $userMember) {
  166.                 $rightToAccessTeam $this->entityManager->getRepository(MemberTeam::class)->checkAccessRight($userMember$team);
  167.             }
  168.         }
  169.         // Track relevance (internal view = higher engagement)
  170.         $this->entityManager->getRepository(StartupRelevance::class)->updateByUserAction($id'click');
  171.         // Back URL to public page
  172.         $publicPageUrl $this->generateUrl(
  173.             $isEnglish 'accelerator_startup_detail_en' 'accelerator_startup_detail',
  174.             ['id' => $id'slug' => $startup->getSlug()]
  175.         );
  176.         return $this->render('@StartPlatzAccelerator/AcceleratorStartup/internal.html.twig', [
  177.             'startup'           => $startup,
  178.             'team'              => $team,
  179.             'rightToAccessTeam' => $rightToAccessTeam,
  180.             'userMember'        => $userMember,
  181.             'menu'              => $menu,
  182.             'isEnglish'         => $isEnglish,
  183.             'pageTitle'         => $startup->getName() . ' - ' . ($isEnglish 'Internal' 'Intern'),
  184.             'publicPageUrl'     => $publicPageUrl,
  185.         ]);
  186.     }
  187. }