2016-03-14 36 views
3

通过看这些片的文档/:如何使用我的自定义Symfony的3.0库包/ HowIsCalled

我有此库:

<?php 
namespace Acme\HelloBundle\DependencyInjection; 

use Symfony\Component\DependencyInjection\ContainerBuilder; 
use Symfony\Component\HttpKernel\DependencyInjection\ConfigurableExtension; 

class Image extends ConfigurableExtension 
{ 
    /*The size of the thumbnail*/ 
    private $thumb_max_width=100; 
    private $thumb_max_height=100; 
    /*End of: "The size of the thumbnail"*/ 

    private $image_width=0; 
    private $image_height=0; 

    /** 
    *Contains the Image Data 
    */ 
    private $image=null; 

    protected function setThumbHeight($value) 
    { 
     $thumb_max_height=$value>0?$value:0; 
    } 

    protected function setThumbWidth($value) 
    { 
     $thumb_max_width=$value>0?$value:0; 
    } 

    /** 
    *Function that Loads the configuration 
    */ 
    protected function loadInternal(array $mergedConfig, ContainerBuilder $container) 
    { 
     var_dump($mergedConfig); 
    } 

    /** 
    *Loads a $file from $extention 
    *@param $file {String} The path of file 
    *@param $extention {String} the type or the extention of the image 
    * 
    *@return This Object Instance 
    */ 
    public function load($file) 
    { 

     $extention= exif_imagetype($file); 

     switch($extention) 
     { 
     case IMAGETYPE_PNG: 
      $this->image=imagecreatefrompng($file); 
      break; 

     case IMAGETYPE_JPEG: 
      $this->image=imagecreatefromjpeg($file); 
      break; 

     case IMAGETYPE_GIF: 
      $this->image=imagecreatefromgif($file); 
      break; 
     } 

     $this->image_width=imagesx($this->image); 
     $this->image_height=imagesy($this->image); 
     return $this; 
    } 

    /** 
    * Resizes an Image 
    * @param $width {Int} The new images width 
    * @param $height {Int} The new Images Height 
    * 
    * @return The Object Instance 
    */ 
    public function resize($width,$height) 
    { 
     $new_image=imagecreatetruecolor($width,$height); 
     imagecopyresampled($new_image,$this->image, 0, 0, 0, 0,$width,$height); 

     /*Set the new data to the Image*/ 
     imagedestroy($this->image); 
     $this->image=$new_image; 
     /*End of: "Set the new data to the Image"*/ 

     return $this; 
    } 

    /** 
    *Generates a thumbnail of the image 
    *The thumbnail size is retrieved from configuration 
    * 
    * @return The Object Instance 
    */ 
    public function to_thumb() 
    { 
     $width=0; 
     $width=0; 

     /*Determine the resize width and height*/ 
     $source_aspect_ratio = $this->image_width/$this->image_height; 
     $thumbnail_aspect_ratio = $this->thumb_max_width/$this->thumb_max_height; 

     if ($this->image_width <= $this->thumb_max_width && $this->image_height <= $this->thumb_max_height) 
     { 
     $width = $this->image_width; 
     $height = $this->image_height; 
     } 
     elseif ($thumbnail_aspect_ratio > $source_aspect_ratio) 
     { 
     $width = (int) ($this->thumb_max_height * $source_aspect_ratio); 
     $height = $this->thumb_max_height; 
     } 
     else 
     { 
     $width = $this->thumb_max_width; 
     $height = (int) ($this->thumb_max_width/$source_aspect_ratio); 
     } 
     /*End of: "Determine the resize width and height"*/ 

     $this->resize($width,$width); 

     return $this; 
    } 

    /** 
    *Exports the image to a file 
    *@param file {String} The file path 
    */ 
    public function export($file) 
    { 
     $ext = pathinfo($file, PATHINFO_EXTENSION); 
     $ext=strtolower($ext); 

     $write=false; 

     switch($ext) 
     { 
     case 'png': 
      imagesavealpha($this->image,true); 
      $write=imagepng($this->image,$file); 
     case 'jpeg': 
     case 'jpg': 
      $write=imagejpeg($this->image,$file); 
     case 'gif': 
      $write=imagegif($this->image,$file); 
     } 
     imagedestroy($this->image); 
    } 
} 
?> 

以上书籍库位于src/AppBundle/ImageBundle/DependencyInjection/Image.php。我希望能够在实体(在Doctrine挂钩)或控制器中加载它。但我不知道该怎么做。我可以帮忙吗?

回答

3

你正在制作太复杂的东西。

首先,你不能在一个包中包含一个包(你说src/AppBundle/ImageBundle)。

然后,您的库不需要延长ConfigurableExtension
所以,之后创建一个干净的独立包(php app/console generate:bundle),
创建一个Util目录进入,将全班学生分成和改变它喜欢:

namespace ImageBundle\Util; 

class Image 
{ 
    // Methods 
} 

然后,你可以声明它作为一项服务:

# app/config/services.yml 
acme_image: 
    class: ImageBundle\Util\Image 

在控制器,使用这样的:

$image = $this->get('acme_image'); 

在一个实体(不能访问该服务容器),只需创建类的新实例:

$image = new ImageBundle\Util\Image(); 

注意,Symfony的主要是一个PHP框架。
当然,第一次尝试时有非常酷的功能和一些复杂的东西,但它仍然是PHP。

编辑

要使用从类服务的注入arguments,只是检索并在构造函数中定义它们。

例如,注入学说EntityManager

# app/config/services.yml 
acme_image: 
    class: ImageBundle\Util\Image 
    arguments: [ "@doctrine.orm.entity_manager" ] 

然后,从你的类检索:

use Doctrine\ORM\EntityManagerInterface; 
// ... 

class Image 
{ 
    private $em; 

    public function __construct(EntityManagerInterface $entityManager) 
    { 
     $this->em = $entityManager; 
    } 

    // ... 

    public function doSomething() 
    { 
     // Use the defined property 
     $repository = $this->em->getRepository(...); 

     // ... 
    } 
} 
+0

当我产生ImageBundle \的Util \图片我怎么可以访问新instanc这些设置由services.yml提供? –

+0

您可以使用'arguments'(另一个服务,一个定义的参数...)在服务中注入想要的东西,并在您的类的构造函数中检索它们。看服务:http://symfony.com/doc/current/book/service_container.html#service-parameters – chalasr

+0

我生成的捆绑包,但有一个ImageBundle.php文件和文件夹控制器,资源和测试我需要以下文件? –

相关问题