resolve($companySlug, $slug); $company = $employee->getCompany(); $tenant = new ResolvedTenant(ResolvedTenant::KIND_COMPANY, $company->getReseller(), $company); return $this->render('public/profile.html.twig', [ 'e' => $employee, 'branding' => $branding->forTenant($tenant)['branding'], 'profileUrl' => $this->profileUrl($employee), 'shareUrl' => $this->shareUrl($employee), 'walletEnabled' => null !== $employee->getShortCode() && ($wallet->isAppleConfigured() || $wallet->isGoogleConfigured()), ]); } #[Route('/p/{companySlug}/{slug}/vcard.vcf', name: 'public_profile_vcard', methods: ['GET'])] public function vcard(string $companySlug, string $slug, VCardBuilder $builder): Response { $employee = $this->resolve($companySlug, $slug); return new Response($builder->build($employee), 200, [ 'Content-Type' => 'text/vcard; charset=utf-8', 'Content-Disposition' => sprintf('attachment; filename="%s.vcf"', $employee->getSlug()), ]); } #[Route('/p/{companySlug}/{slug}/qr.png', name: 'public_profile_qr', methods: ['GET'])] public function qr(string $companySlug, string $slug): Response { $employee = $this->resolve($companySlug, $slug); $result = (new Builder( writer: new PngWriter(), data: $this->shareUrl($employee), encoding: new Encoding('UTF-8'), errorCorrectionLevel: ErrorCorrectionLevel::Medium, size: 320, margin: 12, ))->build(); return new Response($result->getString(), 200, ['Content-Type' => $result->getMimeType()]); } private function resolve(string $companySlug, string $slug): Employee { $employee = $this->employees->findPublic($companySlug, $slug); if (null === $employee) { throw $this->createNotFoundException('Profil nicht gefunden.'); } return $employee; } private function profileUrl(Employee $employee): string { return $this->generateUrl('public_profile', [ 'companySlug' => $employee->getCompany()->getSlug(), 'slug' => $employee->getSlug(), ], UrlGeneratorInterface::ABSOLUTE_URL); } /** * Stabile Teilen-URL: bevorzugt den Kurz-Code (/t/{code}, NFC/QR-tauglich), * fällt sonst auf die Profil-URL zurück. */ private function shareUrl(Employee $employee): string { if (null !== $employee->getShortCode()) { return $this->generateUrl('short_link', ['code' => $employee->getShortCode()], UrlGeneratorInterface::ABSOLUTE_URL); } return $this->profileUrl($employee); } }