[PHP Composer] autoload namespaces

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • WinstonC
  • Registratie: Juli 2013
  • Laatst online: 09:00
Na mijn eerdere mislukte post heb ik een andere vraag waar ik daadwerkelijk niet uit kom. In mijn package hanteer ik het PSR-0 standaard. In mijn geval zijn mijn namespaces vanaf de derde deel gelijk aan de mappenstructuur. Mijn mappenstructuur ziet er als volgt uit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Source
- Helpers
- Implementations
-- ActionResults
-- Environments
-- Handlers
-- ModelBinders
-- Starters
-- Transformers
- Interfaces
-- ActionResults
-- Environments
-- Handlers
-- ModelBinders
-- Starters
--- Starter.php
-- Transformers


Het beginsel van mijn namespaces zijn in dit pakket altijd: MvH\Core\. Dus ik heb in de composer.json van mijn pakket de volgende regels staan:
code:
1
2
3
"autoload": {
    "psr-0": { "MvH\\Core\\" : "Source/" }
}


De top van het Starter.php bestand staat als volgt:
code:
1
2
3
4
namespace MvH\Core\Implementations\Starters;

use MvH\Core\Interfaces\Handlers\ICoreRouteHandler;
use MvH\Core\Interfaces\Starters\IStarter;

Via de volgende test bestand kom ik erachter dat er iets toch niet goed is ingesteld:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php

require_once "./vendor/autoload.php";

use MvH\Core\Implementations\Starters\Starter;

error_reporting(E_ALL);
ini_set('display_errors', '1');

class test extends Starter
{

    /**
     * Instantie van een ICoreRouteHandler.
     * @return \MvH\Core\Interfaces\Handlers\ICoreRouteHandler
     */
    public function DefaultHandler()
    {
        // TODO: Implement DefaultHandler() method.
    }

    /**
     * Functie om te controleren of de default handler gestart
     * moet worden.
     * @return bool
     */
    public function StartDefaultHandler()
    {
        // TODO: Implement StartDefaultHandler() method.
    }
}

Want ik krijg namelijk de volgende error...
code:
1
Fatal error: Class 'MvH\Core\Implementations\Starters\Starter' not found in D:\*knip*\Websites\test\index.php on line 19

De autoload_namespaces.php van composer zelf wordt na mijn idee wel goed gegeneerd:
code:
1
2
3
return array(
    'MvH\\Core' => array($vendorDir . '/mvh/core/Source'),
);


Ik heb geprobeerd:
  • Om de map 'core' te veranderen in 'Core' om vervolgens maar één 'hoofd-namespace' te definiëren maar dat werkte ook niet.
  • Gekeken op internet of ik misschien de autoload verkeerd had gedefinieerd maar dat leek niet het geval.
  • Gekeken of het uit maakt of de website lokaal of op een server draait, maar dat leek ook niet het geval.
Verder heb ik ook gekeken of er überhaupt een aanvraag wordt gedaan bij autoload_real.php van composer in de functie loadClassLoader($class) maar daar komt hij geen eens langs..?

Ik ben radeloos!

Acties:
  • 0 Henk 'm!

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 10:26
zoals je nu je mappen structuur hebt, wil je PSR-4 gebruiken. Met PSR-0 moet je de mappen herhalen, dus zou je Source/MvH/.. moeten doen.
Waarschijnlijk hoef je dus alleen die 0 in 4 te veranderen en verder niets.

Acties:
  • 0 Henk 'm!

  • WinstonC
  • Registratie: Juli 2013
  • Laatst online: 09:00
Je hebt gelijk. Het werkt, bedankt! Even maar verder inlezen in PSR-4 dus..

Acties:
  • 0 Henk 'm!

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 10:26
Dat is wel het geposte verschil meteen al ;) En support voor legacy namespaces (underscore ipv echte namespaces) is verwijderd. Nieuwe projecten moet je gewoon PSR-4 pakken altijd :)