在框架中包装遗留应用程序
Wrapping legacy Application in Framework
我有一个遗留应用程序,代码错误且未经测试。太大了,我们没有人力一次性开发一个新版本。
所以我想将它包装到一个 Symfony 应用程序中,并在 Symfony 中编写新的部分。旧的类接下来会一步步重构
如果 symfony 触发 404,我尝试在应用程序中包含遗留的前端控制器。效果很好。
但是,如果我现在使用该应用程序,我会发现它的旧路由系统和 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_= [L,QSA]
_shop_参数用于路由等,旧应用的Router依赖于它。
知道我怎么能把它放在一起吗?
如果你想在 .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_= [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_= [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ app.php [QSA,L]
如果您想要更高级的东西,您必须在应用程序级别(即在 index.php 或 app.php 内)而不是在 .htaccess
中解决它
我有一个遗留应用程序,代码错误且未经测试。太大了,我们没有人力一次性开发一个新版本。
所以我想将它包装到一个 Symfony 应用程序中,并在 Symfony 中编写新的部分。旧的类接下来会一步步重构
如果 symfony 触发 404,我尝试在应用程序中包含遗留的前端控制器。效果很好。 但是,如果我现在使用该应用程序,我会发现它的旧路由系统和 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_= [L,QSA]
_shop_参数用于路由等,旧应用的Router依赖于它。 知道我怎么能把它放在一起吗?
如果你想在 .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_= [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_= [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ app.php [QSA,L]
如果您想要更高级的东西,您必须在应用程序级别(即在 index.php 或 app.php 内)而不是在 .htaccess
中解决它