この間、セキュリティ管理>システム設定画面で設定を更新しようとした時に困ったことを書きます。
すでに運用されているサイトだったため、管理画面URL設定はadmin以外が指定されていたのですが、他の項目を入力して更新ボタンを押したら
管理画面URL設定項目でエラー
admin_route_dirのFormTypeは以下の通り。
->add('admin_route_dir', TextType::class, [
'constraints' => [
new Assert\NotBlank(),
new Assert\Length(['max' => $this->eccubeConfig['eccube_stext_len']]),
new Assert\Regex([
'pattern' => '/\A\w+\z/',
]),
new Assert\Regex([
'pattern' => "/^(?!($routes)$).*$/",
]),
],
'data' => $this->eccubeConfig->get('eccube_admin_route'),
])
'pattern' => '/\A\w+\z/'のパターンで引っかかってる訳ではなさそうなので、その下のバリデーションで引っかかってるみたいです。
こちらはフロント画面と同じルートと同じ文字列を使用していないかチェックをしている箇所です。
var_dumpを使用して$routesの中身をチェック
フロント画面のルートの中に管理画面URL設定で設定しているルートも含まれてます。
これでは更新する場合に同じルートでは更新ができないということになってしまいますね。
こちらを回避する方法としては、
src/Eccube/Form/Type/Admin/SecurityType.php
でフロントのルートを取得しているところでconfigのeccube_admin_routeを比較して同じだった場合は除外
という処理を入れてあげればいいかと思います。
private function getRouteCollection(): string
{
$frontRoutesUrlList = [];
$routes = $this->router->getRouteCollection();
foreach ($routes as $routeName => $route) {
$path = $route->getPath();
// 管理画面以外
if (false === stripos($routeName, 'admin')
&& false === stripos($path, '/_')
&& false === stripos($path, 'admin')
) {
$arr = explode('/', $path);
foreach ($arr as $target) {
if (!empty($target)) {
+ if ($target === $this->eccubeConfig->get('eccube_admin_route')) {
+ //管理画面URLは除外
+ continue;
+ }
//↑ここまで
$target = preg_quote($target);
$frontRoutesUrlList[$target] = $target;
}
}
}
}
return implode('|', $frontRoutesUrlList);
}
もう一度更新。
ちゃんと保存されましたね。
この現象が起きるのはプラグインによる影響かと思います。
@Route("/%eccube_admin_route%/route/test", name="route_test")
上記の処理が入ってるプラグインを導入している場合、フロント画面のルートを取得する時に取れてしまってるようなので、
もしかしたら本体のバグ、、の様な気もしますね。
同じ様な現象で困った方がいらっしゃいましたら参照にしてもらえると嬉しいです