Contao-Camp 2024
Ergebnis 1 bis 15 von 15

Thema: Symfony bundle Model ClassNotFoundException

  1. #1
    enabled
    Gast

    Standard Symfony bundle Model ClassNotFoundException

    Hey Leute,

    ich habe ein Symfony bundle Frontend Modul geschrieben. Dieses wird auch geladen und im FE ausgegeben. Beim laden von Datenbankeinträgen über ein Model wird mir allerdings folgender Fehler im Frontend geworfen:

    Attempted to load class "CareerCenterModel" from the global namespace.
    Did you forget a "use" statement?

    Code:
    Symfony\Component\Debug\Exception\
    ClassNotFoundException
    in vendor/contao/core-bundle/src/Resources/contao/library/Contao/Model/Collection.php (line 144)
    Collection::createFromDbResult(object(Result), 'tl_career_center')
    in vendor/contao/core-bundle/src/Resources/contao/library/Contao/Model.php (line 1299)
    Model::createCollectionFromDbResult(object(Result), 'tl_career_center')
    in vendor/contao/core-bundle/src/Resources/contao/library/Contao/Model.php (line 1124)
    Model::find(array('return' => 'Collection', 'table' => 'tl_career_center', 'limit' => 0, 'offset' => 0))
    in vendor/contao/core-bundle/src/Resources/contao/library/Contao/Model.php (line 990)
    Model::findAll()
    in _external/meinvendor/careercenter-bundle/src/Resources/contao/modules/ModuleJoblist.php (line 78)
     $contaoFramework = static::getContainer()->get('contao.framework');
     $contaoFramework->initialize();
     $objFaq = \FaqModel::findAll();
     $objCareerCenter = CareerCenterModel::findAll();
     var_dump("test ". date("H:i"));
     $this->Template->articles = array();
    }
    Ich benutze einen eigenen Namespace und lade mit "use MeinVendor\MeinBundle\CareerCenterModel" die Klasse, dachte ich.
    composer dump-autoload und composer install bringen keine Veränderung.
    \FaqModel::findAll() funktioniert tadellos.
    Für mich sieht es eher so aus, als würde die Collection.php in Zeile 144 nicht mit dem Namespace klarkommen.

    ModuleJoblist.php
    Code:
    namespace MeinVendor\Careercenter;
    
    use Psr\Log\LogLevel;
    use Contao\Contao;
    use MeinVendor\Careercenter\CareerCenterModel;
    use Contao\Model;
    use Contao\Model\Collection;
    
    ...
    
        protected function compile()
        {
            $logger = static::getContainer()->get('monolog.logger.contao');
            // $logger->log(LogLevel::ERROR, "test log", array('contao' => new ContaoContext('JobList', TL_ERROR)));
    
            $contaoFramework = static::getContainer()->get('contao.framework');
            $contaoFramework->initialize();
    
            $objFaq = \FaqModel::findAll();
            $objCareerCenter = CareerCenterModel::findAll();
    
            var_dump("test ". date("H:i"));
    
            $this->Template->articles = array();
        }
    Hat jemand einen guten Rat?

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

    Standard

    Du musst dein Model in der config.php registrieren:
    PHP-Code:
    $GLOBALS['TL_MODELS']['tl_your_table'] = 'MeinVendor\Careercenter\CareerCenterModel'

  3. #3
    enabled
    Gast

    Standard

    Godlike! Funktioniert.

  4. #4
    Contao-Nutzer
    Registriert seit
    17.03.2013.
    Beiträge
    6

    Standard

    Hallo zusammen

    Ich stehe momentan vor demselben Problem. Nur bringt mir das registrieren des Models nichts. Habe dies jetzt auf drei verschiedene Varianten, die ich alle mit googlen oder in den docs gefunden habe, versucht.

    Variante 1
    PHP-Code:
    use VendorName\App\Models\TmTeamsModel;
    $GLOBALS['TL_MODELS']['tl_tm_teams'] = TmTeamsModel::class; 
    Quelle: https://docs.contao.org/dev/framewor...customization/)

    Variante 2
    PHP-Code:
    $GLOBALS['TL_MODELS']['tl_tm_teams'] = 'VendorName\App\Models\TmTeams'
    Quelle: https://docs.contao.org/books/cookbook/de/Models.html

    Variante 3
    PHP-Code:
    $GLOBALS['TL_MODELS']['tl_tm_teams'] = "VendorName\App\Models\TmTeamsModel"
    Das Model TmTeamsModel hat den Namesapce VendorName\App\Models und in der tl_tm_teams.php habe ich das Model via
    use VendorName\App\Models\TmTeamsModel; eingebunden.

    Hat mir jemand eine Idee was ich noch falsch mache?
    Geändert von Dinouso (04.08.2020 um 21:07 Uhr)

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

    Standard

    Ist das für eine Extension oder nur eine Applikation?

  6. #6
    Contao-Nutzer
    Registriert seit
    17.03.2013.
    Beiträge
    6

    Standard

    Ist für eine Extension.

    Habe die DCA soweit das ich nun mit der Klasse die Daten bearbeiten möchte.

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

    Standard

    Dann zeige mal den Code der Extension. Insbesondere:

    • composer.json
    • Model Class (+ Pfad)
    • src/Resources/contao/config/config.php

  8. #8
    Contao-Nutzer
    Registriert seit
    17.03.2013.
    Beiträge
    6

    Standard

    Erstmal danke, dass du dir die Zeit nimmst, um mein Problem anzuschauen.

    Zur Info: Erstellt habe ich das ganze anhand des Skeleton Bundle: https://github.com/contao/skeleton-bundle

    PHP-Code:
    // /src/Resources/contao/models/TmTeamsModel.php

    namespace VendorName\App\Models;

    use 
    Contao\Model;

    class 
    TmTeamsModel extends \Model
    {
        
    /**
         * Table name
         * @var string
         */
        
    protected static $strTable 'tl_tm_teams';

    PHP-Code:
    // /src/Resources/contao/config/config.php

    use VendorName\App\Models\TmTeamsModel;

    # Models
    $GLOBALS['TL_MODELS']['tl_tm_teams'] = TmTeamsModel::class;
    #$GLOBALS['TL_MODELS']['tl_tm_teams'] = 'VendorName\App\Models\TmTeams';
    #$GLOBALS['TL_MODELS']['tl_tm_teams'] = "VendorName\App\Models\TmTeamsModel";

    array_insert($GLOBALS['BE_MOD'],1, array
    (
        
    'teamManager' => array 
        (
            
    'tm_teams' => array 
            (
                
    'tables' => ['tl_tm_teams']
            ),
            
    'tm_players' => array 
            (
                
    'tables' => ['tl_tm_players']
            ),
            
    'tm_leagues' => array 
            (
                
    'tables' => ['tl_tm_leagues']
            ),
            
    'tm_games' => array 
            (
                
    'tables' => ['tl_tm_games']
            )
        )
    )); 
    Code:
    {
        "name": "vendorname/app",
        "type": "contao-bundle",
        "description": "",
        "homepage": "",
        "license": "LGPL-3.0-or-later",
        "authors": [
            {
                "name": "",
                "homepage": ""
            }
        ],
        "require": {
            "php": "^5.6 || ^7.0",
            "contao/core-bundle": "4.4.*",
            "symfony/framework-bundle": "^3.3"
        },
        "conflict": {
            "contao/core": "*",
            "contao/manager-plugin": "<2.0 || >=3.0"
        },
        "require-dev": {
            "contao/manager-plugin": "^2.0",
            "doctrine/doctrine-cache-bundle": "^1.3",
            "friendsofphp/php-cs-fixer": "^2.12",
            "php-http/guzzle6-adapter": "^1.1",
            "php-http/message-factory": "^1.0.2",
            "phpunit/phpunit": "^5.7.26",
            "symfony/phpunit-bridge": "^3.2"        
        },
        "config": {
            "preferred-install": {
                "vendorname/*": "source",
                "*": "dist"
            }
        },
        "extra": {
            "contao-manager-plugin": "VendorName\\App\\ContaoManager\\Plugin"
        },
        "autoload": {
            "psr-4": {
                "VendorName\\App\\": "src/"
            }
        },
        "autoload-dev": {
            "psr-4": {
                "VendorName\\App\\Tests\\": "tests/"
            }
        },
        "support": {
            "issues": "",
            "source": ""
        }
    }
    PHP-Code:
    // /src/Resources/contao/dca/tl_tm_teams.php

    use VendorName\App\Models\TmTeamsModel;

    $GLOBALS['TL_DCA']['tl_tm_teams'] = array
    (
        
    // Config
        
    'config' => array
        (     
            
    'dataContainer'             => 'Table',
            
    'enableVersioning'          => true,
            
    'sql' => array
            (
                
    'keys' => array
                (
                    
    'id' => 'primary'
                
    )
            )
        ),

           
    // List
        
    'list' => array
        (
            
    'sorting' => array
            (
                
    'mode'                    => 1,
                
    'fields'                  => ['teamname'],
                
    'flag'                    => 1,
                
    'panelLayout'             => 'filter;sort,search,limit'
            
    ),
            
    'label' => array
            (
                
    'fields'                  => ['teamname'],
                
    // 'format'                  => '%s',
                
    'showColumns'             => true
            
    ),
            
    'global_operations' => array
            (

            ),
            
    'operations' => array
            (
                
    'edit' => array
                (
                    
    'label'               => &$GLOBALS['TL_LANG']['tl_tm_teams']['edit'],
                    
    'href'                => 'act=edit',
                    
    'icon'                => 'edit.svg'
                
    ),
                
    'copy' => array
                (
                    
    'label'               => &$GLOBALS['TL_LANG']['tl_tm_teams']['copy'],
                    
    'href'                => 'act=copy',
                    
    'icon'                => 'copy.svg'
                
    ),
                
    'delete' => array
                (
                    
    'label'               => &$GLOBALS['TL_LANG']['tl_tm_teams']['delete'],
                    
    'href'                => 'act=delete',
                    
    'icon'                => 'delete.svg',
                    
    'attributes'          => 'onclick="if(!confirm(\'' $GLOBALS['TL_LANG']['MSC']['deleteConfirm'] . '\'))return false;Backend.getScrollOffset()"'
                
    ),
                
    'toggle' => array
                (
                    
    'label'               => &$GLOBALS['TL_LANG']['tl_tm_teams']['toggle'],
                    
    'icon'                => 'visible.svg',
                    
    'attributes'          => 'onclick="Backend.getScrollOffset();return AjaxRequest.toggleVisibility(this,%s)"'
                
    ),
                
    'show' => array
                (
                    
    'label'               => &$GLOBALS['TL_LANG']['tl_tm_teams']['show'],
                    
    'href'                => 'act=show',
                    
    'icon'                => 'show.svg'
                
    )
            )
        ),
        
        
    // Palettes
        
    'palettes' => array
        (
            
    'default'                     => '{name_legend},teamname,teams'
        
    ),

        
    // Fields
        
    'fields' => array
        (
            
    'id' => array
            (
                
    'sql'                     => "int(10) unsigned NOT NULL auto_increment"
            
    ),
            
    'tstamp' => array
            (
                
    'sql'                     => "int(10) unsigned NOT NULL default '0'"
            
    ),
            
    'teamname' => array
            (
                
    'label'                   => &$GLOBALS['TL_LANG']['tl_tm_teams']['teamname'],
                
    'search'                  => true,
                
    'sorting'                 => true,
                
    'flag'                    => 1,
                
    'inputType'               => 'text',
                
    'eval'                    => array('mandatory'=>true'maxlength'=>255'tl_class'=>'long'),
                
    'sql'                     => "varchar(255) NOT NULL default ''"
            
    ),
            
    'members_count' => array
            (
                
    'label'                   => &$GLOBALS['TL_LANG']['tl_tm_teams']['members_count'],
                
    'exclude'                 => true,
                
    'sorting'                 => false,
                
    'inputType'               => 'text',
                
    'eval'                    => ['maxlength'=>10'rgxp'=>'digit'],
                
    'sql'                     => "int(10) unsigned NOT NULL default '0'"
            
    ),
            
    'teams' => array
            (
                
    'label'                   => &$GLOBALS['TL_LANG']['tl_tm_teams']['teams'],
                
    'search'                  => true,
                
    'inputType'               => 'checkbox',
                
    'options_callback'        => array('tl_tm_teams''getAllTeams'),
                
    'eval'                    => array('maxlength'=>255'multiple'=>true'tl_class'=>'w50'),
                
    'sql'                     => "blob NULL"
            
    )
            
        )
    );  

    /**
     * Provide miscellaneous methods that are used by the data configuration array.
     *
     * @property 
     * 
     * @author
     */
    class tl_tm_teams extends Backend
    {
        
    /**
         * Return the IDs of the teams as array
         *
         * @return array
         */
        
    public function getAllTeams()
        {
            
    $objTeams TmTeamsModel::findAll();
        
            
    $return = array();

            if (
    $objTeams !== null)
            {
                while (
    $objTeams->next())
                {
                    
    $return[$objTeams->id] = $objTeams->teamname;
                }
            }

            return 
    $return;
        }



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

    Standard

    In deiner composer.json hast du folgendes definiert:
    Code:
        "autoload": {
            "psr-4": {
                "VendorName\\App\\": "src/"
            }
        },
    Dein Model sieht so aus
    PHP-Code:
    namespace VendorName\App\Models;

    use 
    Contao\Model;

    class 
    TmTeamsModel extends \Model
    {
        
    /**
         * Table name
         * @var string
         */
        
    protected static $strTable 'tl_tm_teams';

    Der Dateipfad der Model Class ist aber
    Code:
    src/Resources/contao/models/TmTeamsModel.php

    Wenn der FQCN deiner Model Klasse VendorName\App\Models\TmTeamsModel lautet und die PSR-4 Autoload Definition Den Root Namespace VendorName\App\ in den Ordner src/ mapped, dann muss der Pfad für die Datei dieser Klasse so aussehen:
    Code:
    src/Models/TmTeamsModel.php

  10. #10
    Contao-Nutzer
    Registriert seit
    17.03.2013.
    Beiträge
    6

    Standard

    Besten Dank für die rasche Antwort. Genau das wars.

    Wenn mann lesen könnte In der Anleitung https://docs.contao.org/dev/framewor...customization/ ist der Pfad genau so beschrieben:
    PHP-Code:
    // src/Model/ExampleModel.php
    namespace App\Model

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

    Standard

    Prinzipiell kannst du den FQCN - und damit den Pfad, bzw. den Pfad - und damit den FQCN komplett selbst definieren. Es muss nur mit dem übereinstimmen was du für das Autoloading definiert hast, ansonsten findet PHP die Klasse natürlich nicht

  12. #12
    Contao-Nutzer
    Registriert seit
    17.03.2013.
    Beiträge
    6

    Standard

    Danke für den Tipp.
    Mit der composer.json bzw. mit dem ganzen was Composer für einen erledigt finde ich mich noch nicht so zurecht. Daher bin ich auch nicht darauf gekommen dass es daran liegen könnte .

    Kannst du mir noch sagen wie ich aus einer Klasse z.B. tl_tm_players auf die Funktionen einer andern Klasse z.B. tl_tm_teams zugreiffen kann?
    Wenn ich z.B. in einem Feld in tl_tm_players die 'options_callback' => array('tl_tm_teams', 'getAllTeams') definiere erhalte ich den Fehler: Warning: in_array() expects parameter 2 to be array, null given.
    In der eigenen Klasse funktioniert das aber ohne Probleme.

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

  14. #14
    Contao-Nutzer
    Registriert seit
    17.03.2013.
    Beiträge
    6

    Standard

    Verstehe ich dich richtig: Ich muss den Callback registireren weill er eine andere Klasse aufruft?
    In der eigenen Klasse ist der ja bereits vorhanden und funktioniert.

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

    Standard

    Ich weiß nicht was du mit "in der eigenen Klasse" meinst. Vielleicht beziehst du dich auf die "alte Art", wo Contao tlw. noch Klassen direkt in einer DCA Datei definiert hat. Das ist aber nicht mehr der aktuelle Stand. Best practise wie man einen Callback registriert ist in der Dokumentation beschrieben.

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
  •