首页 文章

Symfony Cache InvalidArgumantException

提问于
浏览
2

我需要帮助理解symfony缓存组件 . 我从其他程序员继承了symfony表单的脚本来创建一个项目 . 这个:

class OfferController extends Controller
{
    public function createAction(Request $request) {
        $api_offer = $this->get('gamexp_affiliates.api.admin.offer');
        $api_user = $this->get('gamexp_affiliates.api.admin.user');
        $api_project = $this->get('gamexp_affiliates.api.admin.project');
        $api_goal = $this->get('gamexp_affiliates.api.admin.goal');
        $tpl = '@GamexpAffiliates/Admin/Offer/Form/create.html.twig';

        $offer_webmasters = $offer_projects = $offer_goals = null;

        $sendCommonResponse = function(FormInterface $form = null, $code = 200, $headers = []) use ($tpl, &$offer_webmasters, &$offer_projects, &$offer_goals) {
            $params = [
                'offer_webmasters' => $offer_webmasters,
                'offer_projects' => $offer_projects,
                'offer_goals' => $offer_goals,
            ];
            $response = $this->render($tpl, $form ? array_merge([
                'offer' => $form->createView(),
            ], $params) : $params, new Response('', $code, $headers));
            return $response;
        };

        $selectProject = function($project_id) use ($api_project, &$offer_projects, &$projects_sort, &$projects_count) {
            $project = null;
            if ($project_id > 0 && is_numeric($project_id)) {
                foreach ($offer_projects as $offer_project) {
                    if ($project_id == $offer_project['id']) {
                        $project = $offer_project;
                        break;
                    }
                }
                if (!$project) {

                    try {
                        if ($project = $api_project->findProjectByIdWithLandings($project_id, ['id', 'name', 'status'])) {
                            if ($projects_count <= $cnt = count($offer_projects)) {
                                $offer_projects = array_slice($offer_projects, $cnt - $projects_count + 1, $projects_count);
                            }
                            $offer_projects = array_merge($offer_projects, [$project]);
                            if ($projects_sort) {
                                usort($offer_projects, function(array $a, array $b) use ($api_project, $projects_sort) {
                                    foreach ($projects_sort as $field => $sort_type) {

                                        if ($comp = $sort_type === $api_project::SORT_ASCENDING ? strnatcmp($a[$field], $b[$field]) : strnatcmp($b[$field], $a[$field])) {
                                            return $comp;
                                        }
                                        continue;
                                    }
                                    return 0;
                                });
                            }
                        }
                    } catch (\Exception $e) {
                        $this->get('logger')->error("Ошибка: " . $e->getMessage() . "на строке: " . $e->getLine());
                    }
                }
            }
            return $project;
        };

        $createForm = function($data, $project = null, $landings = null) use ($api_offer, &$offer_webmasters, &$offer_projects, &$offer_goals) {
            $params = [
                'action' => $this->generateUrl('gamexp_affiliates.admin.api.offer.create'),
                'statuses' => $api_offer->getAvailableStatuses($landings ? array_unique(array_column($landings, 'status')) : null),
                'offer_webmasters' => $offer_webmasters,
                'offer_projects' => $offer_projects,
                'offer_goals' => $offer_goals,
            ];
            if ($project && !empty($project['landings'])) {
                $params['offer_landings'] = $project['landings'];
            }

            return $this->createForm(AdminOfferCreateType::class, $data, $params);
        };

        try {
            if (!$offer_webmasters = $api_user->findAll(null, 10, 0, ['id', 'email', 'phone'])) {
                return $sendCommonResponse();
            }
        } catch (\Exception $e) {
            return $sendCommonResponse();
        }

        try {
            if (!$offer_projects = $api_project->findAllProjectsWithLandingsAndUser(null, 10, 0, ['id', 'name', 'status'])) {
                return $sendCommonResponse();
            }
        } catch (\Exception $e) {
            return $sendCommonResponse();
        }

        try {
            if (!$offer_goals = $api_goal->findAllItems(null, 10, 0, ['id', 'name', 'revshare', 'status'])) {
                return $sendCommonResponse();
            }
        } catch (\Exception $e) {
            return $sendCommonResponse();
        }

        $fast_mode = false;
        if ($request->isMethod('GET')) {

            $fast_mode = (0 < $project_id = $request->get('project') and is_numeric($project_id)); 
        } else {
            $project_id = null;
        }

        if ($project = $selectProject($project_id)) {
            $data = [
                'project' => $project['id'],
            ];
        } else {
            $data = null;
        }

        $form = $createForm($data, $project);

        $form->handleRequest($request);
        if ($form->isSubmitted()) {
            if (!$request->isXmlHttpRequest()) {
                throw $this->createNotFoundException();
            }

            if (!$request->isMethod('POST')) {
                throw $this->createHttpException(405);
            }

            $data = $form->getData();


            $landings = [];
            if ($project = $selectProject(isset($data['project']) ? $data['project'] : null)) {
                if (!empty($data['landings']) && !empty($project['landings'])) {
                    $data['landings'] = array_intersect($data['landings'], array_column($project['landings'], 'id'));

                    foreach ($project['landings'] as $landing) {
                        if (in_array($landing['id'], $data['landings'])) {
                            $landings[$landing['id']] = $landing;
                        }
                    }
                }
            }
            $form = $createForm($data, $project, $landings);
            $form->handleRequest($request);
            $data = $form->getData();

            if ($form->isValid()) {
                if ($res = $this->linkApiResponseToForm($form, function(FormInterface $form, array $params) use ($api_offer, $data, $sendCommonResponse) {
                    if (in_array('project_selection', $params['validation_groups']) || in_array('landings_selection', $params['validation_groups']) || in_array('header_image_upload', $params['validation_groups'])) {
                        if (in_array('header_image_upload', $params['validation_groups'])) {
                            if (isset($data['header_image']) && $data['header_image'] instanceof UploadedFile) {
                                $api_offer->saveHeaderImage($data['header_image']);
                            }
                        }
                        return $sendCommonResponse($form, 300, [
                            'Location' => $this->generateUrl('gamexp_affiliates.admin.api.offer.create'),
                        ]);
                    }
                    $data['creator'] = $this->getUser()->getId();
                    if ($id = (int)$api_offer->createOffer($data)) {
                        return new JsonResponse([
                            'id' => $id,
                            'name' => trim($data['name']),
                        ], 201, [
                            'Location' => $this->generateUrl('gamexp_affiliates.admin.api.offer.update', ['id' => $id]),
                        ]);
                    }
                })) {
                    return $res;
                }
            }
            return $sendCommonResponse($form, 400);
        } elseif ($fast_mode && !$data['project']) {
            $this->addFlash($form->getName().':warning', 'Проекта, который вы выбрали, не существует. Возможно кто-то другой его только что удалил. Попробуйте выбрать другой проект из списка.');
        }

        return $sendCommonResponse($form);
    }
}

我有这个例外:

request.CRITICAL:未捕获的PHP异常的Symfony \元器件\缓存\异常\ InvalidArgumentException:“高速缓存密钥长度必须大于零”在/home/ruslan/Projects/partners_prod/cache/prod/classes.php线1747 {“异常“:”[对象](Symfony的\元器件\缓存\异常\ InvalidArgumentException(代码:0):高速缓存密钥长度必须大于零在/home/ruslan/Projects/partners_prod/cache/prod/classes.php:1747) “} []

而且只有在我处于 生产环境 环境时才会发生这种情况 . 在开发中所有工作都很好!最初页面加载正常,但后来我得到ajax请求发生一些额外的数据异常 . 当我使用debuger进行代码时它在$ form-> isSubmited()点失败 . 在$ form-> handelRequest()方法之后 . 这个例外的意思是什么?我没有添加缓存任何键!这个怎么运作?我非常需要知道此异常的基本问题 . 请帮帮我吧 . 非常感谢您的帮助!

1 回答

  • 0

    好 . 最后我在两天后找到了解决方案 . 也许它将来会帮助别人 . 问题出在形式上 . 正是在约束中 . 这就像表单提交,但表单根本无效 . 对于每个字段,symfony在缓存中都有某种键,但它不是缓存值 . 如果字段是必需的但不存在,则会触发异常 . 因为在这种情况下,键是空字符串 . 在我选择了所有的nesessary字段后,它工作得很好 .

相关问题