首页 > 解决方案 > CakePHP 4.2 Annotate:不正确的应用程序命名空间

问题描述

我正在使用 CakePHP 4.2 版,并注意到与 API 捆绑在一起的注释脚本的一些奇怪行为。对于一个组件,注释脚本希望默认为 CakePHP 的默认 App\ 域。我已更改应用程序名称,因此大多数其他类默认为正确的应用程序名称。但不是这一脚本,到目前为止,仅适用于这一文件。

我在下面包含了组件的主体,以供审查。可以看到@method 注解使用了 App\ 域。当我使用 PHPStan 分析我的代码时,麻烦就来了。如果我保留注释,PHPStan 会告诉我:

 ------ -------------------------------------------------------------------------------------------------------------------------------------------------------------- 
  Line   src/Controller/Component/CartManagerComponent.php                                                                                                             
 ------ -------------------------------------------------------------------------------------------------------------------------------------------------------------- 
  43     Property Visualize\Controller\Component\CartManagerComponent::$Controller (Visualize\Controller\AppController) does not accept App\Controller\AppController.  
  44     Call to method loadModel() on an unknown class App\Controller\AppController.                                                                                  
          Learn more at https://phpstan.org/user-guide/discovering-symbols                                                                                            
 ------ -------------------------------------------------------------------------------------------------------------------------------------------------------------- 

该文件本身不会在任何地方使用 App\ 域。我不确定在哪里寻找脚本以找出问题所在。这是我的组件的主体,以防你看到我看不到的东西:

<?php
declare(strict_types=1);

namespace Visualize\Controller\Component;

use Authorization\Identity;
use Cake\Controller\Component;
use Cake\Log\Log;

/**
 * CartManager component
 *
 * @method \App\Controller\AppController getController()
 * @property \Visualize\Controller\AppController $Controller
 * @property \Visualize\Model\Table\CartsTable $Carts
 */
class CartManagerComponent extends Component
{
    /**
     * Default configuration.
     *
     * @var array
     */
    protected $_defaultConfig = [];

    /**
     * @var \Visualize\Controller\AppController
     */
    protected $Controller;

    /**
     * @var \Visualize\Model\Table\CartsTable
     */
    protected $Carts;

    /**
     * @param array $config The current configuration array
     * @return void
     */
    public function initialize(array $config): void
    {
        parent::initialize($config);
        $this->Controller = $this->getController();
        $this->Controller->loadModel('Carts');
    }

    /**
     * Returns the most recent active cart.
     *
     * @param \Authorization\Identity $user The User entity.
     * @return array|\Cake\Datasource\EntityInterface|null
     * @noinspection PhpUnnecessaryFullyQualifiedNameInspection
     */
    public function getUserCart(Identity $user)
    {
        $cart = $this->Controller->Carts->newEmptyEntity();
        if (!empty($this->Controller->Carts) && is_a($this->Controller->Carts, '\Visualize\Model\Table\CartsTable')) {
            $query = $this->Controller->Carts->find('userCart', ['user_id' => $user->getIdentifier()]);
            if (!$query->isEmpty()) {
                $cart = $query->first();
            } else {
                $cart->set('user_id', $user->getIdentifier());
                $this->Controller->Carts->save($cart);
            }
            if (is_object($cart) && is_a($cart, '\Cake\Datasource\EntityInterface')) {
                $session = $this->Controller->getRequest()->getSession();
                $session->write('Cart.id', $cart->id);
            }
        }

        return $cart;
    }

    /**
     * Abandons carts
     *
     * @param int $user_id The associated user ID
     * @param int $cart_id The current cart ID
     * @return void
     */
    public function pruneCarts(int $user_id, int $cart_id): void
    {
        if (!empty($this->Controller->Carts) && is_a($this->Controller->Carts, '\Visualize\Model\Table\CartsTable')) {
            // Find all the carts we didn't just create:
            $userCarts = $this->Controller->Carts->find('all', ['fields' => ['id', 'user_id', 'cart_status']])
                ->where([
                    'id !=' => $cart_id,
                    'user_id' => $user_id,
                    'cart_status' => 'active',
                ]);
            if (!$userCarts->isEmpty()) {
                $count = 0;
                foreach ($userCarts as $cart) {
                    if ($count < 5) {
                        $record = $this->Controller->Carts->newEmptyEntity();
                        $record = $this->Controller->Carts->patchEntity($record, $cart->toArray());
                        $record->set('id', $cart->id);
                        $record->set('cart_status', ABANDONED_CART);
                        if (!$this->Controller->Carts->save($record)) {
                            Log::alert('Error abandoning cart');
                        }
                    } else {
                        $this->Controller->Carts->delete($cart);
                    }
                    $count++;
                }
            }
        }
    }
}

标签: cakephpnamespacesannotate

解决方案


推荐阅读