A non-empty PSR-4 prefix must end with a namespace separator
Asked Answered
H

3

108

I'm trying to setup PSR-4 with Composer but I'm just getting A non-empty PSR-4 prefix must end with a namespace separator.

My autoload in my composer.json looks like this:

"autoload": {
    "psr-4": {
        "Acme\\models" : "app/models"
    }
},

app/models is empty.

What am I doing wrong? How can I fix this?

Hydrocephalus answered 30/1, 2014 at 17:29 Comment(0)
H
221

Someone made a comment but removed it. He mentioned I was missing \\ at the end of Acme\\models. Acme\\models\\ will get rid of the message and work as it should.

Hydrocephalus answered 30/1, 2014 at 17:38 Comment(6)
Yes, PSR-4 requires the trailing slash. (well double since it needs to be escaped)Disparity
I must say this is not only a stupid requirement, the spec also makes it extremely clear that this is the case. Hence the reason I show up here for a very basic issue.Parturition
After using this answer, I also found that composer validate also gives you a good indication of what's wrong.Gassman
this cause issues when using repository type path, relative, symlinked, as it seems it tries to somehow recreate symlink just after this operation and has obsolete or cached composer.jsonDrawback
I did this and still got the same error, should I remove the vendor or clear some cache?Ivatts
For anyone using symlinked, you should delete the symlinked folder before trying again.Ivatts
N
12

As others said PSR-4 requires the trailing slash

Though I had to convert / to \\ in Windows (should work fine on Linux):

    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "App\\Tests\\": "tests/"
        }
    },
Nutgall answered 13/9, 2020 at 6:49 Comment(0)
T
0

A non-empty PSR-4 prefix must end with a namespace separator. namespace separator means \\

  • Method-1

Incorrect ⬇️⬇️⬇️

"autoload": {
    "psr-4": {
        "Acme\\models" : "app/models"
    }
},

Correct ⬇️⬇️⬇️

"autoload": {
    "psr-4": {
        "Acme\\models" : "app/models/"
    }
},
  • Method-2: If this doesn't work try deleting vendor + composer.lock and reinstall dependencies
  • Method-3: Delete the autoload_psr4.php file in the libraries folder - it probably was created before the update and it had issues before.

Know more about PSR-4: Autoloader

Toothlike answered 7/9, 2022 at 5:38 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.