porno porno izle rokettube
Ergebnis 1 bis 6 von 6

Thema: Problem mit Modulreihenfolge in 'modules' und der Datenbankverbindung

  1. #1
    Neuer Benutzer
    Registriert seit
    14.09.2015
    Beiträge
    3
    Thanks
    2
    Thanked 0 Times in 0 Posts

    Frage Problem mit Modulreihenfolge in 'modules' und der Datenbankverbindung

    Hallo,

    ich habe folgendes Problem ich habe zwei (bzw. drei) Module:
    PHP-Code:
    // Filename: /config/application.config.php
        
    'modules' => array(
            
    'Application',
            
    'Album',
            
    'Blog'
        
    ), 
    da ich wamp 2.5 benutze und ein Skeleton-Application-Projekt mit composer erstellt habe befinden sich diese Module in:
    Code:
    www\firstApplication\module
    Die Module haben im config Ordner folgende Datenbankangaben:
    PHP-Code:
    // Filename: /module/Blog/config/module.config.php
     
    return array(
         
    'db' => array(
             
    'driver'         => 'Pdo',
             
    'username'       => 'root',  //edit this
             
    'password'       => '',  //edit this
             
    'dsn'            => 'mysql:dbname=blog;host=localhost',
             
    'driver_options' => array(
                 \
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
             
    )
         ),
          
    'service_manager' => array(
             
    'factories' => array(
                 
    'Blog\Mapper\PostMapperInterface'   => 'Blog\Factory\ZendDbSqlMapperFactory',
                 
    'Blog\Service\PostServiceInterface' => 'Blog\Factory\PostServiceFactory',
                 
    'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory'
             
    )
         ),
    ... 
    PHP-Code:
     // Filename: /module/Album/config/module.config.php
    return array(
         
    'db' => array(
             
    'driver'         => 'Pdo',
             
    'username'       => 'root',  //edit this
             
    'password'       => '',  //edit this
             
    'dsn'            => 'mysql:dbname=zf2tutorial;host=localhost',
             
    'driver_options' => array(
                 
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
                
    )
             ),
          
    'service_manager' => array(
             
    'factories' => array(
                
    'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory',
             ),
         ),
    ... 
    Ich habe bewusst die service_manager-Einstellung mit gepostet. Vielleicht sind diese ja für das Problem verantwortlich:

    Und zwar öffne ich die Module mit folgenden Links:
    Album:
    Code:
    localhost/firstApplication/public/album
    Blog:
    Code:
    localhost/firstApplication/public/blog
    Wenn ich jetzt die Links einzelnt Aufrufe funktioniert public/blog wunderbar doch beim module Album kommt folgender Fehler:
    Code:
    An error occurred
    
    Additional information:
    
     Zend\Db\Adapter\Exception\InvalidQueryException
    
     File:         F:\Program Files\wamp\www\firstApplication\vendor\zendframework\zend-db\src\Adapter\Driver\Pdo\Statement.php:244     Message:         Statement could not be executed (42S02 - 1146 - Table 'blog.album' doesn't exist)
    Das bedeutet, dass das framework eine Referenz auf die Datenbank des anderen Moduls hat. Wenn ich jetzt die Reihenfolge in der application.config.php ändere...
    PHP-Code:
        'modules' => array(
            
    'Application',
            
    'Blog',
            
    'Album'
        
    ), 
    ...funktioniert das Modul Album und indem Modul Blog erscheint folgender Fehler:
    Code:
    An error occurred
    
    Additional information:
    
     Zend\Db\Adapter\Exception\InvalidQueryException
    
     File:         F:\Program Files\wamp\www\firstApplication\vendor\zendframework\zend-db\src\Adapter\Driver\Pdo\Statement.php:244     Message:         Statement could not be executed (42S02 - 1146 - Table 'zf2tutorial.posts' doesn't exist)
    Ich habe absolut keine Ahnung wie die Reihenfolge hier darüber ausschlaggebend ist, welches Modul wie geladen wird und voreindingen, wie die einzelnen Module eine Referenz aufeinander haben. Mein einziger Ansatzpunkt sind die Module.php Dateien in den Modulen:
    PHP-Code:
         public function getAutoloaderConfig()
         {
             return array(
                 
    'Zend\Loader\StandardAutoloader' => array(
                     
    'namespaces' => array(
                         
    __NAMESPACE__ => __DIR__ '/src/' __NAMESPACE__,
                     )
                 )
             );
         }

         public function 
    getConfig()
         {
             return include 
    __DIR__ '/config/module.config.php';
         } 
    Liegt es vielleicht an dem StandardAutoloader, sodass einer schneller geladen wird als der Andere?

    Ich wäre wirklich dankbar für eure Hilfe
    Geändert von gulaschsuppe (14.09.2015 um 02:08 Uhr)

  2. #2
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.513
    Thanks
    4
    Thanked 353 Times in 284 Posts

    Standard

    Willkommen im Forum!
    Zitat Zitat von gulaschsuppe Beitrag anzeigen
    Liegt es vielleicht an dem StandardAutoloader, sodass einer schneller geladen wird als der Andere?
    Du gehst hier leider von einer falschen Annahme aus, denn es werden bei jedem Aufruf immer alle Modulkonfigurationen eingelesen und dabei zusammengeführt. (Siehe dazu auch in der Doku zum „Module Manager“ und im Tutorial „Advanced Configuration Tricks“)

    Wenn du mehrere Datenbanken verwenden möchtest, dann könntest du eine abstrakte Fabrik erstellen.

    Zwei Hinweise noch:
    Zitat Zitat von gulaschsuppe Beitrag anzeigen
    PHP-Code:
    'driver_options' => array(
        \
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''

    Weg damit und die Angabe „charset“ im DSN verwenden.

    Zitat Zitat von gulaschsuppe Beitrag anzeigen
    PHP-Code:
    'Blog\Mapper\PostMapperInterface'   => 'Blog\Factory\ZendDbSqlMapperFactory',
    'Blog\Service\PostServiceInterface' => 'Blog\Factory\PostServiceFactory'
    Wieso wird ein „Interface“ auf eine „Factory“ verwiesen? Was hat ein „Interface“ überhaupt in der Konfiguration verloren?
    Geändert von Kaiuwe (14.09.2015 um 13:28 Uhr)
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  3. The Following User Says Thank You to Kaiuwe For This Useful Post:

    gulaschsuppe (15.09.2015)

  4. #3
    Neuer Benutzer
    Registriert seit
    14.09.2015
    Beiträge
    3
    Thanks
    2
    Thanked 0 Times in 0 Posts

    Standard

    Vielen Dank für die Antwort.

    Was ich unerwähnt gelassen habe ist, dass der Code aus den beiden Tutorials der ZendFramework-Doku stammen die als PDF und im Web zugänglich ist.

    Wenn du mehrere Datenbanken verwenden möchtest, dann könntest du eine abstrakte Fabrik erstellen.
    Laut ZendFramework-Doku gilt für Factories:
    A factory is a class that creates instances of another class.
    Daher versteh ich nicht ganz den Zusammenhang zur Datenbank. Im übrigen ging es mir im wesentlichen um den oben beschriebenen Konflikt. Gibt es denn keine klare Begründung warum die Reihenfolge der Angabe in der application.config.php entscheidend ist bzw. wie eine Datenbankreferenz auf ein anderes Modul entsteht ?

    Weg damit und die Angabe „charset“ im DSN verwenden.
    Hab ich notiert. Da scheint das Tut nicht auf dem neusten Stand:
    framework.zend.com/manual/current/en/in-depth-guide/zend-db-sql-zend-stdlib-hydrator.html#quick-facts-zend-db-sql

    Wieso wird ein „Interface“ auf eine „Factory“ verwiesen? Was hat ein „Interface“ überhaupt in der Konfiguration verloren?
    Da Verweis ich ebenfalls auf das Tutorial:
    framework.zend.com/manual/current/en/in-depth-guide/zend-db-sql-zend-stdlib-hydrator.html#writing-the-mapper-implementation

    Ich arbeite derzeit noch mit den Tutorials. Eigentlich hatte ich nicht vor die großartig zu modifizieren. Ich möchte Grundlegend erstmal die Struktur und die Abhängigkeiten einzelner Dateien, sowie die zu den Frameworks verstehen. Falls jemand noch andere bzw. bessere Tutorials oder auch Literatur kennt die besser bzw. ergänzend zu den von der Website framework.zend.com kennt bin ich dafür gerne offen.

  5. #4
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.513
    Thanks
    4
    Thanked 353 Times in 284 Posts

    Standard

    Zitat Zitat von gulaschsuppe Beitrag anzeigen
    Was ich unerwähnt gelassen habe ist, dass der Code aus den beiden Tutorials der ZendFramework-Doku stammen die als PDF und im Web zugänglich ist.
    Gut zu wissen.


    Zitat Zitat von gulaschsuppe Beitrag anzeigen
    Laut ZendFramework-Doku gilt für Factories:
    Daher versteh ich nicht ganz den Zusammenhang zur Datenbank.
    Schau dir mal die Klasse „Zend\Db\Adapter\AdapterServiceFactory“, denn diese erstellt dir einen Datenbankadapter. Mit einer abstrakten Fabrik kannst du zwei unterschiedliche Adapter erstellen lassen, die sich jeweils mit einer anderen Datenbank verbinden.

    Zitat Zitat von gulaschsuppe Beitrag anzeigen
    Im übrigen ging es mir im wesentlichen um den oben beschriebenen Konflikt. Gibt es denn keine klare Begründung warum die Reihenfolge der Angabe in der application.config.php entscheidend ist bzw. wie eine Datenbankreferenz auf ein anderes Modul entsteht ?
    Nochmal: du verrennst dich hier. Da die Konfigurationen zusammengeführt werden, überschreiben sich die Angaben „db“ aus deinen beiden Modulen. Dabei ist es egal welches Modul aufgerufen wurde, denn es werden immer alle Konfigurationen eingelesen.
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  6. The Following User Says Thank You to Kaiuwe For This Useful Post:

    gulaschsuppe (17.09.2015)

  7. #5
    Neuer Benutzer
    Registriert seit
    14.09.2015
    Beiträge
    3
    Thanks
    2
    Thanked 0 Times in 0 Posts

    Standard

    Zitat Zitat von Kaiuwe Beitrag anzeigen
    Wieso wird ein „Interface“ auf eine „Factory“ verwiesen? Was hat ein „Interface“ überhaupt in der Konfiguration verloren?
    Das gesamte In-depth Tutorial ist auf diesem Prinzip aufgebaut. So wird zum Beispiel in der Klasse ListControllerFactory mit dem ServiceLocator dieses Interface genutzt:

    PHP-Code:
    class ListControllerFactory implements FactoryInterface
     
    {
         
    /**
          * Create service
          *
          * [At]param ServiceLocatorInterface $serviceLocator
          *
          * [At]return mixed
          */
         
    public function createService(ServiceLocatorInterface $serviceLocator)
         {
             
    $realServiceLocator $serviceLocator->getServiceLocator();
             
    $postService        $realServiceLocator->get('Blog\Service\PostServiceInterface');

             return new 
    ListController($postService);
         }
     } 
    Wenn ich das hier richtig verstehe wird hier mit $realServiceLocator->get die Klasse PostServiceFactory aufgerufen, die dann einen PostService zurück gibt:
    PHP-Code:
    class PostServiceFactory implements FactoryInterface
     
    {
         
    /**
          * Create service
          *
          * [At]param ServiceLocatorInterface $serviceLocator
          * [At]return mixed
          */
         
    public function createService(ServiceLocatorInterface $serviceLocator)
         {
             return new 
    PostService(
                 
    $serviceLocator->get('Blog\Mapper\PostMapperInterface')
             );
         }
     } 
    Oder ist meine Annahme Falsch?

    Denn dann müsste ich mit dem Verständnis des Ganzen wohl von vorn anfangen.


    Was ist denn so falsch an dem Ansatz mit den Interfaces?

    Letztendlich werden dadurch Komplikationen bei Entwicklung mit mehreren Personen vermieden, da jemand der in die module.config.php schaut sieht, dass hier auf ein Interface verwiesen wird. Er schaut ins Interface und weiß, was er erwartet, schaut dann noch in die Factory-Klasse und kann ohne die eigentliche Klasse trotzdem weiterarbeiten.

    Oder habe ich hier etwas nicht verstanden ?

  8. #6
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.513
    Thanks
    4
    Thanked 353 Times in 284 Posts

    Standard

    Zitat Zitat von gulaschsuppe Beitrag anzeigen
    Was ist denn so falsch an dem Ansatz mit den Interfaces?
    Der Vorgang ist schon klar und an Interfaces ist absolut nichts falsch, ganz im Gegenteil. Ich hätte nur im "Service Locator" nicht auf ein Interface verwiesen, denn das will hier keiner abrufen, sondern ein Objekt, welches dieses Interfaces implementiert.
    Ich persönlich empfinde dies eher als Irreführung, denn ich möchte "Blog\Service\PostService" und nicht ein Interface. Könnte man aber in die Kiste für "Geschmackssachen" stecken.

    (Lass dich dadurch aber nicht ablenken. Ich selbst kenne die Doku und auch die Tutorials nicht auswendig und es war mir bisher auch nicht aufgefallen, dass hier auf Interfaces verwiesen wird. Hauptsache du hast die Sache verstanden, denn damit hast du schon mal eine Art Masterplan.)
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

Ähnliche Themen

  1. Datenbankverbindung definieren und aufrufen
    Von Dromor im Forum Einsteigerfragen
    Antworten: 10
    Letzter Beitrag: 15.02.2011, 16:43
  2. Problem mit der Bootstrap
    Von klaus24 im Forum Core
    Antworten: 2
    Letzter Beitrag: 18.03.2010, 12:01
  3. globale Datenbankverbindung geht in der Session verloren
    Von dat Ly im Forum Einsteigerfragen
    Antworten: 5
    Letzter Beitrag: 07.07.2009, 10:24
  4. Problem mit der Installation
    Von itc im Forum Installation & Konfiguration
    Antworten: 8
    Letzter Beitrag: 10.08.2007, 01:37
  5. Problem mit der Registry
    Von mbhk im Forum Einsteigerfragen
    Antworten: 11
    Letzter Beitrag: 24.06.2007, 21:26

Stichworte

Lesezeichen

Berechtigungen

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