Hallo,

Ik probeer eigen classes d.m.v. composer te autoloaden. Hiervoor heb ik een directory genaamd app/custom/myclass.php in de class heb ik de volgende namespace

<?php
namespace custom;
?>

Nu heb ik in de composer.json het volgende


    "autoload": {
        "psr-4": {
            "custom\\": "app/"
        }
    }


wanneer ik een composer.update uitvoer krijg ik helaas de melding dat de class niet bestaat. Wat doe ik hier fout?
app/ moet zijn app/custom ??
@Ozzie nee helaas werkt dat ook niet. Volgens de composer manual kom ik er ook niet helemaal uit.. de custom is in dit geval volgens de handleiding al de directory waarnaar gezocht moet worden en deze bevind zich in app/ als ik het goed begrepen heb.
Ik werk niet met Composer dus hoe het exact werkt weet ik niet.

Probeer eens het hardcoded path in te geven vanaf de root, dus "path/to/app". En als dat niet werkt, kijk dan even in je error log. Als he goed is zou je daaruit moeten kunnen afleiden welk path er gebruikt wordt en dan kun je waarschijnlijk zien waar het misgaat.
De app/ zit al in de root dir. verder zit er niets anders in app/ dan die custom directory. Verder wordt ik ook van de error log niks wijzer.. daar krijg ik namelijk exact dezelfde error..

>> daar krijg ik namelijk exact dezelfde error

en die luidt?

Fatal error: Class 'app\custom\JsonFetcher' not found in /Users/username/Sites/demo/config/config.php on line 15

Daar wordt dus aangeroepen..

<?php
$app['JsonFetcher'] = $app->share(function($app) {
return new app\custom\JsonFetcher($app);
});
?>
path moet zo zijn:

    "autoload": {
        "psr-4": {
            "custom\\": "app/custom"
        }
    } 


en daarna moet je

composer dump-autoload

uitvoeren, update is voor je packages bij te werken.


Ik zie nu dat je

return new app\custom\JsonFetcher($app);

gebruikt, maar je definieerd je namespace als "custom" en niet "app\custom".
daarom moet je "app" weglaten uit je namespace, of toevoegen in je autoload statement in je composer file.
@Tim bedankt het werkt nu :) de edit kwam ik zelf ook al achter tijdens het veranderen.
Dit is dus juist geen PSR-4. In PSR-4 zet je je namespace niet meer in je mappen structuur. Dus al die mappen die alleen andere mappen bevatten (zoals app in dit geval) moeten weg. Dus de klassen van custom moeten direct in app/ en custom/ moet weg. Dan voer je in dat de custom namespace zich in de app map bevindt:
{
    "autoload": {
        "psr-4": {"custom\\": "app/"}
    }
}
Kan het niet zo zijn dat Reshad juist bewust onderscheid wil maken tussen z'n eigen "custom" classes, en tussen 3rd party libraries?


app
   /custom
   /mail_lib
   /pdf_lib

Reageren