交响乐 routing/URLs

Symfony routing/URLs

我正在制作一个简单的项目,您可以在其中创建您的域(如 slack 等),然后在域内创建项目并在项目内创建任务。

我制作了 login/register 系统和表单,用于在您登录时添加域。 我在 table 之间建立了关系。 在域 table 中,我有一个名为 url 的字段,它是随机的 4 位整数。

我不知道我的 link 到 domain->project->task 应该是什么样子。 我在考虑 /main/?k=1234 1234 1234 其中每 4 位数字代表上述方案。

问题是:我应该这样做还是找到其他方法?

{
    /**
     * @Route("main", name="app_main")
     */
    public function new(Request $request): Response
    {
        $domain = new Domain();
        $form = $this->createForm(DomainFormType::Class, $domain);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $User = $this->getUser()->getID();
            $domain->setUsers($User);
            $domain->setUrl(rand(100000, 999999));

            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->persist($domain);
            $entityManager->flush();
            }

        return $this->render('main.html.twig', [
            'form' => $form->createView(),
        ]);
    }
}```

您的 "keys" 太简单了,您最终可能会重复。如果可能,只需使用 domain/project/task 的主键 (id)。在那种情况下,您可能不再需要这三个实体中的 $url 属性。

但是当您试图想出一个更复杂的方案时,我想您希望匿名用户可以访问这些 url,而不是让任何在 URL 中尝试随机 ID 的人都可以访问它们。 如果这就是您要实现的目标,请考虑使用随机字符串而不是随机整数。下面是一个随机字符串生成的例子,它实际上被 Symfony 用来生成安全令牌:

$entropy = 128;
$bytes = random_bytes($entropy / 8);
$randomString = rtrim(strtr(base64_encode($bytes), '+/', '-_'), '=');

它 returns 一个 URL 安全的 base64 编码加密安全伪随机字符串,不包含“+”、“/”或“=”,需要 URL编码。字符串长度为 ceil($entropy / 6).

如果您真的需要使用 int 密钥,rand() 不是加密安全的(这意味着它不像我们希望的那样随机),请改用 random_int()

无论哪种方式,请考虑确保您不会获得重复的条目并将这些 url 字段设置为数据库中的 unique。 如果你的 "keys" 不是很长,或者你想处理 "one in a billion" 案例并避免数据库异常,你也可以在生成随机 "url" 时手动检查重复项(可能使用 findOneBy()) 并在找到匹配项时生成另一个 "url" (例如,执行生成 + 检查 while 循环并在未找到匹配项时中断循环,然后 setUrl($randomUrl))