How can I autoload a custom class in Laravel 5.1?
Asked Answered
S

4

9

I've created a library folder within the app folder to add my own classes.

enter image description here

This is the content of the file app/library/helper.php:

<?php

namespace Library;

class MyHelper
{
    public function v($arr)
    {
        var_dump($arr);
    }
}

I added the namespace to composer.json:

enter image description here

and then I ran

$ composer dump-autoload

but it does not seem to have any effects.

The files

  • vendor/composer/autoload_psr4.php
  • vendor/composer/autoload_classmap.php

did not change.

If I try to create an instance of MyHelper, Laravel reports the following error:

enter image description here

I'm not sure what I am doing wrong.

Scholem answered 10/8, 2015 at 11:7 Comment(0)
S
12

Your autoloading configuration is almost good, but you have

  • got the namespaces wrong
  • got the paths wrong

To fix the problem, adjust your autoloading configuration:

{
    "autoload": {
        "classmap": [
            "database"
        ],
        "psr-4": {
            "App\\": "app/"
        }
    }
}

Then rename the directory /library to /Library (note the case).

Then rename the file /app/Library/helper.php to /app/Library/MyHelper.php (note how class name should match the file name).

Then adjust the namespace of the class provided by /app/Library/MyHelper to match the PSR-4 prefix (and thus the structure of your project), as well as usages of the class:

namespace App\Library;

class MyHelper 
{
    public function v($arr)
    {
        var_dump($arr);
    }
}

For reference, see:

Spin answered 7/8, 2017 at 16:39 Comment(0)
L
10

Use files directive in composer.json: https://getcomposer.org/doc/04-schema.md#files

{
    "autoload": {
        "files": ["app/library/helper.php"]
    }
}
Lee answered 10/8, 2015 at 11:23 Comment(0)
S
1

Use composer.json :

   "autoload": {
    "classmap": [
        "database",
        "app/Transformers"
    ]
 },

Add your auto load directories like I added app/Transformers.

Don't Forget to add run composer dump-autoload.

The only problem with this method is you need to run composer dump-autoload whenever you add new class do that directory.

Or You can use "Files" in composer.json.

"autoload": {
    "files": ["src/MyLibrary/functions.php"]
}
Shiksa answered 8/7, 2016 at 8:21 Comment(0)
T
0

I know this question was answered a while ago, but the reason it isn't working is that you need to give the namespace that corresponds with the file structure. Therefore, since the Library class is inside the App folder you need:

namespace App\Library;

class MyHelper{
    public function v($arr){
        var_dump($arr);
    }
}

Additionally, if you are going to call the class MyHelper, you need to call the file MyHelper.php

Tussah answered 3/8, 2017 at 14:50 Comment(2)
No, it says App\Library.Spin
Oh I didn't realize you used lower case. In Laravel it will recognize both upper case and lower case for the file structure. I have had a folder called library and namespace Library and it workedTussah

© 2022 - 2024 — McMap. All rights reserved.