- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我看到了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/我的登录 Controller
$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');
/login
有效:我回到我的主页已连接。/fr/login
它不起作用:我的 URL 变成了 /fr/login_check
给我发一个error 404
(这是正常的,因为我没有此 URL 的 View /页面,但不知道为什么它会尝试显示此页面并且不像以前那样连接我)。所以我尝试在我的安全提供程序中更改它:
'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}/
)并按照我看到的解决方案中的建议更改我的登录 Controller :
$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/login
并且有效。/fr/en/login
登录,然后我回到我的 error 404
在网址上 /fr/login_check
.当我尝试从 /fr/my-page
注销时遇到同样的问题用error 404
在网址上 /fr/logout
...
任何使 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
最佳答案
我想我设法通过这种方式解决了我的问题:
1/为了避免我的 error 404
当我使用不同于 en
的其他语言环境时登录和注销,我将用户重定向到 en
在我的 check_path
和 logout
之前:
// The login form action
<form role="form" action="{{ locale_generate('en', 'login_check') }}" method="post">
// The logout
<a href="{{ locale_generate('en', 'logout') }}"> <span class="log">{{ 'logout'|trans }}</span></a>
这种方式有效,但用户总是以英语返回,所以我必须在我的页面中重定向他,但使用与以前相同的语言环境。
2/所以我在 session 中添加了选定的语言(如果我没有$_SESSION['langue']
,我使用我的默认语言环境作为值:en
)
//===============================================
// My Ajax call where I send the selected langage value
//===============================================
$(".change_langue").on("click", function() {
var new_langue = $(this).data("lg");
$.ajax({
url: "{{ path('new-langue') }}",
type: 'POST',
data: {'langue': new_langue},
success: function (resp) {
console.log(resp);
},
error: function (resp) {
console.log(resp);
}
});
});
//========================================================
// My controller where I set the value in session
//========================================================
$app->post('/new-langue', function(Request $request) use ($app) {
$new_langue = $request->get('langue');
$app['session']->set('langue', $new_langue);
$result['new_langue'] = $app['session']->get('langue');
return new Response(json_encode($result));
})->bind('new-langue');
3/然后我在注册 SecurityProvider 时更改默认登录路径:
$app->register(new Silex\Provider\SecurityServiceProvider(), array(
'security.firewalls' => array(
'secured' => array(
'pattern' => '^/',
'anonymous' => true,
'form' => array(
'login_path' => 'login',
'check_path' => '/login_check',
'always_use_default_target_path' => true, // I add this line
'default_target_path' => '/login/redirect' // I add this line
),
'logout' => array(
'logout_path' => '/logout',
'invalidate_session' => true,
),
'users' => function () use ($app) {
return new _mypixers_silex\DAO\UserDAO($app['db']);
},
),
),
));
4/现在在我的新 /login/redirect
Controller 中,我检查 $_SESSION['langue']
值并重定向到正确的语言:
//========================================================
// LOGIN REDIRECT
//========================================================
$app->get('/login/redirect', function(Request $request) use ($app) {
$session_langue = $app['session']->get('langue');
if (empty($session_langue)) {
$session_langue = 'en';
}
return $app->redirect($app['locale.url_generator']->generate($session_langue, 'pixers'));
})->bind('login_redirect');
这样,当我使用 en
以外的其他语言环境登录或注销时,我不会再出现错误,并且用户会使用他当前的语言。
PS:我现在注销时仍然会回到英语,但我正在研究解决方案。完成后我会编辑我的答案
关于php - 硅胶 2 : Security firewall error with locale (Silex SecurityServiceProvider + Pmaxs\LocaleServiceProvider),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49236815/
我正在编写一个 Web 应用程序,它有一个前置网站,然后是一个管理控制台。我希望能够有一个设置,当设置为 true 时,意味着在前端网站上显示一个保留或维护页面。 我的路由配置目前在一个 yaml 文
我正在我的 app.php 文件中做这样的共享服务: $app['rules'] = $app->share(function() use($app) { return new MyProje
这是一个关于第一次使用 Silex 的非常基本的问题。 我要安装this project链接自 this tutorial .我已经按照 these instructions 通过 Composer
我正在使用 Silex 1.1 和 Monolog 1.0.0。我的代码和我的问题: $app->register(new Silex\Provider\MonologServiceProvider(
我环顾四周,似乎无法弄清楚如何在使用 Silex 时链接到静态文件。我已经看到一些关于 Symfony 的类似问题/答案,但它们涉及 YML 路由文件,我不将其与 Silex 一起使用。 我的情况 我
我环顾四周,似乎无法弄清楚如何在使用 Silex 时链接到静态文件。我已经看到一些关于 Symfony 的类似问题/答案,但它们涉及 YML 路由文件,我不将其与 Silex 一起使用。 我的情况 我
我在 Silex 中定义了几个路由,但我不知道如何捕获不存在的路由。 例如: $app->get('/category/{name}', 'Acme\Controller\Main::category
我想将 Silex 与 MongoDB 一起使用。我想最好的方法是使用再次使用 Doctrine MongoDB 库的 Silex 扩展。 现在有两个 Silex Extensions 似乎提供了这个
我安装了 phpunit 3.6.12 和 Silex。在我的应用程序的根目录中,我有包含简单测试文件 BlogFunctionTest.php 的测试目录 assertGreaterThan(0,
我最近将一切正常的 Silex v1.3 项目迁移到了 Silex v2。我收到一个 Twig 错误,我不明白原因 Twig_Error_Runtime in Template.php line 59
我正在开发一个带有 silex-skeleton 的最新版本的项目。尝试使用 share 方法时显示以下错误: 代码: $app['login'] = $app->share(function() u
我有一个大问题,我不知道为什么 silex 异常处理程序不捕获异常? 我的简单代码如下所示: error(function (\Exception $e, $code) { exit('asd');
在 Symfony 中,可以通过在 security.yml 文件中添加 invalidate_session: false 来避免 session 在注销时被破坏。 遗憾的是,这在 Silex 中不
我尝试使用 silex 文档为 LDAP 身份验证编写自定义身份验证提供程序 - Defining a custom Authentication Provider . 但如果我查看 $app['se
我想要一条匹配“任何东西”的路线。如果数据库中存在具有给定路径的页面,我想从“任何”值中查找。如果是,则需要处理此路由,否则应处理下一个匹配的路由。 有没有简单的方法可以解决这个问题,还是我错过了路线
我试图在 Controller 上设置错误处理程序,以捕获可能导致页面故障的所有内容。例如:在这种情况下,我试图捕获我的方法使用错误的参数调用外部API后可能发生的任何错误,但是除了给我提供典型的Cl
Silex 中是否可以根据抛出的异常使用错误处理程序? 我知道这可以通过单个异常处理程序和抛出异常的类名上的 switch 语句来实现,但对我来说,“Silex 方式”似乎更干净,但不起作用。 这就是
我的目标是将FOQElasticBundle与我的Silex网站链接。 问题是FOQElasticBundle的documentationn声明我只需要在config.yml文件中放入一些基本内容即可
有没有我可以通过 $app 变量 (Silex\Application) 调用的函数来访问 Web 根目录和应用程序根目录? 假设我的项目布局是这样的 /src run() 在 src/cont
我的路由有三个参数,userid 总是必需的,a 和 b 是可选参数。可以给出 a or (a and b) or (neither a nor b): $app->get('/show/{useri
我是一名优秀的程序员,十分优秀!