2012-06-04 81 views
4

也許愚蠢的問題,我是Symfony2的新手,我將其用於我的一個項目。
我希望能夠使用第三方庫,即SSRSReport(SSRS報告API)。Symfony2 - 使用第三方庫(SSRS)

我已將該庫放入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

首先,我不建議將non-symfony-managed庫放入/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做一個單獨的包裝器,甚至將它註冊爲服務。

+0

非常感謝您的詳細解答 –

+0

您好@Peter Bailey,感謝您的回答,但您能否解釋如何將第三方庫定義爲更清潔的解決方案?並且即使沒有定義類但只有一些功能並且需要......,是否有可能將第三方註冊爲服務? – Reveclair

+0

我個人簡單地實例化了一個新服務的API –

1

您可能正在使用symfony作曲家,所以這是我的建議。

相反require_once的,你應該使用作曲家的自動加載機制自動加載非命名空間的庫或者功能http://getcomposer.org/doc/04-schema.md#files

所以才更新composer.json自動加載部分。

 
    "autoload": { 
     "psr-0": { "": "src/" }, 
     "files": ["src/SsrsReport/SSRSReport.php"] 
    }, 

用於消耗服務我要麼使用門面(延伸SSRSREport類)或它返回它的工廠。