代码之家  ›  专栏  ›  技术社区  ›  Patrick

在框架中包装旧应用程序

  •  0
  • Patrick  · 技术社区  · 9 年前

    我有一个遗留的应用程序,代码不好,而且未经测试。这是一个很大的版本,因此我们没有人力一步开发一个新版本。

    所以我想将其打包到Symfony应用程序中,并用Symfony编写新的部分。然后将逐步重构旧类。

    如果symfony触发404,我尝试在应用程序中包含legacys frontcontroller。这很好。 但如果我现在使用该应用程序,我会发现它的旧路由系统和symfonys.htaccess存在错误。

    symfony.htaccess看起来像这样

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ app.php [QSA,L]
    

    遗产.htaccess看起来像这样

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !\.(css|jpg|png|gif|js|xml)$ [NC]
    RewriteRule ^(.*)$ index.php?_shop_=$1 [L,QSA]
    

    _shop_参数用于路由等,旧应用程序的路由器依赖于它。 你知道我怎么能把这件事搞清楚吗?

    1 回复  |  直到 9 年前
        1
  •  1
  •   Francesco Abeni    9 年前

    如果你想在.htaccess中解决这个问题,你必须定义有效的路由。

    让我们假设您的旧应用程序具有以下可能的路由和重定向:

    /listing => index.php?shop=listing
    /detail => index.php?shop=detail
    /cart => index.php?shop=cart
    

    然后你会希望你的.htaccess看起来像这样

    RewriteCond %{REQUEST_FILENAME} (listing|detail|cart)
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !\.(css|jpg|png|gif|js|xml)$ [NC]
    RewriteRule ^(.*)$ index.php?_shop_=$1 [L,QSA]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ app.php [QSA,L]
    

    如果这行对您的需要来说太简单,您可以利用重写规则中OR标志具有更高优先级的事实,并编写如下内容:

    RewriteCond %{REQUEST_FILENAME} ^listing/something$ [OR]
    RewriteCond %{REQUEST_FILENAME} ^detail/[complexRegex] [OR]
    RewriteCond %{REQUEST_FILENAME} ^cart/...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !\.(css|jpg|png|gif|js|xml)$ [NC]
    RewriteRule ^(.*)$ index.php?_shop_=$1 [L,QSA]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ app.php [QSA,L]
    

    如果你想要更高级的东西,你必须在应用程序级别(即在index.php或app.php中)解决,而不是在.htaccess中