2012-06-04 5 views
4

Возможно, немой вопрос, я новичок в Symfony2, и я использую его для одного из моих проектов.
Я хотел бы иметь возможность использовать стороннюю библиотеку, а именно SSRSReport (API для отчетов SSRS).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() используется здесь, являются 2 из многих классов, содержащихся в API.

ответ

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, которая делает это, или даже зарегистрировать ее как услугу.

+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) или завод, который возвращает его.