很长一段时间后,我回到了Symfony,以便让其他开发人员更容易访问,并将其正确地集成到其他人的项目中。我面临的问题是,我的项目使用白标签,我很难在网上找到合适的解决方案。我现在用的是Symfony 5。
看起来路由的Locale前缀可能是一个很好的解决方案,但这可能只适用于locale,而不适用于whitelabels。我真的找不到一个答案如何使用不同的前缀。白标签的数量会随着时间的推移而增加,我不喜欢硬编码的解决方案。我宁愿在配置和/或数据库中添加白标签。我还试图重新编码我的项目作为一个捆绑在Symfony。
目前,我发现了两个可能的选择:在bundle中使用routes.php或为每个白标签添加一个Controller操作,将请求转发到适当的控制器。主控制器动作路由由控制器中的注解/属性Map,如:
/**
* @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) {
}
}
我只是不能真正找到一个解决方案,如何获得控制器/行动的路由名称。几乎所有的搜索结果都相反。(如何通过控制器/动作获取路由)
我事先道歉,以防我的问题没有制定/格式正确。第一次提问很高兴听到任何关于如何改进的评论/批评。
1条答案
按热度按时间ojsjcaue1#
你的第一个解决方案听起来不错,我认为这是一个很好的方法。你正面临着复杂的问题,我不知道,所以我会尝试一个“简单”的方法。如果你想让我改进答案,就改进你的问题。
不需要每个白色标签都有路由
只需像
/{whitelabelname}/{action}/{id}
一样构建路由不需要每个动作都有控制器
控制器返回响应。所以不要做更多的控制器。只需根据whilabel操作在类中构建响应并将其返回给控制器。但不要打扰自己与多个控制器。
您需要一个特定的“服务”或类,它应该根据您的白标签构建响应
2个选项:
如果你总是编写新的白标签,这很容易。只需创建一个枚举,根据路由参数为您的白标签引用所有需要的类。
如果有一个增量的白标签,你不知道谁可以添加它或什么时候。这就难多了。您需要将其存储在数据库中,并将某种配置链接到它。
我的主要问题是能够改善你的回答:为什么看起来你所有的白标签功能从一个白标签到另一个不同?
从我的Angular 来看,
whitelabel A
feature A
与whitelabel B
Feature A
做的事情完全相同只有返回的数据不同,因为所有者不同。在这种情况下,您甚至不需要多个“服务”来返回控制器中的正确数据