Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Projeto] Problema com Autoload

Olá, há algum tempo venho tentando rodar uma aplicação bem básica que desenvolvi usando o doctrine. Estou usando minha VPS para testar na web pois na hospedagem compartilhada não obtive muito sucesso. já que em minha localhost funcionou perfeitamente, instalei o composer, php e outras dependências tudo certinho (creio eu) na VPS. O composer funcionou certinho então logo rodei o composer install, com o arquivo composer.json no diretório definido para a instalação da aplicação, tudo funcionou perfeitamente, instalou os packages, tranquilo... Logo então usei o comando vendor/bin/doctrine list para listar os comandos e aparece:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

composer.json

{
    "name": "vgpdesign/armarioswebsite",
    "description": "Web site Marcenaria Belas Artes",
    "type": "libary",
    
    "autoload": {
        "psr-4": {
            "MBA\\": "src/"
        }
    },
    "authors": [
        {
            "name": "Vinicius Gomes",
            "email": "vinilgomeez@gmail.com"
        }
    ],

    "require": {
        "symfony/orm-pack": "^2.2",
        "psr/http-message": "^1.0",
        "nyholm/psr7": "^1.5",
        "psr/http-factory": "^1.0",
        "nyholm/psr7-server": "^1.0",
        "psr/http-server-handler": "^1.0",
        "php-di/php-di": "^6.0",
        "phpmailer/phpmailer": "^6.7.1"
    },

    "config": {
        "bin-dir": "vendor/bin/"
    }
}

EntityManagerCreator:

<?php

namespace MBA\Helper;

use Doctrine\ORM\ORMSetup;
use Doctrine\ORM\Configuration;
use Doctrine\ORM\EntityManager;
use Doctrine\DBAL\DriverManager;
use Doctrine\DBAL\Tools\DsnParser;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Mapping\Driver\AttributeDriver;
use Symfony\Component\Cache\Adapter\ArrayAdapter;
use Symfony\Component\Cache\Adapter\PhpFilesAdapter;
use Doctrine\Persistence\Mapping\Driver\StaticPHPDriver;

class EntityManagerCreator
{
    /** @return EntityManagerInterface **/
    public function getEntityManager(): EntityManagerInterface
    {

        $paths = [ __DIR__ . '/../app/model/entities'];
        $proxyDir = __DIR__ . '/../data/proxies';
        $isDevMode = false;


        if ($isDevMode === TRUE) {

            $queryCache = new ArrayAdapter();
            $metadataCache = new ArrayAdapter();

        } else {

            $queryCache = new PhpFilesAdapter('doctrine_queries');
            $metadataCache = new PhpFilesAdapter('doctrine_metadata');

        }

        $config = new Configuration;
        $config->setMetadataCache($metadataCache);

        $driverImpl = new AttributeDriver([ __DIR__ . '/../app/model/entities']);
        $config->setMetadataDriverImpl($driverImpl);

        $config->setQueryCache($queryCache);
        $config->setProxyDir(__DIR__ . '/../data/proxies');
        $config->setProxyNamespace('MBA\Proxies');


        if ($isDevMode === TRUE) {

            $config->setAutoGenerateProxyClasses(true);

        } else {
            
            $config->setAutoGenerateProxyClasses(false);
            
        }

        $connection = DriverManager::getConnection([

            'driver' => 'pdo_mysql',
            'dbname' => 'web',  // Alterado antes de subir para o servidor. 
            'user' => 'web', // Alterado antes de subir para o servidor. 
            'password' => 'admin001',  // Alterado antes de subir para o servidor. 
            'host' => 'localhost', // Alterado antes de subir para o servidor. 
            
            'memory' => true
        ]);

        return new EntityManager($connection, $config);
    }
}

CLI :

<?php

require_once __DIR__ . '/../vendor/autoload.php';

use MBA\Helper\EntityManagerCreator;
use Doctrine\ORM\Tools\Console\ConsoleRunner;
use Doctrine\ORM\Tools\Console\EntityManagerProvider\SingleManagerProvider;

$entityManager = new EntityManagerCreator();
$em = $entityManager->getEntityManager();

return ConsoleRunner::run( new SingleManagerProvider($em), []);

//return ConsoleRunner::createHelperSet($em);

Estrutura de pastas: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Eu creio que seja alguma coisa relacionada a autoload, porque se eu der require_once nas classes acho que funcionaria, porém fica inviável.

Estou usando o Ubuntu 22.04 64bit com o CloudPanel.

Se alguém puder me auxiliar eu agradeço muito !

2 respostas
solução!

E aí, Vinicius!

Mano, pelo que vi e pelas fotinhos que mandou, tá com cara de que o rolê tá dando ruim no carregamento automático de classes do Composer, sacou? Esse erro "Class MBA\Helper\EntityManagerCreator not found" tá gritando que o Composer não tá achando essa tal de EntityManagerCreator no lugar certo, tipo no namespace MBA\Helper.

Vê se o nome do namespace e o caminho dessa EntityManagerCreator tá de boa. Ela tem que estar na pasta src/helper, como tá escrito no seu composer.json. Às vezes, é só dar um refresh no Composer. Digita composer dump-autoload na raiz do projeto pra ver se resolve. Mano, vi que a pasta vendor tá com o dono sendo root:root e as outras tá diferente. Dá um chown -R webdigitalshop:webdigit vendor/ pra alinhar isso.

No teu cli-config.php, coloca o caminho todo do autoload do Composer, tipo assim:

require_once '/caminho/completo/pra/sua/parada/vendor/autoload.php';

Vê se o autoload.php tá na pasta vendor e tudo certinho lá dentro.

Lembra que o Linux é chato com maiúsculas e minúsculas. Tudo tem que casar com o que tá no namespace e no composer.json.

Tenta dar um composer update pra ver se resolve alguma incompatibilidade.

Confirma se a versão do PHP que tá no teu terminal é a mesma que tá no teu servidor web. Digita php -v e vê qual é.

Vi um errinho no composer.json com "type": "libary". Acho que é só corrigir pra "type": "library". Pode não ser a causa, mas melhor arrumar.

Depois dessas dicas, manda bala no vendor/bin/doctrine list pra ver se o problema sumiu.

Tamo junto!

Irmão você é o cara!! Li atentamente o que você me disse e obrigado pelos toques e correções, vou arrumar tudo!

Mas na hora que voce disse "Lembra que o Linux é chato com maiúsculas e minúsculas." e eu havia me esquecido desse pequeno detalhe kkkkk, já saquei na hora e era exatamente isso! Agora funcionou perfeitamente! só vou ter um trabalinho em mudar as namespaces masss tudo certo.

Mais uma vez, muito obrigado!

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software