2012-04-04 87 views
6

我想知道什么是最好的方式包括第三方php文件在symfony2。我正在使用不同的php-ajax包来上传我的symfony2应用程序中的文件。该软件包提供了一些我需要在我的symfony控制器中使用的php oops代码。我正在我的控制器中创建该代码的对象。所以我想知道我可以放置第三方代码或文件的位置,以及如何在symfony2控制器中包含或创建该代码的对象。我们是否也在symfony2中使用require或include?如果这是唯一的方法。最好的方法包括第三方文件与Symfony2

回答

7

我不太确定尝试将名称空间添加到第三方库。例如,Twig不使用名称空间。而且真的没有必要。考虑一个例子,你想使用Zend_Framework 1库中的PDF组件。

在您的应用程序/ autoload.php文件,你会做这样的事情:

$loader->registerPrefixes(array(
    'Twig_Extensions_' => $ws . 'Symfony/vendor/twig-extensions/lib', 
    'Twig_'   => $ws . 'Symfony/vendor/twig/lib', 
    'Zend_'   => $ws . 'ZendFramework-1.0.0/library', 
)); 

// And since Zend internally uses require/include we need to set an include path 
ini_set('include_path','.' . 

    PATH_SEPARATOR . $ws . 'ZendFramework-1.0.0/library' 

); 

在这一点上,我们应该能够创建控制器内部的第三部分对象,而让自动加载系统以寻求照顾,包括类:

$page = new \Zend_Pdf_Page(\Zend_Pdf_Page::SIZE_A4); 
    $doc->pages[] = $page; 

    $font1 = \Zend_Pdf_Font::fontWithName(\Zend_Pdf_Font::FONT_HELVETICA); 
    $font2 = \Zend_Pdf_Font::fontWithName(\Zend_Pdf_Font::FONT_COURIER_BOLD); 

你必须使用\来解决缺乏命名空间的。

这个答案确实假设你的第三部分库遵循或多或少的标准类命名约定。如果它有自己的自动加载功能,那么也可以从autolaod.php中调用它。如果您不想使用自动加载,那么只需设置包含路径并将其包含在内。

+1

这是正确的方法。如果一个库没有遵循任何命名约定,我会建议开始使用composer([repo](https://github.com/composer/composer),[symfony](https://github.com/symfony/symfony) -标准))。它允许映射任何库,使自动加载成为可能,即使这些库不遵循约定。 – gilden 2012-04-05 07:47:41

3

The documentation详细解释目录结构。

基本上,您可以将它们放在任何地方,但为了保持一致性并遵循最佳做法,您应该将第三方库放在vendor/目录中。

比你可以包含与命名空间相关的文件。

+1

很好的答案!我曾经有过这种情况,并且完全像这样解决了它... – 2012-04-04 09:18:05

+0

@Hakan Deryal。谢谢你的回应,你能告诉我,如果我在供应商创建一个文件夹作为第三方,并将我的第三方文件放置在那里,供应商/第三方/ myfile.php我怎么能包括它在我的Acme捆绑。 – ScoRpion 2012-04-04 09:56:14

+0

第三方应用程序是否使用名称空间?你可以通过在文件顶部寻找一行,如'namespace ....'来检查它。 – 2012-04-04 10:44:35