Bonjour,
dans une application symfony j'ai intallé HTML2PDF 5.2 pour editer des factures.
J'ai installé un service HTML2PDF comme suit:

<?php
​
namespace App\Service;
​
class HTML2PDF
{
    public $pdf;
​
    /**
     * @param null $orientation
     * @param null $format
     * @param null $lang
     * @param null $unicode
     * @param null $encoding
     * @param null $margin
     */
    public function create(
        $orientation = null,
        $format = null,
        $lang = null,
        $unicode = null,
        $encoding = null,
        $margin = null
    ): void {
        $this->pdf = new \HTML2PDF(
            $orientation ? $orientation : $this->orientation,
            $format      ? $format      : $this->format,
            $lang        ? $lang        : $this->LANG,
            $unicode     ? $unicode     : $this->unicode,
            $encoding    ? $encoding    : $this->encoding,
            $margin      ? $margin      : $this->margin
        );
​
        $this->pdf->SetDisplayMode('fullpage');
    }
​
    /**
     * @param $template
     * @param $name
     * @return mixed
     */
    public function generatePdf($template, $name)
    {
        $this->pdf->writeHTML($template);
​
        return $this->pdf->Output($name.'.pdf');
    }
}

phpStorm me met un warning sur les methodes SetDisplayMode, SetDisplayMode et output ,Method 'SetDisplayMode' not found in \HTML2PDF less... et un warning sur new \HTML2PDF , pour Undefined class HTML2PDF.
Ce qui montre bien que la classe n'est pas chargée.
Pourtant elle est bien dans mes services:

services:
...
  App\Controller\:
        resource: '../src/Controller'
        tags: ['controller.service_arguments']
​
    # add more service definitions when explicit configuration is needed
    # please note that last definitions always *replace* previous ones
​
    App.html2pdf:
        class:    App\Service\HTML2PDF
        ...
​
L'autowiring est activé
Le petit test que j'ai mis dans un controller confime que l'on accède pas à la classe.
php bin/console debug:container 'App\Service\HTML2PDF' --show-arguments renvoie:

Information for Service "App\Service\HTML2PDF"

Option Value

Service ID App\Service\HTML2PDF
Class App\Service\HTML2PDF
Tags -
Public no
Synthetic no
Lazy no
Shared yes
Abstract no
Autowired yes
Autoconfigured yes



Quelle est la syntaxe de la configutation du service qui empeche de charger la classe HTML2PDF dans symfony?
Merci de votre aide

12 réponses


holliver
Auteur
Réponse acceptée

C'était bien cela:
contrairement à ce que raconte le tuto
https://www.supinfo.com/articles/single/3041-html2pdf-symfony
il ne faut pas créer de service; Je l'ai donc supprimé et j'appelle la classe istallée par composer en faisant:

$html2pdf = new Html2Pdf('P', 'A4', 'fr');

Et tout va bien...
désolé pour le temps perdu et merci.

Bonsoir.
Mais bien sur !
Avec aucune information sur la situation et le problème exact que tu rencontres, nous ne risquons pas de pouvoir t'aider.

holliver
Auteur

Désolé, un return intempestif...

Pour commencer, si tu veux aider l'IDE pour qu'il sache à quoi se rapporte la propriété pdf de ta classe, commente celle-ci, exemple :

/**
 * @var \HTML2PDF
 */
public $pdf;

Ensuite, je ne comprends pas l'intérêt d'utiliser des propriétés immaginaires, si elles valent toutes null, autant mettre directement null en seconde valeur de tes conditions ternaires.
Soit :

public function create(
    $orientation = null,
    $format = null,
    $lang = null,
    $unicode = null,
    $encoding = null,
    $margin = null
): void {
    $this->pdf = new \HTML2PDF(
        $orientation    ?   $orientation    :   null,
        $format         ?   $format         :   null,
        $lang           ?   $lang           :   null,
        $unicode        ?   $unicode        :   null,
        $encoding       ?   $encoding       :   null,
        $margin         ?   $margin         :   null
    );

    $this->pdf->SetDisplayMode('fullpage');
}

Peut-être que ce qui te bloque est cette ligne là : Public no.
Il te faudra donc peut-être ajouter public: true dans la configuration de ton service.

Thanks to the _defaults section in services.yaml, every service defined in this file is public: false by default.

What does this mean? When a service is public, you can access it directly from the container object, which is accessible from any controller that extends Controller

holliver
Auteur

Merci,
j'avais remarqué le "public no" et commencé des recherches pour voir comment le passer à true.
Pour la structure du fichier je l'ai pompé chez un formateur et je la laisse telle quelle pendant mes tests.
Je simplifirai tout cela quand cela marchera. Effectivement je n'aurait pas écris cela comme cela non plus...
Merci pour ton aide , je teste et je dirai si cela marche.

j'avais remarqué le "public no" et commencé des recherches pour voir comment le passer à true.

Exemple de la documentation :

# config/services.yaml
services:
    # ... same code as before

    # explicitly configure the service
    App\Service\MessageGenerator:
        public: true

_Source_

holliver
Auteur

Voilà, cela ne change rien Hélas

Information for Service "App\Service\HTML2PDF"
==============================================

 ---------------- ---------------------- 
  Option           Value                 
 ---------------- ---------------------- 
  Service ID       App\Service\HTML2PDF  
  Class            App\Service\HTML2PDF  
  Tags             -                     
  Public           yes                   
  Synthetic        no                    
  Lazy             no                    
  Shared           yes                   
  Abstract         no                    
  Autowired        yes                   
  Autoconfigured   yes                   
 ---------------- ---------------------- 

Cela fait 3 jours que je galère pour intaller un simple bundle
Je pens que dsur symfony 3 je n'aurai pas eu tout ces problèmes...
Je continue à chercher.

Cela fait 3 jours que je galère pour intaller un simple bundle

Veux-tu dire que c'est un Bundle pour HTML2PDF que tu as récupéré et non créé ?
Car si c'est le cas, j'ai regardé sur Packagist et les seuls que j'ai trouvé sont spécifiques pour Symfony 2, donc non fonctionnels pour Symfony 4.

holliver
Auteur

J' ai installé:
[https://www.html2pdf.fr/download]()
et je me suis inspiré de cet article:
[https://www.supinfo.com/articles/single/3041-html2pdf-symfony
D'après ce que j'ai compris cela devrait etre bon....

Si tu as installé la librairie spipu/html2pdf, tu la charges mal, car ce n'est pas new \HTML2PDF mais new \Spipu\Html2Pdf\Html2Pdf.

Il y a celui-ci qui fonctionne très bien et est hyper simple à implémenter : https://github.com/KnpLabs/KnpSnappyBundle

holliver
Auteur

Bonjour
Quand je met

$this->pdf = new \spipu\html2pdf\Html2Pdf(

mon editeur me propose d'importer la Classe et si je lui répond oui il me dit qu'elle existe déja.
Or effectivement lorsque je vais dans Vendor/Composer/autoload_psr4.php je trouve une ligne:

'Spipu\\Html2Pdf\\' => array($vendorDir . '/spipu/html2pdf/src'),

qui bien que je n'y connaisse pas grand chose , m'a l'air de charger la classe html2pdf, ce qui expliquerai le conflit.
Comment se sortir de là?