0

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

我的问题是,虽然单独使用 SabreDAV 很容易让 WebDAV 服务器运行,但当我使用 Symfony 时它就不能很好地工作。

如果没有 Symfony,它可以归结为:

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

$server->exec();

我可以使用 cadaver 访问我的目录。

更多信息: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;
4

1 回答 1

1
$server->exec();

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

如果你想将 SabreDAV 嵌入到 symfony 中,解决这个问题的最合适的方法是对 and 进行子类Sabre\HTTP\RequestSabre\HTTP\Response,并在调用之前在服务器中设置它们(设置->httpRequestand->httpResponse属性)->exec

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

我对 symfony 的了解还不够,无法告诉您它们是否清晰且容易地映射,我想在实践中尝试围绕 symfony 的系统工作会更简单(尽管从架构的角度来看,这不是最合适的) .

于 2013-02-08T02:01:13.397 回答