我有一些方法可以做同样的事情,但需要在数据库中保留不同的文件和实体。
这些方法在每个实体上调用静态方法。此静态方法读取字符串并返回具有从字符串设置的属性的实体对象。
为了使这个过程自动化,我用一个方法(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
答案 0 :(得分:2)
这是命名空间问题。将变量用于类名时,需要提供包括命名空间的完整类名。
假设您的所有Cliente
,Fornecedor
,Grupo
等所有类都位于同一名称空间(可能是AGC\Bundle\AGCPedidosBundle\Entity
),您可能会逃避这样的事情。 ..
private function atualizaDB($arquivo, $entidade) {
$entidade = '\\AGC\\Bundle\\AGCPedidosBundle\\Entity\\'.$entidade;
// and the rest...
}