【问题标题】:Symfony Cannot access EntityManager inside custom class/Method [duplicate]Symfony无法访问自定义类/方法中的EntityManager [重复]
【发布时间】:2021-10-18 11:07:41
【问题描述】:

已经在 symfony-1 中创建的自定义类 dataUtils。我正在尝试在 symfony-5 中重新创建相同的类。当我尝试访问 entityManager 时,它显示“不能在非对象上下文中使用 $this”。我附上了代码供参考。

<?php

namespace App\Model;

class DateUtils {

    private $entityManager;

    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->entityManager = $entityManager;

        parent::__construct();
    }

    public static function executeQuery($connection_param_name, $query, $values = array(), $connection = null, $charset_to = null, $i = 0) 
    {
        $em = $this->entityManager; // error (cannot use $this in a non-object context)
        
        if (!sizeof($values)>0 and stripos(strtolower($query), "where")!==false)
        {
            $filesystem = new Filesystem();
            $filesystem->dumpFile("log.txt", $query);
        }
        
        try {
            
            $connection = (! $connection) ? $em->getConnection($connection_param_name) : $connection;
            if ($charset_to == 'utf-8') {
                self::converToUtf8 ( $connection );
            }
            if ($charset_to == 'latin1') {
                self::converToLatin1 ( $connection );
            }
            if ($charset_to == 'latin2') {
                self::converToLatin2 ( $connection );
            }
            if ($charset_to == 'latin5') {
                self::converToLatin5 ( $connection );
            }

            $resultset = $connection->createQuery($query);
            foreach ($values as $key => $value){
                $resultset->bindValue($key, $value);
            }
            $resultset->execute();

        } catch (\Doctrine\ORM\ORMException $e) {
            $i++;
            if((strpos($e->getMessage (), 'Deadlock') !== false || strpos($e->getMessage (), 'Lock wait timeout exceeded') !== false) && $i < 12){
                $sleep = rand ( 1 , 5000 );
                usleep($sleep);
                return self::executeQuery($connection_param_name, $query, $values, $connection, $charset_to, $i);
            }elseif(strpos($e->getMessage (), 'Base table or view not found') !== false && strpos($e->getMessage (), 'st_user_value_berechnung_tmp') !== false && $i < 11){
                return self::executeQuery($connection_param_name, $query, $values, $connection, $charset_to, $i);
            }else{
                $sendMessage = gethostname () . ' - DataUtils:executeQuery: ' . $e->getMessage () . ' - ' . $query . ' - '.serialize($values);
                SystemTrayPeer::log ( 'err', $sendMessage, 'databank-errors', 2 );
            }
        }
        return (isset($resultset) ? $resultset : false);
    }
    
    
    
    
    
}

我也不知道如何在 symfony-5 中使用 symfony1 中的 BasePeer 和 SystemTrayPeer 类。我是否需要在 service.yaml 中添加 DatenUtils 类作为服务?

【问题讨论】:

    标签: php symfony entitymanager


    【解决方案1】:

    您无法从 static 方法访问您的类的属性,这就是您收到此错误的原因。

    如果您正在重写您的应用程序,您应该考虑这个类的真正工作是什么。似乎它处理了太多不同的工作:)

    【讨论】:

    • 谢谢@Mcsky,这个类的真正工作是使用连接相关数据库的方法来执行查询。另外,我将重写一些用于自定义数据库表列选择/插入等的方法。
    猜你喜欢
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 2015-03-12
    • 2015-11-04
    • 2017-06-11
    相关资源
    最近更新 更多