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

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