バージョン選択

フォーラム

メニュー

オンライン状況

66 人のユーザが現在オンラインです。 (53 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 66
もっと...

サイト内検索

質問 > フロント機能 > app.user 或いは getUser() で新規追加したリレーションEntityを取得させたい

フロント機能

新規スレッドを追加する

フラット表示 前のトピック | 次のトピック
投稿者 スレッド
nicky
投稿日時: 2021/3/26 1:32
対応状況: −−−
新米
登録日: 2021/3/26
居住地:
投稿: 5
app.user 或いは getUser() で新規追加したリレーションEntityを取得させたい
▼テンプレート
[EC-CUBE] 4.0を新規インストール
[レンタルサーバ] SAKURA VPSの最小構成
[OS] CentOS 8
[PHP] 7.3.27
[データベース] Ver 14.14 Distrib 5.7.33
[WEBサーバ] Apache/2.4.6
[ブラウザ] Google Chrome 89.0.4389.90(Official Build) (64 ビット)
[導入プラグインの有無] なし
[カスタマイズの有無] 既存Entiryへフィールド追加、新規Entityを作成(後述します)
[現象]
既存のユーザ情報に、新たな付加情報を追加しようと考えています。
Customerテーブルにフィールドを追加するだけに留めようと思いましたが、
Customerテーブルと OneToOne で紐づく別テーブル(CustomerChild)を追加する事に致しました。
※それとは別途、Customerテーブルへフィールドを追加しております。

ドキュメント等を見ながら、CustomerChildEntityの作成とそれに伴うテーブルの作成までは出来ました。
手動で、DBのCustomerChildテーブルにデータを登録し、EC-CUBE側での取得が正しく行えているかどうか検証したところ
Controller内での getUser() 及び、Templateでの app.user のどちらもデータが取得できませんでした。
正確には、プロパティ自体は存在しているが中身が NULL という状態です。

対応手順としましては以下の通りです。
長文で恐縮ですが、出来るだけ詳細をお伝えさせて頂きたく思います。


1.先にCustomerへのフィールドを追加しました。
・Customize/Entity/CustomerTrait.php を作成
    /**
     * @ORM\Column(name="test_msg", type="string", nullable=false)
     * @Eccube\FormAppend
     * @Assert\NotBlank(message="入力してください。")
     */
    private $test_msg;

    /**
     * @return string
     */
    public function getTestMsg()
    {
      return $this->test_msg;
    }

    /**
     * @param string|null $test_msg
     * @return Customer
     */
    public function setTestMsg($test_msg)
    {
      $this->test_msg = $test_msg;
      return $this;
    }
 このタイミングで一度、doctrine:schema:update を実行してフィールド追加を確認しました。


2.CustomerにOneToOneで紐づくCustomerChildのEntityを作成しました
  リレーションに関わる部分のみ抜粋です、コンストラクタ無し、他の処理は全てプロパティの getter / setter です
  同じOneToOne構成の src/Eccube/Entity/ProductClass 及び src/Eccube/Entity/TaxRule を参考にしました。
  なお、JoinColumnで指定している customer_id はプロパティ及び getter / setter は全て未定義です
  (参考にしたEntityでも同様の未定義状況でした)

    /**
     * @var \Eccube\Entity\Customer
     *
     * @ORM\OneToOne(targetEntity="Eccube\Entity\Customer", inversedBy="CustomerChild")
     * @ORM\JoinColumns({
     *  @ORM\JoinColumn(name="customer_id", referencedColumnName="id")
     * })
     */
    public $Customer;

    /**
     * Set customer.
     *
     * @param \Eccube\Entity\Customer|null $customer
     *
     * @return CustomerChild
     */
    public function setCustomer(\Eccube\Entity\Customer $customer = null)
    {
      $this->Customer = $customer;
      return $this;
    }

    /**
     * Get customer.
     *
     * @return \Eccube\Entity\Customer|null
     */
    public function getCustomer()
    {
      return $this->Customer;
    }


3.手順1で作成した CustomerTrait にリレーションの定義を追加しました
  追記部分のみ抜粋です
   /**
    * @var \Customize\Entity\CustomerChild
    *
    * @ORM\OneToOne(targetEntity="\Customize\Entity\CustomerChild", mappedBy="Customer", cascade={"persist","remove"})
    */
   private $CustomerChild;

   /**
    * Set customerChild.
    *
    * @param \Customize\Entity\CustomerChild|null $customerChild
    *
    * @return Customer
    */
   public function setCustomerChild(\Customize\Entity\CustomerChild $customerChild = null)
   {
     $this->CustomerChild = $customerChild;
     return $this;
   }

   /**
    * Get customerChild.
    *
    * @return \Customize\Entity\CustomerChild|null
    */
   public function getCustomerChild()
   {
     return $this->CustomerChild;
   }

4.追加 Entity 用の CustomerChildRepository を作成しました
   /**
    * CustomerChildRepository constructor.
    *
    * @param RegistryInterface $registry
    * @param Queries $queries
    * @param EntityManagerInterface $entityManager
    * @param EccubeConfig $eccubeConfig
    */
   public function __construct(
     RegistryInterface $registry,
     Queries $queries,
     EntityManagerInterface $entityManager,
     EccubeConfig $eccubeConfig
   ) {
     parent::__construct($registry, CustomerChild::class);
     $this->queries = $queries;
     $this->entityManager = $entityManager;
     $this->eccubeConfig = $eccubeConfig;
   }

   public function newCustomerChild()
   {
     $CustomerChild = new \Customize\Entity\CustomerChild();
     return $CustomerChild;
   }

   /**
    * Remove CustomerChild
    *
    * @param \Customize\Entity\CustomerChild $CustomerChild
    */
   public function delete($CustomerChild)
   {
     $em = $this->getEntityManager();
     $em->remove($CustomerChild);
     $em->flush($CustomerChild);
   }

5.doctrine:schema:update を実行し、新規テーブルに手動でデータを追加
  新規 Entity の定義に伴い、DBに新規テーブル「dtb_customer_child」が作成されました。
  phpMyAdminで直接、dtb_customer_child に既存の Customer データと紐づく情報を書き加えました。
  「select * from dtb_customer inner join dtb_customer_child on dtb_customer.id = dtb_customer_child.customer_id」のクエリで
  データが取得できることまで確認しました。

6.Contoller にて以下の処理を実行したが、中身はNULLだった
  /**
   * @Route("/", name="homepage")
   * @Template("top.twig")
   */
  public function index()
  {
    $Customer = $this->getUser();
    $CustomerChild = $Customer->getCustomerChild();
    dump($CustomerChild);
    return [];
  }

7.Template にて以下の処理を実行したが、中身は同様にNULLだった
  dump( app.user.customerChild )

---

以上、誤りもしくは不足部分等ありましたらご指摘頂けますでしょうか。
宜しくお願い致します。
フラット表示 前のトピック | 次のトピック


題名 投稿者 日時
 » app.user 或いは getUser() で新規追加したリレーションEntityを取得させたい nicky 2021/3/26 1:32
     Re: app.user 或いは getUser() で新規追加したリレーションEntityを取得させたい tsuji 2021/3/26 9:38
       Re: app.user 或いは getUser() で新規追加したリレーションEntityを取得させたい nicky 2021/3/26 20:51

 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は88,306名です
総投稿数は109,692件です

投稿数ランキング

1
seasoft
7365
2
468
3217
3
AMUAMU
2712
4
nanasess
2303
5
umebius
2085
6
yuh
1818
7
h_tanaka
1610
8
red
1568
9
mcontact
1240
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
796
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.