首页 > 解决方案 > php 错误消息:可捕获的致命错误:传递给 EIC\EdiBundle\Service\SerialService::validateOrder() 的参数 1 必须是实例

问题描述

首先让我先说我不是 php 程序员,所以我可能不会理解 php 术语。

话虽如此,我正在尝试通过导入订单来解决此错误,但可以看到它在第 243 行和第 69 行出现错误,但正如我所说的,我不完全确定 SerialService::validation 必须是 salesOrderHeader 的实例意味着什么。我相信给出了一个空值,因为没有像数据库图像中那样创建 JSON 文件,我不知道为什么。 在此处输入图像描述

LineNo:243 消息:可捕获的致命错误:传递给 EIC\EdiBundle\Service\SerialService::validateOrder() 的参数 1 必须是 EIC\SalesBundle\Entity\SalesOrderHeader 的实例,给定 null,在 /var/www/eic/ 中调用src/EIC/EdiBundle/Service/SerialService.php 在第 69 行并定义

串行服务.php

/**
     * @Route("/serial/{sender}", name="edi_serialize")
     */
    public function serializeAllNotImported($sender=null)
    {
        $orders = array();
        $documents = $this->em->getRepository('EICEdiBundle:Document')->findDocumentsNotSerialized($sender);
        $jpp = new JsonPrettyPrinter();
        /* @var $document Document */

        foreach($documents as $document){
            print_r("--- serializing doc id#: ".$document->getId()." ---\n");
//            print_r($document->getJsonOrder());

            try {
                $order = $this->serializeDocumentToEic($document);// ToDo if $order is not SalesOrderHeader Class email and continue
                $class = get_class($order);
                $orders[] = $order;
                $json = $this->serializer->serialize($order, 'json');
                $valid = $this->validateOrder($order); //line 70
                if ($valid === true) {
                    $document->setCustomerNumber($order->getCustomerNumber());
                    $document->setJsonOrder($json);
                    $this->em->persist($document);
                    $this->em->flush();
                } else {
                    $pjson = $jpp->format($json);
                    $errorMessage = $valid . "\n" . $pjson;
                    $this->emailError($errorMessage);
                }
            } catch (\Exception $e) {
                print_r(PHP_EOL);
                print_r('<<---------Exception-------->> <<-------SerialService------->>');
                print_r(PHP_EOL);
                print_r(PHP_EOL);
                print_r('File: '.$e->getFile());
                print_r(PHP_EOL);
                print_r('LineNo: '.$e->getLine());
                print_r(PHP_EOL);
                print_r('Message: '.$e->getMessage());
                print_r(PHP_EOL);
                print_r(PHP_EOL);
                print_r($e->getTraceAsString());
                print_r(PHP_EOL);
                print_r(PHP_EOL);
                print_r('<<---------Exception End-------->>');
                print_r(PHP_EOL);
                continue;
            }

            print_r("--- end serializing doc id#: ".$document->getId()." ---\n");
        }

240 至 268 号线

protected function validateOrder(SalesOrderHeader $order){
        $error = false;
        $errorMessage = '';

        $customerNumber = $order->getCustomerNumber(); //line 244
        if(empty($customerNumber)){
            $error = true;
            $errorMessage .= 'Error: Can not import this order because the customer part number could not be determined'."\n";
        }

        /* @var $line SalesOrderItem */
        foreach($order->getLineItems() as $line){
            $stockNumber = $line->getStockOrdered();
            if(empty($stockNumber)){
                $error = true;
                $errorMessage .= 'Error: StockNumber -> Can not import this order because part number ( '.$line->getCustomerPartNumber().' ) could not be determined'."\n";
                $errorMessage .= "\t Please have the Catalog Dept. added to the interchange.\n";
                $errorMessage .= "\t This order will be processed, once the part number has been added to the interchange,  on the next run.\n";
            }
        }

        if($error===false){
            return true;
        }
        else{
            return $errorMessage;
        }

    }

验证服务.php

class ValidateService
{

    /* @var \AppKernel */
    protected $kernel;

    /* @var EntityManager */
    protected $entityManager;

    /* @var Serializer */
    protected $serializer;

    /* @var ImportService */
    protected $importService;

    /* @var \Twig_Environment */
    protected $twig;

    /* @var \Swift_Mailer */
    protected $mailer;

    public function __construct(\AppKernel $kernel, EntityManager $entityManager, Serializer $serializer, ImportService $importService, $twig, \Swift_Mailer $mailer){
        $this->kernel = $kernel;
        $this->entityManager = $entityManager;
        $this->serializer = $serializer;
        $this->importService = $importService;
        $this->twig = $twig;
        $this->mailer = $mailer;
    }

    public function validateOrders(){
        $serializer = $this->serializer;
        $ediOrders = $this->entityManager->getRepository('EICEdiBundle:Document')->findJsonOrdersToBeValidated();

        $validatedArray =[];

        /* @var $ediOrder Document */
        foreach($ediOrders as $ediOrder){
            $jsonOrder = $ediOrder->getJsonOrder();
            /* @var $order SalesOrderHeader */
            $order = $serializer->deserialize($jsonOrder, 'EIC\SalesBundle\Entity\SalesOrderHeader', 'json');
            $co = $ediOrder->getCoNumber();
            $swOrder = $this->entityManager->getRepository('EICSalesBundle:Order')->findOneBy(['orderNumber'=>$co]);
            if(!empty($swOrder)){
                $validated = true;
                /* @var $lineItem SalesOrderItem */
                foreach($order->getLineItems() as $lineItem){
                    $lineNumber = $lineItem->getLineNumber();

                    $isLineNumberItems = $swOrder->getOrderItems()->filter(function($swLineItem) use ($lineNumber){
                        /* @var $swLineItem OrderItem */
                        return $swLineItem->getLineNumber() == $lineNumber ? true : false;
                    });

                    if($isLineNumberItems->count() < 1){
                        $validated = false;
                        $this->importService->importNewSingleOrderItem($order, $lineItem);
                        continue 2;
                    }else{
                        $validatedArray[] = $co;
                    }
                }

                if($validated == true){
                    $emailCusts = [
                        4267,
                        3017,
                        4436,
                        4068,
                        3054,
                        4214
                    ];

                    $validatedArray = array_unique($validatedArray);
                    $ediOrder->setIsSwOrderValidated(true);
                    $this->entityManager->flush();

                    $custNum = $ediOrder->getCustomerNumber();

                    if(in_array($custNum, $emailCusts)){
                        $orderArr = json_decode($jsonOrder, true);
                        $render = $this->twig->render('@EICEdi/Default/simple.order.html.twig', ['order'=>$orderArr, 'coNumber'=>$ediOrder->getCoNumber()]);

                        $message = \Swift_Message::newInstance('New Order Imported')
                            ->setFrom(['donotreply@eipump.com'=>'EI Central'])
                            ->setTo([
                                'twatkins@eipump.com'=> 'Trent Watkins',
                                'mdye@eipump.com'=> 'Marie Dye',
                                'cricci@eipump.com'=> 'Charlotte Ricci',
                                'fhammond@eipump.com'=> 'Fred Hammond',
                            ])
                            ->setBody($render, 'text/html');
                            ;

                        $result = $this->mailer->send($message);
                    }


                }
            }
        }

        return 'The following orders have been validated:'."\n".implode(',', $validatedArray);

    }

}

任何帮助将不胜感激。谢谢

标签: php

解决方案


代码期望$order变量是EIC\SalesBundle\Entity\SalesOrderHeader类的对象和实例。

在这里,您有todo评论说此函数可以返回null所需的对象。“ToDo”表示代码必须稍后完成 如果为null,则$order = $this->serializeDocumentToEic($document);// ToDo if $order is not SalesOrderHeader Class email and continue 不应调用函数在调用函数之前在代码中添加验证validateOrder $order$valid = $this->validateOrder($order); //line 70

if ($order === null || (is_object($order) && !instanceof EIC\SalesBundle\Entity\SalesOrderHeader) ( {
    // send email as TODO says and 
    continue;
}

推荐阅读