我有一个非常旧的 php 应用程序,我正在尝试更新到 Symfony。
该应用程序当前具有类似于此的结构:
/www <-current web root
php_page1.php
php_page2.php
php_pagen.php
/dashboard
dashboard_page1.php
dashboard_page2.php
dashboard_pagen.php
这些页面有充满功能等的帮助文件,还有一些充满资产的文件夹,但这并不重要。因此,要访问给定页面,您需要将浏览器指向 domain.com/php_page1.php 或 domain.com/dashboard/dashboard_page1.php ......没有前端控制器。所有页面都可以直接访问。
总而言之,一次要重构的东西太多了,所以我想分批进行,一次一页。
我想要做的是在我现在拥有的之上安装 symfony,因此 symfony 结构将与当前的结构共存:
/www <-legacy
php_page1.php <-legacy
php_page2.php <-legacy
php_pagen.php <-legacy
/app <-symfony
/dashboard <-legacy
dashboard_page1.php <-legacy
dashboard_page2.php <-legacy
dashboard_pagen.php <-legacy
/src <-symfony
/web <-symfony (new web root)
.htaccess <-symfony (points to app.php)
app.php <-symfony (front controller)
我已经成功安装了 Symfony 并迁移了一个示例遗留页面(请注意移动的 web 根目录)。这很好用。
问题是,最终,如果存在遗留页面,我需要 Apache 来提供服务,如果不存在,则通过前端控制器 (app.php)。
这是我尝试过的。
我尝试了各种 .htaccess 规则来尝试让 Apache 在 /www 和 /www/dashboard 中提供文件。这些都失败了,Symfony 告诉我没有匹配的路线。
我也试过 Symfony 的$this->redirect('..\www\php_page1.php');
. 这失败了 Symfony 告诉我“看起来你试图在配置的目录之外加载模板。”
最后我尝试添加 /dashboard 作为路由:
/**
* @Route("/cvdashboard/{file}")
*/
public function cvdashboardAction($file) {
return $this->render("@dashboard/$file");
}
并添加了一条树枝路径:
twig:
...
paths:
'%%kernel.root_dir%/../dashboard':dashboard
这导致了三个例外:
FileLoaderLoadException in FileLoader.php
第 118 行:
InvalidArgumentException in YamlFileLoader.php
第 371 行:
ParseException in Inline.php
第 108 行:
问题
所以我的问题是:如何配置 Symfony / Apache 以便如果调用当前存在的 url(即 domain.com/php_page1.php),它将直接通过 Symfony 或 Apache 提供该页面,如果它不存在,有 Symfony 的前端控制器处理请求吗?
编辑
这是我目前拥有的 .htaccess:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . app_dev.php [L]
这适用于 Symfony 并路由我已定义路由的任何内容。问题是它在 /www/web(新的 web 根目录)中,这是 Symfony 想要的 web 根目录。它不会访问位于 Web 根目录之外的 /www 或 /www/dashboard 中的任何内容。
我正在尝试使用 .htaccess 来让 Apache 从 Web 根目录下一层抓取文件,或者让 Symfony 将这些页面作为通用 php 脚本提供服务。