Symfony3.4: ошибка типа: аргумент 1, переданный в … должен иметь тип string, заданный null, вызываемый в

#php #symfony

#php #symfony

Вопрос:

В Symfony3.4 при поддержке автоматического подключения возникла следующая ошибка.
Я получил следующую ошибку. Я только что переписал container->get ('doctrine') .
Я думаю, что вы можете подключиться к БД, потому что это ошибка, возникшая после входа в систему.
Есть ли что-нибудь, что вы можете придумать?

https://symfony.com/doc/3.4/service_container/3.3-di-changes.html

Ошибка

 Type error: Argument 1 passed to 
AppAhiSpCommonBundleModelServiceAmcService::getShopMemberCount()
must be of the type string, null given, called in 
/home/vagrant/Symfony2/src/Ahi/Sp/AdminBundle/Model/Service/AnalyticsService.php on line 885
  at src/Ahi/Sp/CommonBundle/Model/Service/AmcService.php:195
  at AppAhiSpCommonBundleModelServiceAmcService->getShopMemberCount(null)
     (src/Ahi/Sp/AdminBundle/Model/Service/AnalyticsService.php:885)
  at AppAhiSpAdminBundleModelServiceAnalyticsService->getAmcMemberCountPerMonth(object(DateTime), null)
     (src/Ahi/Sp/AdminBundle/Model/Service/AnalyticsService.php:811)
  at AppAhiSpAdminBundleModelServiceAnalyticsService->getAmcMemberSummary()
     (src/Ahi/Sp/AdminBundle/Controller/Hq/DefaultController.php:68)
  at AppAhiSpAdminBundleControllerHqDefaultController->indexAction(object(EcStaffDataService), object(EcArticleDataService), object(ArticleService), object(AnalyticsService), object(PostService), object(KeepRequestService))
     (vendor/symfony/symfony/src/Symfony/Component/HttpKernel/HttpKernel.php:151)
  at SymfonyComponentHttpKernelHttpKernel->handleRaw(object(Request), 1)
     (vendor/symfony/symfony/src/Symfony/Component/HttpKernel/HttpKernel.php:68)
  at SymfonyComponentHttpKernelHttpKernel->handle(object(Request), 1, true)
     (vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Kernel.php:200)
  at SymfonyComponentHttpKernelKernel->handle(object(Request))
     (web/app_dev.php:37)
 

AmcService.php

     protected $entityManager;

    /**
     * @param ContainerInterface $container
     * @param EntityManagerInterface $entityManager
     */
    public function __construct(ContainerInterface $container, EntityManagerInterface $entityManager)
    {
        $this->container = $container;
        $this->entityManager = $entityManager;
        parent::__construct($container, $entityManager);
    }

    /**
     * Obtain the number of registered members of the store specified by ID and year / month.
     *
     * @param string $ahiStoreId Store ID
     *               If the AHI store ID is not specified, all stores other than EC members will be covered.
     * @param string $yyyymm Year month Example)"201301"
     *
     * @param string $yyyymmTo Year month Example)"201301"
     *
     * @return int Returns the number of registered members of the store for the specified date.
     */
    //line 195
    public function getShopMemberCount(string $ahiStoreId, $yyyymm=null, $yyyymmTo=null)
    {
        $monthCondition = "";
        if ($yyyymm amp;amp; $yyyymmTo) {
            $from = substr($yyyymm, 0, 4) . '-' . substr($yyyymm, 4, 2) . '-01';
            $to = substr($yyyymmTo, 0, 4) . '-' . substr($yyyymmTo, 4, 2) . '-01';
            $monthCondition = " AND m.member_entry_date >= '{$from}'"
                            . " AND m.member_entry_date < ADDDATE('{$to}', INTERVAL 1 MONTH)";
        }elseif($yyyymm){
            $date = substr($yyyymm, 0, 4) . '-' . substr($yyyymm, 4, 2) . '-01';
            $monthCondition = " AND m.member_entry_date >= '{$date}'"
                            . " AND m.member_entry_date < ADDDATE('{$date}', INTERVAL 1 MONTH)";
        }
        if (empty($ahiStoreId)) {
            $sql = "SELECT"
                 . " count(m.member_id) AS member_cnt"
                 . " FROM"
                 . " member m"
                 . " WHERE"
                 . " m.store_id != '99999999'"      // Non-EC registered members
                 . " AND m.member_deleted_flg = 0"  // I have not withdrawn
                 . " AND m.member_del = 0"          // Not deleted
                 . $monthCondition
            ;
        } else {
            $sql = "SELECT"
                 . " count(m.member_id) AS member_cnt"
                 . " FROM"
                 . " hq_store_table s"
                 . " INNER JOIN member m ON"
                 . " s.store_id = m.store_id"
                 . " AND m.member_deleted_flg = 0"  // I have not withdrawn
                 . " AND m.member_del = 0"          // Not deleted
                 . $monthCondition
                 . " WHERE"
                 . " ahi_store_id = '" . $ahiStoreId . "'"
            ;
        }
        $stmt = $this->entityManager->getConnection()->executeQuery($sql);
        while ($row = $stmt->fetch()) {
            return $row['member_cnt'];
        }
        return 0;
    }
 

услуги.yml

     AppAhiSpCommonBundleModelServiceAmcService:
      arguments:
        $entityManager: '@doctrine.orm.ec_entity_manager'
 

AnalyticsService.php

     public function getAmcMemberSummary($ahiStoreId=null): array
    {
        $summary = array();

        // Latest number
        $summary['latest'] = $this->getAmcMemberCountPerMonth(new DateTime('today'),$ahiStoreId);
    }
    private function getAmcMemberCountPerMonth(DateTime $date, $ahiStoreId=null)
    {
        $months = array();
        for ($i = 0; $i < 6; $i  ) {
            $month = clone($date);
            $month->modify("first day of -{$i} month");
            $months[] = $month;
        }

        $summary = array(
            //line 885
            'total' => $this->amcService->getShopMemberCount($ahiStoreId),
            'months' => array(),
        );
        foreach ($months as $month) {
            $summary['months'][] = array(
                'date' => $month,
                'count' => $this->amcService->getShopMemberCount($ahiStoreId, $month->format('Ym')),
            );
        }
        return $summary;
    }
 

Entitiy/Shop.php

     public function setAhiStoreId(string $ahiStoreId): Shop
    {
        $this->ahiStoreId = $ahiStoreId;

        return $this;
    }

    /**
     * Get ahiStoreId
     *
     * @return string
     */
    public function getAhiStoreId(): string
    {
        return $this->ahiStoreId;
    }
 

ShopRepository.php

     private function addSearchParams($queryBuilder, array $params)
    {
        if (isset($params["ahiStoreId"])) {
            $queryBuilder->andWhere("s.ahiStoreId = :ahiStoreId");
            $queryBuilder->setParameter("ahiStoreId", $params["ahiStoreId"]);
        }
    }
 

validation.yml

 AhiSpCommonBundleModelEntityShop:
        ahiStoreId:
            - Regex:
                pattern: "/^[0-9]{5}$/"
 

DefaultController.php

     public function indexAction(ArticleService $articleService, AnalyticsService $analyticsService): array
    {
        //line 68
        $amcMemberSummary = $analyticsService->getAmcMemberSummary();
    }
 

Комментарии:

1. Где getAmcMemberCountPerMonth вызывается во время этого выполнения?

2. Ошибка очевидна, вы пытаетесь передать значение null вместо значения not null string

3. @El_Vanja Спасибо за ваш комментарий. Пожалуйста, проверьте обновленную службу аналитики.

4. $ahiStoreId кажется, остается нулевым. Проследите всю трассировку стека, где этот параметр был передан изначально?

5. @El_Vanja я вижу. Это из-за $ahiStoreId . Добавлен код, связанный с трассировкой стека и $ahiStoreId . Части сущности и репозитория не изменились с момента перехода на автоматическую проводку. Есть ли что-нибудь, что мне нужно изменить?