2013-02-12 17 views
6

ho bisogno di attuare immagine ridimensionare funzionalità (preferibilmente con estensione libreria GD2) in Zend Framework 2.ridimensionare ZF2

non ho potuto trovare qualsiasi componente/helper per lo stesso. Eventuali riferimenti?

Se voglio crearne uno, dove dovrei aggiungerlo. Nel vecchio framework Zend, c'era un concetto di Action Helper, che dire di Zend framework 2?

Si prega di suggerire la soluzione migliore qui.

risposta

17

Attualmente utilizzo Imagine insieme a Zend Framework 2 per gestirlo.

  1. Installare Immaginate: php composer.phar require imagine/Imagine:0.3.*
  2. Creare una fabbrica servizio per il servizio Imagine (in YourModule::getServiceConfig):

    return array(
        'invokables' => array(
         // defining it as invokable here, any factory will do too 
         'my_image_service' => 'Imagine\Gd\Imagine', 
        ), 
    ); 
    
  3. utilizzarlo nella vostra logica (presente un piccolo esempio con un controller):

    public function imageAction() 
    { 
        $file = $this->params('file'); // @todo: apply STRICT validation! 
        $width = $this->params('width', 30); // @todo: apply validation! 
        $height = $this->params('height', 30); // @todo: apply validation! 
        $imagine = $this->getServiceLocator()->get('my_image_service'); 
        $image = $imagine->open($file); 
    
        $transformation = new \Imagine\Filter\Transformation(); 
    
        $transformation->thumbnail(new \Imagine\Image\Box($width, $height)); 
        $transformation->apply($image); 
    
        $response = $this->getResponse(); 
        $response->setContent($image->get('png')); 
        $response 
         ->getHeaders() 
         ->addHeaderLine('Content-Transfer-Encoding', 'binary') 
         ->addHeaderLine('Content-Type', 'image/png') 
         ->addHeaderLine('Content-Length', mb_strlen($imageContent)); 
    
        return $response; 
    } 
    
.515.053.691,36321 milioni

Questo è ovviamente il modo "veloce e sporco", dal momento che si dovrebbe fare seguito (pratica facoltativa ma buona per riutilizzabilità):

  1. probabilmente gestire le trasformazioni di immagine in un servizio
  2. recuperare le immagini da un servizio
  3. utilizzare un filtro di ingresso per convalidare i file e parametri
  4. uscita cache (vedi http://zend-framework-community.634137.n4.nabble.com/How-to-handle-404-with-action-controller-td4659101.html eventualmente)

correlati: Zend Framework - Returning Image/File using Controller

+0

Non sarebbe meglio iniettare il servizio di immagine (più facile iniezione di simulazione per testare ecc.) Al controller invece di usare il localizzatore di servizio al suo interno? –

+0

Infatti. Questa era sicuramente la versione veloce e sporca. Sono un forte sostenitore di un forte IOC (vedi http://ocramius.github.com/blog/zf2-and-symfony-service-proxies-with-doctrine-proxies/) – Ocramius

+0

@Ocramius Risposta molto utile. Grazie, controllerà l'implementazione. – Prashant

2

Utilizzare un servizio per questo e iniettarlo nei controller che richiedono la funzionalità.

0

Al fine di ridimensionare immagine inserita al volo che si dovrebbe fare questo:

public function imageAction() 
{ 
// ... 
$imagine = $this->getImagineService(); 
$size = new \Imagine\Image\Box(150, 150); 
$mode = \Imagine\Image\ImageInterface::THUMBNAIL_INSET; 

$image = $imagine->open($destinationPath); 
$image->thumbnail($size, $mode)->save($destinationPath); 
// ... 
} 

public function getImagineService() 
{ 
    if ($this->imagineService === null) 
    { 
     $this->imagineService = $this->getServiceLocator()->get('my_image_service'); 
    } 
    return $this->imagineService; 
} 
2

Ecco un modulo chiamato WebinoImageThumb in Zend Framework 2. Acquista questo. Ha qualche caratteristica grande come -

  • Image Resize
  • ritaglio immagine, pad, ruotare, spettacolo e salvare le immagini
  • Creare un'immagine riflessione
2

Per coloro che non sono in grado di integrarsi Imagine proprio come me ..

Ho trovato un'altra soluzione WebinoImageThumb here che ha funzionato perfettamente bene con me.Ecco piccola spiegazione se non vuoi leggere la documentazione completa:

Run: php composer.phar require webino/webino-image-thumb:dev-develop e aggiungere WebinoImageThumb modulo come attiva nel config/application.config.php che ulteriori assomiglia:

<?php 
return array(
    // This should be an array of module namespaces used in the application. 
    'modules' => array(
     'Application', 
     'WebinoImageThumb' 
    ), 

.. sotto rimane lo stesso

Ora nel vostro uso azione di controllo attraverso questo servizio di individuazione come di seguito:

// at top on your controller 
use Zend\Validator\File\Size; 
use Zend\Validator\File\ImageSize; 
use Zend\Validator\File\IsImage; 
use Zend\Http\Request 

    // in action 
$file = $request->getFiles(); 
$fileAdapter = new \Zend\File\Transfer\Adapter\Http(); 
$imageValidator = new IsImage(); 
if ($imageValidator->isValid($file['file_url']['tmp_name'])) { 
    $fileParts = explode('.', $file['file_url']['name']); 
    $filter = new \Zend\Filter\File\Rename(array(
       "target" => "file/path/to/image." . $fileParts[1], 
       "randomize" => true, 
      )); 

    try { 
     $filePath = $filter->filter($file['file_url'])['tmp_name']; 
     $thumbnailer = $this->getServiceLocator() 
         ->get('WebinoImageThumb'); 
     $thumb = $thumbnailer->create($filePath, $options = [], $plugins = []); 
     $thumb->adaptiveResize(540, 340)->save($filePath); 

     } catch (\Exception $e) { 
      return new ViewModel(array('form' => $form, 
        'file_errors' => array($e->getMessage()))); 
     } 
    } else { 
     return new ViewModel(array('form' => $form, 
       'file_errors' => $imageValidator->getMessages())); 
    } 

Buona fortuna .. !!