Dmytro Zarezenko
Dmytro Zarezenko

Reputation: 10686

Composer vendor/ folder FTP upload

I have a local project with loaded with Composer libs. I uploaded this project to my FTP and received errors, connected with not found classes from some libs.

Can I simply copy vendor/ folder to FTP or I missed something?

Error received: Fatal error: Class 'AAA\Core\Tools' not found in /home/aaa/public_html/api.php on line 11

api.php:

<?php
    use AAA\Core\Tools;

    require_once("./vendor/autoload.php");
    require_once("./api/" . Tools::getFieldValue('controller') . ".php");

All works fine on localhost!

Upvotes: 2

Views: 4727

Answers (5)

edmondscommerce
edmondscommerce

Reputation: 2011

Rather than trying to upload via FTP which I think is going to be tricky if not impossible to get right, I would suggest you explore getting composer working on your hosting environment.

Composer is entirely PHP based, so should run anywhere that PHP is running.

If you don't have command line access, you can use something like PHPShell which gives you a PHP based command line on which you can then run Composer.

See this other SO answer to get some tips on how to use PHPShell.

Another option is to build a little PHP wrapper that you actually run by visiting it in your browser, in the classic PHP way. See this other SO answer for some tips on how to do that.

Bottom line, you should really look at getting Composer running on your server rather than trying to bodge it another way.

Once you have done your composer process on the server, you must remove the PHPShell or composer wrapper you created so that you don't leave any security holes.

Upvotes: 1

iDimensionz
iDimensionz

Reputation: 25

Composer is not meant to be used that way (i.e. you shouldn't be manually transferring vendor directories from one environment to another).

As you add dependencies to your project, the composer.json file will contain those dependencies. When you run composer install or update on your localhost, it "locks" the current version of those dependencies for your project and stores them in the composer.lock file. You should be transferring the composer.json and composer.lock files from your development environment to your production environment and then running composer install on your production environment as part of your deployment process. When you run composer install on your production environment, Composer will look at your composer.lock file and install the specified versions of the dependencies in the vendor directory of the production environment.

You may want to review the composer documentation regarding basic usage (https://getcomposer.org/doc/01-basic-usage.md) and command line options (https://getcomposer.org/doc/03-cli.md) for more details.

Upvotes: 0

Alexandru Guzinschi
Alexandru Guzinschi

Reputation: 5726

Linux has a case sensitive file system. That means that files Alex.txt and alex.txt are the same thing in Windows, but not in Linux. Actually on Linux both can happily live in the same directory:

$ tree .                                                    
.
├── alex.txt
└── Alex.txt

0 directories, 2 files

Taking this into consideration, I would try to double check that the paths you are using in your namespace are actually identical to what is found at the file system level. (i.e: AAA directory with only uppercase letters ; Core directory capitalized and Tools.php file capitalized)


If you want to keep your existing file system layout, you can use PSR-4 to explicitly tell Composer how to map the namespace to the file system:

  1. Change autoload section from your composer.json:

    {
        "autoload": {
            "psr-4": {"AAA\\DB\\": "db/"}
        }
    }
    

    where db/ is the actual path from the file system

  2. Update the autoloader:

    $ composer dump-autoload
    

This will take care of directory names, but doesn't apply for files. Meaning that any file inside db/ must be named exactly as used in namespace (for a usage as use AAA\DB\DBCore the file must be db/DBCore.php).

If your file is named dbcore.php and you want to reference it in your namespace as DBCore, you can use classmap feature from Composer:

"autoload": {
    "classmap": [
        "db/dbcore.php"
    ]
}

dbcore.php:

<?php

namespace AAA\DB;

class DBCore
{
}

And you can use it as usual:

<?php
require_once("./vendor/autoload.php");
$dbCore = new \AAA\DB\DBCore();

Upvotes: 3

Neddage
Neddage

Reputation: 306

Firstly I would check the autoloader files composer has generated to make sure the paths are valid on your linux server.

Another simple but common issue is that on windows the folder and file names are not case sensitive however they are on Linux. Double check that the folders and files have the correct case as if not it won't find them to auto load.

Upvotes: 2

Diego Fu
Diego Fu

Reputation: 420

Did you tell the composer where your Class 'AAA\Core\Tools' is?

You can even add your own code to the autoloader by adding an autoload field > to composer.json.

{
    "autoload": {
        "psr-4": {"Acme\\": "src/"}
    }
}

Upvotes: 0

Related Questions