php - 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);
}
}
任何帮助将不胜感激。谢谢
解决方案
代码期望$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;
}
推荐阅读
- triggers - 创建一个触发器来验证 Product 对象的数据
- angular - 使用 TestBed.CompileComponents().then() 的 Angular 最佳实践
- javascript - 从右到左的水平时间轴未按预期工作
- git - 从 git 拉取后 sh 脚本无法正常工作
- scala - 如何对齐无形记录?
- android-studio - 如何使用 Leaflet 和 OpenStreetMap 在 android studio 中实现地图?
- any - 查找最大值的 Shell 脚本。字符串中的数字
- c++ - 如何使用c ++获取win32中活动窗口的句柄?
- mysql - MySQL Docker 不允许来自另一个容器的连接
- c# - 从 Hex 更改为 Ascii 并拆分从串口接收到的数据