Symfony - 如果Symfonfy应用程序无法处理请求,则回退到另一个应用程序

时间:2016-07-06 16:18:17

标签: yii symfony

我们有一个旧的Yii应用程序以及新的Symfony应用程序。

基本思路很简单 - 我需要检查Symfony应用程序中是否存在路由匹配,然后它很酷,如果没有,那么引导Yii应用程序并尝试用它来处理请求。

在我确定存在路由匹配之前,没有实例化AppKernel(并且不加载autoload.php - 因为每个项目有两个不同的autoload.php)的主要思路。 我能以某种方式做到吗?

2 个答案:

答案 0 :(得分:1)

我们在使用旧版应用程序之前已经完成了这项工作。

您可以采取两种方法。

  1. 将旧应用程序包装在symfony项目中(推荐)。
  2. 不幸的是,这确实会加载symfony前端控制器和内核。没办法解决这个问题。您需要确保symfony 无法处理请求,并且需要启动内核。

    1. 根据需要使用子目录和apache虚拟主机加载一个应用程序与另一个应用程序。
    2. 鉴于选项1,

      您可以创建自己的前端控制器,通过读取路径来加载symfony或yii(如果使用yml或xml,则来自静态文件,或者更复杂的注释)或者监听HttpKernelInterface ::的EventListener(RequestListener):: MASTER_REQUEST并确保可以返回路线。

      创建自己的前端控制器是唯一可以让它不加载symfony内核的方法,但它需要你写一些能理解两个框架中路由的东西(或者至少是symfony' s并适当地放弃请求。

      事件监听器示例:

      public function onkernelRequest(GetResponseEvent $event)
      {
          if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
              return;
          }
      
          ... Code to continue normally, or bootstrap yii and return a custom response... (Can include and ob_start, or make an http request, etc)
      }
      
      public function getSubscribedEvents()
      {
          return [
              KernelEvents::REQUEST => ['onKernelRequest']
          ];
      }
      

      如您所见,需要启动内核以确保symfony无法为路由提供服务。除非创建自己的前端控制器(如上所述)。

      第三种方法是创建一个回退控制器,如果在symfony中找不到路由,它将加载指定的URL。虽然这种方法通常用于缺少框架并使用页面脚本而不是正确路由的遗留项目,但肯定需要使用/帮助输出缓冲。

      EventListener方法使您有机会创建一个适当的请求以传递给yii,并使用返回的内容创建一个Response作为正确的symfony对象(也可以使用ob或其他选项)。

      谢谢。

答案 1 :(得分:1)

这是vpassapera解决方案的替代方案 - http://stovepipe.systems/post/migrating-your-project-to-symfony