web-dev-qa-db-ja.com

ユーザー/ログインユーザー/ユーザーの登録/ログアウトで404をデバッグする方法は?

8.4.2にDrupal 8サイトがあります。8.5.1にアップグレードすると、データベースの更新を実行した後、パス/user/register/user/login/user/logoutは404を返します。

  • Drush(drush uli myuser)でログインできるので、実際にログインすることは可能ですが、ログイン画面が表示されません。
  • カスタムモジュールをアンインストールしてみましたが、問題は解決しません。
  • /admin/reports/dblogを確認しましたが、/user/loginのエラーとして「ページが見つかりません」と表示されます。

この 同様の問題に関する質問 は具体的すぎるため、オフトピックとしてクローズされました。私の質問は「これをどのようにデバッグできますか?」 「私の問題の原因は何ですか」ではありません。

3
Patrick Kenny

@AndrewKillen:

Develでチェックすると、user.loginルートをチェックするときに「url '/ user/login'のルートをロードできません」と表示されます。

これがどのようにデバッグされるか(私は壊れたサイトを持っていないので、実際の例で):

Xdebugを有効にして、次のURLに移動します:/ devel/routes/item?path =/user/login

Drupal\devel\Controller\RouteInfoController :: routeDetail:

_  public function routeDetail(Request $request, RouteMatchInterface $route_match) {
    $route = NULL;

    // Get the route object from the path query string if available.
    if ($path = $request->query->get('path')) {
      try {
        $route = $this->router->match($path);
_

最後の行にブレークポイントを設定し、match($path)にステップインします。次に、パス情報を含む新しいリクエストが作成されたら、次のようになります。

Router :: matchRequest:

_  public function matchRequest(Request $request) {
    $collection = $this->getInitialRouteCollection($request);
    if ($collection->count() === 0) {
      throw new ResourceNotFoundException(sprintf('No routes found for "%s".', $this->currentPath->getPath()));
    }
    $collection = $this->applyRouteFilters($collection, $request);

    if ($ret = $this->matchCollection(rawurldecode($this->currentPath->getPath($request)), $collection)) {
      return $this->applyRouteEnhancers($ret, $request);
    }
_

getInitialRouteCollection()は、3つの一致の可能性があります。

  • user.login
  • user.login.http
  • entity.user.canonical

2番目のものはapplyRouteFilters()でフィルタリングされます。これはPOSTのみで、JSONのためです。エンティティルートは、コンパイルされたルートがmatchCollection()で一致した後に削除されます「ログイン」は有効なユーザーではないためです。

したがって、ルートuser.loginは最後に残って返されるルートです。そうでない場合は、この方法でルートが収集またはフィルタリングされない場所を確認する必要があります。

4
4k4