提问人:StevieStef 提问时间:10/9/2023 更新时间:10/9/2023 访问量:53
Symony 5 PHP:处理白标路由的可能解决方案
Symony 5 PHP : Possible solutions handling whitelabel routes
问:
很长一段时间后,我又回到了 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) {
}
}
我只是无法真正找到有关如何通过路由名称获取控制器/操作的解决方案。几乎所有的搜索结果都相反。(如何通过控制器/操作获取路由)
如果我的问题没有正确表述/格式,我事先道歉。第一次问题。很高兴听到任何评论/批评如何改进。
答:
你的第一个解决方案对我来说听起来不错,是一个很好的方法。 您面临着我不知道的复杂问题,所以我将尝试一种“简单”的方法。如果你想让我改进我的答案,请改进你的问题。
您不需要为每个白标设置路由
只需像/{whitelabelname}/{action}/{id}
您不需要每个操作的控制器
控制器返回响应。所以不要做更多的控制器。只需根据你的 whilabel 操作在类中构建响应,并将其返回到控制器即可。但不要为多个控制器而烦恼。
你需要一个特定的“服务”或类,它应该根据你的白标来构建响应
2 选项:
如果您总是对新的白标进行编码,那就很容易了。只需创建一个枚举,根据路由参数引用白标所需的所有类。
如果白标数量增加,您不知道谁可以添加或何时添加。这要困难得多。 您需要将其存储在数据库中,并链接到它。
我的主要问题是为了能够改进您的答案: 为什么看起来您的所有白标功能都因白标而异?
从我的角度来看,做完全相同的事情,而不是
只有返回的数据不同,因为所有者不同。
在这种情况下,您甚至不需要多个“服务”即可在控制器中返回正确的数据whitelabel A
feature A
whitelabel B
Feature A
评论