使用和不使用Symfony的响应系统的不同行为

时间:2013-02-07 17:57:12

标签: php symfony symfony-2.1 webdav

我希望能够在Symfony中管理WebDAV目录(甚至重新实现文件的读写方式)。为此,我找到了SabreDAV,它本身就是一个需要所有基本类的框架。

我的问题是,虽然单独使用SabreDAV运行WebDAV服务器非常容易,但在使用Symfony时效果不佳。

没有Symfony,它归结为:

  

$ server = new DAV \ Server($ rootDirectory);

     

$服务器 - > EXEC();

我可以使用尸体访问我的目录。

更多信息:http://code.google.com/p/sabredav/wiki/GettingStarted

我尝试使用Symfony在我的控制器中执行相同的操作:

  

返回新的响应($ server-> exec());

但由于某种原因,尸体无法访问该文件夹。 我想我对Symfony的响应方式缺失了一些东西,但是什么呢? SabreDAV使用自己的http请求和响应系统,但如果(正如我所说)Symfony不会混淆超级全局变量,例如$ _SERVER,这应该不是问题。

关于Symfony中的请求和响应:http://symfony.com/doc/current/book/http_fundamentals.html#requests-and-responses-in-symfony

这就是我所做的;它有点慢,必须有一个更好的方法,但我会暂时做到这一点: Controller.php:

$path=(__DIR__.'/../../../../web/public/');
$path=realpath($path);
$publicDir= new \MyClasses\FS\MyDirectory($path);
$server = new \Sabre\DAV\Server($publicDir);
$server->setBaseUri('/Symfony/web/app_dev.php/');


{
  $SyRequest = Request::createFromGlobals();
  $_server=$SyRequest->server->all();
  $_post=$SyRequest->request->all();
}


{
  $SaRequest=new \MyClasses\HTTP\Request($_server,$_post); 
  $resourceStream=false;
  $SaRequest->setBody($SyRequest->getContent($resourceStream),$resourceStream);
}


{
  $server->httpRequest=$SaRequest;
  $SaResponse=new \MyClasses\HTTP\Response();
  $server->httpResponse=$SaResponse;
  $server->exec();
}


{
  $content=ob_get_clean();
}


{
  $SyResponse=new Response($content,http_response_code(),headers_list());
}

return $SyResponse;

1 个答案:

答案 0 :(得分:1)

$server->exec();

没有真正归还任何东西。它尝试自己设置标头,并将输出流式传输到php://output(事实上,使用内置的请求/响应系统)。

如果您想将SabreDAV嵌入到symfony中,解决此问题的最恰当方法是将Sabre\HTTP\RequestSabre\HTTP\Response子类化,并在服务器中设置它们(设置->httpRequest和调用->httpResponse之前的->exec属性。

您覆盖的请求/响应对象应该映射到symfony的等价物。

我不太了解symfony告诉你他们是否干净而轻松地映射,我想在实践中更容易尝试解决symfony的系统(尽管从架构的角度来看,它不会是最恰当的。)