2013-02-12 15 views
6

Ich brauche Bild der Größe neu Funktionalität implementieren (vorzugsweise mit GD2 Bibliothekserweiterung) in Zend Framework 2.Bild der Größe neu ZF2

ich keine Komponente/Helfer für das gleiche finden. Irgendwelche Referenzen?

Wenn ich einen erstellen möchte, wo sollte ich es hinzufügen. Im älteren Zend Framework gab es ein Konzept von Action Helper, was ist mit Zend Framework 2?

Bitte schlagen Sie hier die beste Lösung vor.

Antwort

17

Ich verwende derzeit Imagine zusammen mit Zend Framework 2, um dies zu behandeln.

  1. installieren Stellen Sie sich vor: php composer.phar require imagine/Imagine:0.3.*
  2. eine Service-Fabrik erstellen für den Imagine Service (in YourModule::getServiceConfig):

    return array(
        'invokables' => array(
         // defining it as invokable here, any factory will do too 
         'my_image_service' => 'Imagine\Gd\Imagine', 
        ), 
    ); 
    
  3. es in der Logik (hiermit ein kleines Beispiel mit einem 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; 
    } 
    
Diese

ist natürlich die „quick and dirty“ Art und Weise, da Sie sollten folgende (für Wiederverwendbarkeit optional aber gute Praxis) tun:

  1. wahrscheinlich behandeln Bildtransformationen in einem Service
  2. abrufen Bilder von einem Dienst
  3. einen Eingangsfilter verwenden, um Dateien zu validieren und Parameter
  4. Ausgabe-Cache (siehe http://zend-framework-community.634137.n4.nabble.com/How-to-handle-404-with-action-controller-td4659101.html schließlich)

Verwandte: Zend Framework - Returning Image/File using Controller

+0

Wäre es nicht besser, den Image-Service (einfacher injizieren von Mock zum Testen usw.) in den Controller zu injizieren, anstatt den Service Locator darin zu verwenden? –

+0

In der Tat. Dies war sicherlich die schnelle und schmutzige Version davon. Ich bin ein starker Erhalter des starken IOC (siehe http://ocramius.github.com/blog/zf2-and-symfony-service-proxies-with-doctrine-proxies/) – Ocramius

+0

@Ocramius Sehr nützliche Antwort. Danke, überprüfe die Implementierung. – Prashant

2

Verwenden Sie einen Dienst und injizieren Sie ihn zu Controllern, die diese Funktionalität benötigen.

0

Um uploaded Bild on the fly, um die Größe Sie dies tun sollten:

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

Hier ist ein Modul WebinoImageThumb in Zend Framework 2. Kasse dieses genannt. Es hat einige großartige Funktion wie -

  • Bild Größe ändern
  • Bild Ernte, Kissen, drehen, zeigen und speichern Bilder
  • erstellen Bild Reflexion
2

Für diejenigen, die nicht in der Lage sind Imagine zu integrieren richtig wie ich ..

Ich fand eine andere Lösung WebinoImageThumb here, die völlig in Ordnung mit mir arbeitete.Hier ist wenig Erklärung, wenn Sie nicht die vollständige Dokumentation lesen wollen:

Run: php composer.phar require webino/webino-image-thumb:dev-develop und fügen WebinoImageThumb als aktives Modul in config/application.config.php die weiter sieht aus wie:

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

.. unten bleibt gleich

Jetzt in Ihrer Controller-Aktion verwendet diesen durch Service Locator wie unten:

// 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())); 
    } 

Viel Glück .. !!