Ergebnis 1 bis 10 von 10

Thema: Vorhandensein einer Grafik über die UUID prüfen

  1. #1
    Contao-Nutzer
    Registriert seit
    01.04.2023.
    Beiträge
    61

    Standard Vorhandensein einer Grafik über die UUID prüfen

    Hallo liebes Forum, ich brauche Hilfe bei der Einbindung eines Bildes über die UUID.
    Ich binde in meinem Controller über den FigureBuilder ein Bild ein. Das funktioniert auch.

    PHP-Code:
            if($model->singleSRC){

                
    $figureBuilder = \System::getContainer()
                       ->
    get(\Contao\CoreBundle\Image\Studio\Studio::class)
                       ->
    createFigureBuilder();

                
    $imageUuid = \StringUtil::binToUuid($model->singleSRC);

                
    $figureBuilder
                    
    ->fromUuid($imageUuid)
                    ->
    setSize($model->size);

                
    $figure $figureBuilder->build();

                
    $figure->applyLegacyTemplateData($template);

            } 
    Wenn dieses Bild jetzt jedoch über die Dateiverwaltung gelöscht wird (aus welchem Grund auch immer), wird verständlicherweise eine Fehlermeldung generiert (Es ist ein Fehler aufgetreten...):

    Im Log steht folgendes:
    Code:
    Uncaught PHP Exception Contao\CoreBundle\Exception\InvalidResourceException: "DBAFS item with UUID "d6166254-e8f2-11ed-b87e-95a26d3ce6ca" could not be found." at ...
    Die UUID wird weiterhin übergeben, weshalb ich nicht auf das Existieren der UUID prüfen kann.
    Aber das Bild selbst existiert ja nicht mehr.

    Wie prüfe ich am besten, ob das Bild überhaupt existiert und verhindere, dass die Seite die Fehlermeldung ausgibt.
    Im besten Fall wird einfach das Bild nicht angezeigt.

  2. #2
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.114
    Partner-ID
    10107

    Standard

    PHP-Code:
    $figure $this->imageStudio->createFigureBuilder()
        ->
    from($model->singleSRC)
        ->
    setSize($model->size)
        ->
    buildIfResourceExists()
    ;

    if (
    $figure) {
        
    $figure->applyLegacyTemplateData($template);

    » sponsor me via GitHub or PayPal or Revolut

  3. #3
    Contao-Nutzer
    Registriert seit
    01.04.2023.
    Beiträge
    61

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    PHP-Code:
    $figure $this->imageStudio->createFigureBuilder()
        ->
    from($model->singleSRC)
        ->
    setSize($model->size)
        ->
    buildIfResourceExists()
    ;

    if (
    $figure) {
        
    $figure->applyLegacyTemplateData($template);

    Hallo Spooky, danke für die schnelle Antwort.
    Muss ich nicht über die UUID gehen?
    PHP-Code:
    $imageUuid = \StringUtil::binToUuid($model->singleSRC
    Kann mein Code mit deinem einfach ersetzt werden?
    Hier wirft dann allerdings

    PHP-Code:
    $figure $this->imageStudio->createFigureBuilder() 
    einen Fehler
    Code:
    Call to a member function createFigureBuilder() on null
    use Contao\CoreBundle\Image\Studio; hatte ich oben eingebunden.

  4. #4
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.114
    Partner-ID
    10107

    Standard

    $model->singleSRC ist bereits die UUID.
    » sponsor me via GitHub or PayPal or Revolut

  5. #5
    Contao-Nutzer
    Registriert seit
    01.04.2023.
    Beiträge
    61

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    $model->singleSRC ist bereits die UUID.
    Ok. Danke für den Hinweis

    Ich habe jetzt einfach den ursprünglichen Code etwas nach deiner Vorlage erweitert.

    $figureBuilder in die Variable $figure gepackt.
    UUID durch ->from($model->singleSRC) ersetzt, ->buildIfResourceExists hinzugefügt und unten auf Gültigkeit von $figure geprüft.

    PHP-Code:
                $figureBuilder = \System::getContainer()
                       ->
    get(\Contao\CoreBundle\Image\Studio\Studio::class)
                       ->
    createFigureBuilder();

                
    $figure $figureBuilder
                    
    ->from($model->singleSRC)
                    ->
    setSize($model->size)
                   ->
    buildIfResourceExists();
                
                if (
    $figure) {
                    
    $figure $figureBuilder->build();
                    
    $figure->applyLegacyTemplateData($template);
                } 
    So funktioniert es!

    Danke dir!

  6. #6
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.114
    Partner-ID
    10107

    Standard

    Statt \System::getContainer() solltest du Dependency Injection verwenden.
    » sponsor me via GitHub or PayPal or Revolut

  7. #7
    Contao-Nutzer
    Registriert seit
    01.04.2023.
    Beiträge
    61

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Statt \System::getContainer() solltest du Dependency Injection verwenden.
    Hallo Spooky, jetzt wollte ich es noch auf die Dependency Injection hin anpassen.
    Wenn ich mir die Doku ansehe, dann müsste es per Dependency Injection so eingebunden werden:

    PHP-Code:
    $figureBuilder $this->studio->createFigureBuilder(); 
    Auf diese Weise ist jedoch "$this->studio" eine undefined property.
    Fehler im Log:
    Code:
    Call to a member function createFigureBuilder() on null
    Das use statement habe ich drin.
    Code:
    use Contao\CoreBundle\Image\Studio;
    Was fehlt bei mir?

  8. #8
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.114
    Partner-ID
    10107

    Standard

    Das use Statement alleine reicht natürlich nicht - das expandiert dir ja nur den FQCN von einem Klassennamen. Für Dependency Injection muss:

    • Deine Klasse als Service registriert sein.
    • Über die Service Konfiguration injectest du dir das Image Studio.
    • Im Konstruktor kannst du dann auf die Services, die du dir injected hast, zugreifen.


    Für die App brauchst du unter PHP 8.1+ nur folgendes machen, weil der Rest bereits automatisch konfiguriert ist:
    PHP-Code:
    namespace App;

    use 
    Contao\CoreBundle\Image\Studio\Studio;

    class 
    MyService
    {
        public function 
    __construct(private readonly Studio $studio)
        {
        }
        
        public function 
    __invoke(): void
        
    {
            
    // $this->studio->…;
        
    }

    » sponsor me via GitHub or PayPal or Revolut

  9. #9
    Contao-Nutzer
    Registriert seit
    01.04.2023.
    Beiträge
    61

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Das use Statement alleine reicht natürlich nicht - das expandiert dir ja nur den FQCN von einem Klassennamen. Für Dependency Injection muss:

    • Deine Klasse als Service registriert sein.
    • Über die Service Konfiguration injectest du dir das Image Studio.
    • Im Konstruktor kannst du dann auf die Services, die du dir injected hast, zugreifen.


    Für die App brauchst du unter PHP 8.1+ nur folgendes machen, weil der Rest bereits automatisch konfiguriert ist:
    PHP-Code:
    namespace App;

    use 
    Contao\CoreBundle\Image\Studio\Studio;

    class 
    MyService
    {
        public function 
    __construct(private readonly Studio $studio)
        {
        }
        
        public function 
    __invoke(): void
        
    {
            
    // $this->studio->…;
        
    }

    Super, danke dir!

    Ich muss das Projekt dann erst einmal auf PHP 8.1 heben und testen.
    Dann versuche ich es mal nach deiner Anleitung.

    Danke noch mal für die Hilfe!

  10. #10
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.114
    Partner-ID
    10107

    Standard

    Unter PHP 7 wäre es so:
    PHP-Code:
    namespace App;

    use 
    Contao\CoreBundle\Image\Studio\Studio;

    class 
    MyService
    {
        private 
    Studio $studio;

        public function 
    __construct(Studio $studio)
        {
            
    $this->studio $studio;
        }
        
        public function 
    __invoke(): void
        
    {
            
    // $this->studio->…;
        
    }

    Siehe https://wiki.php.net/rfc/constructor_promotion bzw. https://www.php.net/manual/en/langua...ctor.promotion
    » sponsor me via GitHub or PayPal or Revolut

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •