src/StartPlatz/Bundle/PartnersBundle/Controller/PartnerPublicDetailController.php line 46

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\StartPlatz\Bundle\PartnersBundle\Controller;
  4. use App\StartPlatz\Bundle\PartnersBundle\Entity\Partner;
  5. use App\StartPlatz\Bundle\PartnersBundle\Repository\PartnerRepository;
  6. use Doctrine\ORM\EntityManagerInterface;
  7. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\HttpFoundation\Response;
  10. use Symfony\Component\Routing\Annotation\Route;
  11. /**
  12.  * Partner Public Detail Controller (Layer 2)
  13.  *
  14.  * UP-008: This controller handles the Layer 2 public detail page.
  15.  *
  16.  * Layer 2 shows:
  17.  * - Practice description (praxis-based content)
  18.  * - Signal blocks (4 types)
  19.  * - NO marketing/sales content
  20.  *
  21.  * Route: /partners/{slug}
  22.  */
  23. #[Route('/partners')]
  24. class PartnerPublicDetailController extends AbstractController
  25. {
  26.     private PartnerRepository $partnerRepository;
  27.     public function __construct(
  28.         EntityManagerInterface $em
  29.     ) {
  30.         $this->partnerRepository $em->getRepository(Partner::class);
  31.     }
  32.     /**
  33.      * Layer 2: Public Partner Detail Page
  34.      *
  35.      * Shows partner's practice description and signals.
  36.      * No marketing/sales content, just factual praxis information.
  37.      */
  38.     #[Route('/{slug}'name'partner_layer2_detail'requirements: ['slug' => '[a-z0-9_\-]+'])]
  39.     #[Route('/en/{slug}'name'partner_layer2_detail_en'requirements: ['slug' => '[a-z0-9_\-]+'])]
  40.     public function detailAction(string $slugRequest $request): Response
  41.     {
  42.         $isEnglish str_contains($request->getPathInfo(), '/en/');
  43.         $language $request->query->get('lang'$isEnglish 'en' 'de');
  44.         // Find partner entity
  45.         $partner $this->partnerRepository->findBySlug($slug);
  46.         if (!$partner || !$partner->isActive()) {
  47.             throw $this->createNotFoundException('Partner not found');
  48.         }
  49.         $team $partner->getTeam();
  50.         // Get signals based on language
  51.         $signals $partner->getSignalsLocalized($language);
  52.         // Prepare signal types with labels
  53.         $signalTypes = [
  54.             'real_problem' => [
  55.                 'label_de' => 'Echte Probleme',
  56.                 'label_en' => 'Real Problems',
  57.                 'icon' => 'exclamation-triangle',
  58.                 'color' => 'danger',
  59.             ],
  60.             'pattern_constraint' => [
  61.                 'label_de' => 'Muster & Einschränkungen',
  62.                 'label_en' => 'Patterns & Constraints',
  63.                 'icon' => 'puzzle-piece',
  64.                 'color' => 'warning',
  65.             ],
  66.             'learning_insight' => [
  67.                 'label_de' => 'Erkenntnisse & Insights',
  68.                 'label_en' => 'Learnings & Insights',
  69.                 'icon' => 'lightbulb',
  70.                 'color' => 'info',
  71.             ],
  72.             'capability_expertise' => [
  73.                 'label_de' => 'Fähigkeiten & Expertise',
  74.                 'label_en' => 'Capabilities & Expertise',
  75.                 'icon' => 'star',
  76.                 'color' => 'success',
  77.             ],
  78.         ];
  79.         return $this->render('@StartPlatzPartners/Public/partners-detail.html.twig', [
  80.             'partner' => $partner,
  81.             'team' => $team,
  82.             'language' => $language,
  83.             'signals' => $signals,
  84.             'signalTypes' => $signalTypes,
  85.             'practiceDescription' => $partner->getPracticeDescriptionLocalized($language),
  86.         ]);
  87.     }
  88. }