4

也许是愚蠢的问题,我是 Symfony2 的新手,我正在将它用于我的一个项目。
我希望能够使用第三方库,即SSRSReport(SSRS 报告的 API)。

我已将库放入Symfony/vendor/ssrs/lib/Ssrs/src.
这里定义了很多类,我不需要自动加载它们。

我根本不知道如何从控制器要求和调用它们。

肯定这不起作用

require_once '/vendor/ssrs/lib/Ssrs/src/SSRSReport.php';
class DefaultController extends Controller
{
    public function viewAction()
    {
        define("UID", "xxxxxxxx");
        define("PASWD", "xxxxxxxx");
        define("SERVICE_URL", "http://xxx.xxx.xxx.xxx/ReportServer/");
        $report = new SSRSReport(new Credentials(UID, PASWD), SERVICE_URL);
        return $this->render('myBundle:Default:view.html.twig'
            , array('report' => $report)
        );
    }
}

SSRSReport()在这里Credentials()使用的是 API 中包含的许多类中的 2 个。

4

2 回答 2

4

首先,我不建议将非 symfony 管理的库放入/vendors. 由于您正在管理此库,请将其放入/src.

其次,当使用不是命名空间的类时(即,在根命名空间中),请确保正确引用它们,否则 PHP 将在当前命名空间中查找(在这种情况下,它是您的控制器命名空间)

第三,快速而简单的解决方案是正确地包含来自控制器的文件:

class DefaultController extends Controller
{
    protected function includeSsrsSdk()
    {
      require_once(
          $this->container->getParameter( 'kernel.root_dir' )
        . '/../src/ssrs/lib/Ssrs/src/SSRSReport.php'
      );
    }

    public function viewAction()
    {
        $this->includeSsrsSdk();
        define("UID", "xxxxxxxx");
        define("PASWD", "xxxxxxxx");
        define("SERVICE_URL", "http://xxx.xxx.xxx.xxx/ReportServer/");
        $report = new \SSRSReport(new \Credentials(UID, PASWD), SERVICE_URL);
        return $this->render('myBundle:Default:view.html.twig'
            , array('report' => $report)
        );
    }
}

但这会锁定您将库包含到这个控制器中的逻辑。您可以为执行此操作的 SDK 创建一个单独的包装器,甚至将其注册为服务。

于 2012-06-04T17:42:32.697 回答
1

您可能正在使用带有 symfony 的作曲家,所以这是我的建议。

而不是 require_once,您应该使用 composer 的自动加载机制来自动加载非命名空间的库或函数http://getcomposer.org/doc/04-schema.md#files

所以只需更新 composer.json 中的自动加载部分。

   “自动加载”:{
        “psr-0”:{“”:“src/”},
        “文件”:[“src/SsrsReport/SSRSReport.php”]
   },

为了使用该服务,我将使用 Facade(扩展 SSRSREport 类)或返回它的 Factory。

于 2014-01-20T11:17:11.743 回答