[EC-CUBE] 4.0.4
[レンタルサーバ] AWS EC2冗長化設定
[OS] Linux
[PHP] 7.3.*
[データベース] MySQL 5.7.*(RDS)
[WEBサーバ] Apache/2.4.*
[ブラウザ] Chrome
[セッション管理]PdoSessionHandler
[現象]
https://a-zumi.net/eccube4-url-slug/上記記事の商品詳細ページのSlug化を参考に致しましが商品一覧へアクセス時に下記エラーになってしまいます。
ProductConverter.phpからProductController.php間での値がうまく渡せてない気がします。
エラー内容
Eccube\Entity\Category object not found by the @ParamConverter annotation.
Slug化の変更点は以下になります。
なにとぞご教授お願いできないでしょうか
\app\Customize\Request\ProductConverter.php
/**
* 商品IDでも商品スラッグでも商品情報が取得できるようにする
*
* @param Request $request
* @param ParamConverter $configuration
* @return bool
* @throws \ReflectionException
*/
public function apply(Request $request, ParamConverter $configuration)
{
$id = $this->getIdentifier($request, $configuration->getOptions());
if (false === $id || null === $id) {
return false;
}
$slugCategory = [];
if($configuration->getName() === "product_list_slug_url"){
if($id){
if (is_numeric($id)) {
// カテゴリIDの場合
$slugCategory = $this->categoryRepository->getCategory($id);
} else {
// カテゴリスラッグの場合
$slugCategory = $this->categoryRepository->getCategoryIdFromSlugName($id);
}
}
if($slugCategory){
// リクエストにオブジェクトをセット
$class = $configuration->getClass();
$request->attributes->set((new \ReflectionClass($class))->getShortName(), $slugCategory);
return true;
}
}
return false;
}
/**
* nameの内容によってのParamConverterを適用
*
* @param ParamConverter $configuration
* @return bool
*/
public function supports(ParamConverter $configuration)
{
if($configuration->getName() === "product_detail"){
return true;
}
elseif($configuration->getName() === "product_list_slug_url"){
return true;
}
}
\app\Customize\Controller\ProductController.php
/**
* 商品カテゴリ商品一覧画面.
*
* @Route("/products/list/{id}", name="product_list_slug_url", methods={"GET"})
* @Template("Product/list.twig")
* @ParamConverter("Category", name="product_list_slug_url", class="Eccube\Entity\Category", options={"id" = "id"})
*
* @param Request $request
* @param Paginator $paginator
* @param Category $category
* @return array
*/
public function indexSlugUrl(Request $request, Paginator $paginator,Category $category)
{
return parent::indexSlugUrl($request,$paginator,$category);
}
\src\Eccube\Controller\ProductController.php
/**
* 商品一覧画面.
*
* @Route("/products/list/{id}", name="product_list_slug_url", methods={"GET"}, requirements={"id" = "\d+"})
* @Template("Product/list.twig")
* @ParamConverter("Category", options={"repository_method" = "getCategory"})
*
* @param Request $request
* @param Paginator $paginator
* @param Category $category
* @return array
*/
public function indexSlugUrl(Request $request, Paginator $paginator,Category $category)
\app\Customize\Twig\RoutingExtension.php
/**
* スラッグを持っている場合はスラッグのURLを生成、
* スラッグを持っていない場合はIDのURLを生成
*
* @param string $name
* @param array $parameters
* @param false $schemeRelative
* @return string
*/
public function getUrl($name, $parameters = [], $schemeRelative = false)
{
if ($name === "product_list") {
/** @var Category $category */
$category = $this->categoryRepository->getCategory($parameters["id"]);
if(!empty($category->getSlugName())) {
// スラッグを持っているURLを生成
return parent::getUrl("product_list", ["id" => $category->getSlugName()], $schemeRelative);
} else {
// スラッグを持っていないIDのURLを生成
return parent::getUrl("product_list", ["id" => $category->getId()], $schemeRelative);
}
}
return parent::getUrl($name, $parameters, $schemeRelative);
}
表示させたいSlugありURL
https://localhost/products/list/slugname