从变量类调用静态方法

时间:2014-03-24 22:35:07

标签: php symfony

我有一些方法可以做同样的事情,但需要在数据库中保留不同的文件和实体。

这些方法在每个实体上调用静态方法。此静态方法读取字符串并返回具有从字符串设置的属性的实体对象。

为了使这个过程自动化,我用一个方法(atualizaDB)抽象了重复的工作,我调用这个方法通过参数传递每个函数之间的差异。

当atualizaDB尝试调用静态方法并返回FatalErrorException: Error: Class not found时,会出现问题。我该怎么做才能纠正这个错误?

感谢。

<?php

namespace AGC\Bundle\AGCPedidosBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;

class AtualizacaoController extends Controller
{
    private function atualizaDB($arquivo, $entidade)
    {
        // Arquivo de atualização
        $arquivoTXT = rtrim($this->container->getParameter('files_dir'), ' '.DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.$arquivo.'.txt';

        // Verifica se o arquivo existe
        if (!is_file($arquivoTXT)) {
            return new Response('Erro: Arquivo "'.$arquivoTXT.'" não encontrado!', 404, array('Content-type'=>'text/plain'));
        } else {
            // Abrimos o arquivo
            $arquivoTXTArr = file($arquivoTXT);

            // Verifica se conseguiu abrir o arquivo
            if ($arquivoTXTArr === false) {
                return new Response('Erro: Falha ao abrir o arquivo "'.$arquivoTXT.'".', 500, array('Content-type'=>'text/plain'));
            } else {
                try {
                    // Percorre as linhas do arquivo
                    for ($i=2; $i<count($arquivoTXTArr); $i++) {
                        // Mapea o objeto à partir da linha do arquivo
                        $registroObj = $entidade::fromTXT($arquivoTXTArr[$i], $this->getDoctrine());

                        // Procura o registro no banco de dados
                        $registroFromDB = $this->getDoctrine()->getRepository('AGCPedidosBundle:'.$entidade)->findOneBy(array('codigo'=>$registroObj->getCodigo()));

                        // Achou o registro?
                        if ($registroFromDB === null) {
                            // Adiciona um novo registro ao banco de dados
                            $this->getDoctrine()->getManager()->persist($registroObj);
                        } else {
                            // Atualiza o registro no banco de dados
                            $registroFromDB->updateObject($registroObj);

                            // Persiste os dados
                            $this->getDoctrine()->getManager()->persist($registroFromDB);
                        }
                    }

                    // Da commit nos dados
                    $this->getDoctrine()->getManager()->flush();

                    // Responde com sucesso
                    return new Response('Ok', 200, array('Content-type'=>'text/plain'));
                } catch (\Exception $e) {
                    throw new \Exception($e->getMessage(), $e->getCode(), $e->getPrevious());
                }
            }
        }
    } 

    public function clientesAction()
    {
        return $this->atualizaDB('nClientes', 'Cliente');
    }

    public function fornecedoresAction()
    {
        return $this->atualizaDB('nFornecedores', 'Fornecedor');
    }

    public function gruposAction()
    {
        return $this->atualizaDB('nGrupo', 'Grupo');
    }

    public function pedidosAction()
    {
        return $this->atualizaDB('nPedidos', 'Pedido');
    }

    public function vendedoresAction()
    {
        return $this->atualizaDB('nVendedores', 'Vendedor');
    }
}

编辑包含返回的完整错误,而不将名称空间添加到类名:

1/1
FatalErrorException: Error: Class 'Cliente' not found in /Users/DennyLoko/Zend/workspaces/DefaultWorkspace/agc_pedidos/src/AGC/Bundle/AGCPedidosBundle/Controller/AtualizacaoController.php line 33
in /Users/DennyLoko/Zend/workspaces/DefaultWorkspace/agc_pedidos/src/AGC/Bundle/AGCPedidosBundle/Controller/AtualizacaoController.php line 33
at ErrorHandler->handleFatal() in /Users/DennyLoko/Zend/workspaces/DefaultWorkspace/agc_pedidos/vendor/symfony/symfony/src/Symfony/Component/Debug/ErrorHandler.php line 0
at AtualizacaoController->atualizaDB() in /Users/DennyLoko/Zend/workspaces/DefaultWorkspace/agc_pedidos/src/AGC/Bundle/AGCPedidosBundle/Controller/AtualizacaoController.php line 65
at AtualizacaoController->clientesAction() in /Users/DennyLoko/Zend/workspaces/DefaultWorkspace/agc_pedidos/app/bootstrap.php.cache line 2843
at ??call_user_func_array() in /Users/DennyLoko/Zend/workspaces/DefaultWorkspace/agc_pedidos/app/bootstrap.php.cache line 2843
at HttpKernel->handleRaw() in /Users/DennyLoko/Zend/workspaces/DefaultWorkspace/agc_pedidos/app/bootstrap.php.cache line 2817
at HttpKernel->handle() in /Users/DennyLoko/Zend/workspaces/DefaultWorkspace/agc_pedidos/app/bootstrap.php.cache line 2946
at ContainerAwareHttpKernel->handle() in /Users/DennyLoko/Zend/workspaces/DefaultWorkspace/agc_pedidos/app/bootstrap.php.cache line 2248
at Kernel->handle() in /Users/DennyLoko/Zend/workspaces/DefaultWorkspace/agc_pedidos/web/app_dev.php line 28
at ??{main}() in /Users/DennyLoko/Zend/workspaces/DefaultWorkspace/agc_pedidos/web/app_dev.php line 0

1 个答案:

答案 0 :(得分:2)

这是命名空间问题。将变量用于类名时,需要提供包括命名空间的完整类名。

假设您的所有ClienteFornecedorGrupo等所有类都位于同一名称空间(可能是AGC\Bundle\AGCPedidosBundle\Entity),您可能会逃避这样的事情。 ..

private function atualizaDB($arquivo, $entidade) {
    $entidade = '\\AGC\\Bundle\\AGCPedidosBundle\\Entity\\'.$entidade;

    // and the rest...
}