By looking these piece of documentation:
I have made this Library:
<?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);
}
}
?>
The library above is located in src/AppBundle/ImageBundle/DependencyInjection/Image.php. And I want to be able to load it either in an Entity (on a Doctrine hook) or in a Controller. But I have no idea how to do it.
You are making too complicated stuff.
First, you cannot have a bundle inside a bundle (you said src/AppBundle/ImageBundle
).
Then, your Library doesn't need to extend ConfigurableExtension
.
So, after create a clean standalone bundle (php app/console generate:bundle
),
create a Util
directory into, move the class into and change it like :
namespace ImageBundle\Util;
class Image
{
// Methods
}
Then, you can declare it as a service :
# app/config/services.yml
acme_image:
class: ImageBundle\Util\Image
In a controller, use it like this :
$image = $this->get('acme_image');
In an entity (can't access the service container), just create a new instance of your class :
$image = new ImageBundle\Util\Image();
Note that Symfony is primarily a PHP framework.
Of course, there is very cool features and some complicated things at the first try, but it stays PHP.
EDIT
To use the arguments
injected from the class of your service, just retrieve and define them in your constructor.
For example, inject the doctrine EntityManager
:
# app/config/services.yml
acme_image:
class: ImageBundle\Util\Image
arguments: [ "@doctrine.orm.entity_manager" ]
Then, retrieve it from your class:
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(...);
// ...
}
}
Collected from the Internet
Please contact [email protected] to delete if infringement.
Comments