Symfony缓存InvalidArgumantException
我需要帮助理解symfony缓存组件。我用symfony表单继承了其他程序员的脚本来创建一个项目。这:Symfony缓存InvalidArgumantException
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 line 1747 {“exception”:“[object] (Symfony \ Component \ Cache \ Exception \ InvalidArgumentException(code: 0):Cache key length在 处必须大于零/home/ruslan/Projects/partners_prod/cache/prod/classes.php:1747)“} []
而这只是当我在prod环境中发生。在开发一切工作正常!初始化页面加载正常,但然后我得到一个额外的数据异常发生的Ajax请求。当我用debuger进行代码时,它在$ form-> isSubmited()点失败。在$ form-> handelRequest()方法之后。这个例外的含义是什么?我没有添加缓存任何键!怎么运行的?我强烈需要知道这个例外的基本问题。帮助我,请将其放下。非常感谢您的帮助!
好的。最后我在两天后找到了解决方案。也许它会在未来帮助别人。问题在于形式。完全受到限制。这就像表单提交一样,但表单根本无效。对于每个字段,symfony在缓存中有某种关键,但它不是缓存值。如果字段是必需的但不存在,则触发异常。因为在这种情况下,键是空字符串。在我选择了所有必需的田地之后,它的运作良好。