【发布时间】:2018-08-20 13:36:04
【问题描述】:
我看到了this solution,但我无法让它工作......
这是我的代码,我尝试了什么,得到了什么:
我的代码
1/ 我的安全提供商:
$app->register(new Silex\Provider\SessionServiceProvider());
$app->register(new Silex\Provider\SecurityServiceProvider(), array(
'security.firewalls' => array(
'secured' => array(
'pattern' => '^/',
'anonymous' => true,
'logout' => true,
'form' => array(
'login_path' => '/login',
'check_path' => '/login_check'),
'users' => function () use ($app) {
return new Myapp\DAO\UserDAO($app['db']);
},
),
),
));
2/ 我的翻译提供商
我使用:https://github.com/pmaxs/silex-locale
$app->register(new Silex\Provider\TranslationServiceProvider());
$app->register(new \Pmaxs\Silex\Locale\Provider\LocaleServiceProvider(), [
'locale.locales' => ['en', 'fr'],
'locale.default_locale' => 'en',
'locale.resolve_by_host' => false,
'locale.exclude_routes' => ['^_']
]);
$app->register(new Silex\Provider\LocaleServiceProvider());
$app->extend('translator', function($translator, $app) {
$translator->addLoader('yaml', new YamlFileLoader());
// The translation file : one by langage, add new here
$translator->addResource('yaml', __DIR__.'/../src/locales/en.yml', 'en');
$translator->addResource('yaml', __DIR__.'/../src/locales/fr.yml', 'fr');
return $translator;
});
这样我的路线没有/{_locale}/,但当我有/my-path、/locale/my-path时仍然有效。
3/ 我的登录控制器
$app->get('/login', function(Request $request) use ($app) {
return $app['twig']->render('login.html.twig', array(
'error' => $app['security.last_error']($request),
'last_username' => $app['session']->get('_security.last_username'),
));
})->bind('login');
我尝试了什么 - 我得到的错误
- 当我的 URL 为
/login时,它可以正常工作:我回到已连接的主页。 - 当我的 URL 为
/fr/login时,它不起作用:我的 URL 变为/fr/login_check并发送给我一个error 404(这是正常的,因为我没有此 URL 的视图/页面,但不知道它为什么尝试显示此页面,不要像以前那样连接我)。
所以我尝试在我的安全提供程序中更改它:
'form' => array(
'login_path' => '/login',
'check_path' => '/{_locale}/login_check'),
它给我一个error 500 : An exception has been thrown during the rendering of a template ("Unable to generate a URL for the named route "login_check" as such route does not exist.").
所以我回到我的其他安全提供商(没有/{_locale}/)并按照我看到的解决方案中的建议更改我的登录控制器:
$app->get('/{_locale}/login', function(Request $request) use ($app) {
return $app['twig']->render('login.html.twig', array(
'error' => $app['security.last_error']($request),
'last_username' => $app['session']->get('_security.last_username'),
));
})->bind('login');
- 现在,当我尝试使用我的默认语言环境 (en) 登录时,我有这个 URL
/en/login并且它可以工作。 - 当我尝试更改法语的语言时,我使用此 URL
/fr/en/login登录,然后我在 URL/fr/login_check上返回到我的error 404。
当我尝试在 URL /fr/logout 上使用 error 404 从 /fr/my-page 注销时遇到同样的问题...
有什么想法可以让 Silex 安全提供程序与 pmaxs/silex-locale 一起使用?
即使我的用户选择了其他语言,一位同事建议我留在“en”中进行登录和注销(因为它有效)。
你认为这是个好主意吗? (我不是 100% 好的,因为这样我无法翻译我的内容)
编辑:
由于我的问题没有答案,我尝试检查我的两条路线 /login_check 和 /logout 看看是否可以更改它们,你知道我在哪里可以找到它们吗?
然后,我尝试在去这两条路线之前进行一些重定向,但不知道我该怎么做......这个想法:
// If I log from those URL, it works
/login
/en/login
// If I log from those, it doesn't works :
/fr/login
/fr/fr/login
// So from the URL that doesn't works, I'd like to do :
/fr/login ---> redirect to /login ---> execute code
/fr/fr/login ---> redirect to /en/login ---> execute code
/logout 也是如此。 知道我是否可以做到以及如何做到这一点?
结束编辑
PS:这是关于这个项目的另一个问题,我解释了我如何允许用户更改网站上的语言:Silex : allow user to change langage by clicking on html element and keeping clean URL
【问题讨论】:
-
将您的登录路径更改为: $app->get('/{_locale}/login', function(Request $request) use ($app) ... 以及您的安全提供者 'check_path' => '/login_check' (没有语言环境),然后为所有链接创建从控制器绑定中获取名称。
-
@root66 如果你检查“我试过的 - 我得到的错误”部分,我试过了 :)
-
在模板中:
-
您的链接创建似乎是问题所在。您写道“当我尝试更改法语的语言时,我有这个 URL /fr/en/login 来登录”。如何创建登录链接?正确的做法是在模板中使用绑定名称:{{ path('login') }}
-
@root66 这是关于这个项目的另一个问题 + anwser(检查我的,看看我做了什么),我解释了我如何从一种语言变为另一种语言:stackoverflow.com/questions/49055253/…
标签: php symfony frameworks silex