Symony 5 PHP:处理白标路由的可能解决方案

Symony 5 PHP : Possible solutions handling whitelabel routes

提问人:StevieStef 提问时间:10/9/2023 更新时间:10/9/2023 访问量:53

问:

很长一段时间后,我又回到了 Symfony,以便让其他开发人员更容易访问它,并将其正确地集成到其他人的项目中。 我面临的问题是我的项目使用白标,我很难在网上找到合适的解决方案。 我目前正在使用Symfony 5。

看起来路由的 Locale 前缀可能是一个很好的解决方案,但这可能只适用于区域设置,而不适用于白标。我真的找不到如何以不同的方式使用前缀的答案。 白标的数量会随着时间的推移而增加,我更喜欢硬编码的解决方案。我宁愿在配置和/或数据库中添加白标。 我还尝试将我的项目重新编码为 Symfony 中的捆绑包。

目前,我找到了 2 个可能的选项:在捆绑包中使用路由 .php 或为每个白标添加控制器操作,将请求转发到适当的控制器。 主控制器操作路由由控制器中的注释/属性映射,例如:

/**
 * @Route("/mainlabel/test", name="mainlabel_test")
 * @return Response
 */

但是“routes.php 解决方案”的问题在于我想获取所有可用路由的列表,因此我可以“复制”“主标签”路由旁边的白标路由。我目前无法弄清楚如何获取路由列表,如果这在路由配置时是可能的。 它将是以下内容的更动态版本:

// config/routes.php
use App\Controller\TestController;
use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;

return static function (RoutingConfigurator $routes): void {
    $labels = ['whitelabel_alpha', 'whitelabel_beta', 'whitelabel_gamma'];
    
    foreach ($labels as $label) {
        $routes->add("{$label}_test", "{$label}/test")
            ->controller([TestController::class, 'test'])
        ;
    }
};

我想我可以只写一个服务或其他东西来处理白标的差异。

我想到的另一个解决方案是为每个白标创建一个控制器操作。它将以这种方式进行部分硬编码,但可能是一个更可行/更常见的解决方案:

/**
 * @Route("/whitelabel_alpha")
 * @Route("/whitelabel_alpha/{action}")
 * @Route("/whitelabel_alpha/{action}/{id}")
 * @return Response
 */
public function whitelabelAlpha(string $action=null, int $id=null): Response
{
    $params = [];
    $route = 'mainlabel';
    if (!empty($action) ) {
        $route .= '_' . $action;
    }
    if (!empty($id) ) {
        $params['id'] = $id;
    }
    try {
        $url = $this->generateUrl($route, $params);
        
        $response = $this->forward('Bundle/Controller/TheRightController::theRightAction', $params);
        return $response;
    } catch (RouteNotFoundException) {
    }
}

我只是无法真正找到有关如何通过路由名称获取控制器/操作的解决方案。几乎所有的搜索结果都相反。(如何通过控制器/操作获取路由)

如果我的问题没有正确表述/格式,我事先道歉。第一次问题。很高兴听到任何评论/批评如何改进。

php symfony symfony5

评论


答:

-1赞 ThomasL 10/9/2023 #1

你的第一个解决方案对我来说听起来不错,是一个很好的方法。 您面临着我不知道的复杂问题,所以我将尝试一种“简单”的方法。如果你想让我改进我的答案,请改进你的问题。

您不需要为每个白标设置路由

只需像/{whitelabelname}/{action}/{id}

您不需要每个操作的控制器

控制器返回响应。所以不要做更多的控制器。只需根据你的 whilabel 操作在类中构建响应,并将其返回到控制器即可。但不要为多个控制器而烦恼。

你需要一个特定的“服务”或类,它应该根据你的白标来构建响应

2 选项:

如果您总是对新的白标进行编码,那就很容易了。只需创建一个枚举,根据路由参数引用白标所需的所有类。

如果白标数量增加,您不知道谁可以添加或何时添加。这要困难得多。 您需要将其存储在数据库中,并链接到它。

我的主要问题是为了能够改进您的答案: 为什么看起来您的所有白标功能都因白标而异?


从我的角度来看,做完全相同的事情,而不是
只有返回的数据不同,因为所有者不同。 在这种情况下,您甚至不需要多个“服务”即可在控制器中返回正确的数据
whitelabel Afeature Awhitelabel BFeature A

评论

0赞 StevieStef 10/12/2023
每个白标的一般特征是相同的。有一些细微的差异,例如产品选项不适用于白标 A,或者仅适用于白标 B。我想象着用检查URL的白标部分的服务来解决这个问题。我没有具体说明为什么我不想使用像这样的通用路由:/{whitelabelname}/{action}/{id} 然而,可能性不大,我可能会与开发主项目的路由共享类似的路由。我最好使用 yaml 配置来定义白标(自定义徽标等)。