【发布时间】:2021-06-13 01:08:33
【问题描述】:
我有点困惑。我的用户(实际上是“客户”)模型有一个简单的方法来返回用户的订阅续订日期:
public function subscriptionRenewalDate() : string
{
$subscription = $this->subscriptions()->active()->first()->asStripeSubscription();
return Carbon::createFromTimeStamp($subscription->current_period_end)->format('F jS, Y');
}
我从刀片模板 ({{ auth()->user()->subscriptionRenewalDate() }}) 对经过身份验证的用户调用此方法,并且 它在本地工作正常,但是一旦我将它上传到远程登台服务器,它就会失败并出现错误:
无法声明类 App\Models\Customer,因为该名称已在使用中
它指向客户模型中的这一行:
class Customer extends Authenticatable
{
奇怪的是,它不仅仅是远程登台服务器,它也是 Travis CI 失败的地方(在运行 PHPUnit 测试时——这些相同的测试在本地运行良好)。
显然这似乎是某种缓存或配置问题,但我不明白会导致此错误的原因。
它与数据库无关,因为测试使用RefreshDatabase。如果我删除 ENV 变量 (CASHIER_MODEL: App\Models\Customer),它会因预期的“找不到模型用户”错误而失败,因此它正确获取了 ENV 变量。我已经尝试清除我的 Laravel 缓存 (php artisan optimize:clear) 和 composer dump-autoload。这很混乱。
我只知道这个错误是由asStripeSubscription() 引起的。如果我从方法中删除它,刀片模板加载正常(一切正常)。
明确地说,我可以成功(这是在本地、远程和 Travis CI 中):
- 在 Laravel 中注册
- 在 Laravel 中登录
- 重置我的密码
- 更新我的个人信息
- 输入付款信息以订阅 Stripe 订阅
- 查看和修改我的 Stripe 订阅
- 在 Stripe.com 上查看我的所有客户和订阅信息
- 在 Stripe.com 上编辑我的信息,并通过我服务器上的 webhook 查看更新
唯一的问题是asStripeSubscription() 出现在代码中。而且它只在远程服务器上。即使在本地也可以正常工作。
我已尝试将此调用移至各种模型。我尝试从控制器调用它并将结果传递给视图。我什至尝试重新启动服务器并清除 Travis CI 的缓存。错误依旧。
什么会导致asStripeSubscription() 产生这个错误?如果我可以在本地复制,我可以调试它!它固执地坚持在本地完美工作,但在远程失败。
我正在使用 Laravel 8、PHP 7.3 和 Cashier 12.10。
我无法理解导致Cannot declare class App\Models\Customer, because the name is already in use 错误的原因。
堆栈跟踪:
来自 Laravel.log:
[2021-03-22 10:29:23] production.ERROR:无法声明类 App\Models\Customer,因为名称已在使用中 {"userId":1127215,"exception":"[object] (Symfony\Component\ErrorHandler\Error\FatalError(代码:0):无法声明类 App\Models\Customer,因为该名称已在 /var/app/current/app/Models/Customer.php:13 中使用) [堆栈跟踪]
【问题讨论】:
-
你试过
composer dump-autoload吗?它可能会有所帮助 -
您是否将 Billable 特征添加到您的用户(客户)模型中?
-
@TomaszKisiel 与 Cashier 和 Stripe 相关的所有内容都能完美运行。我可以注册,添加订阅,按预期做所有事情。唯一出现问题的是使用
asStripeSubscription()时。所以是的,Billable 特征在 Customer 模型上。 -
@TomaszKisiel 我已经彻底清除了我的数据库。删除所有表,然后从头开始运行迁移。然后我再次注册并订阅,一切正常。然后我尝试访问一个调用
asStripeSubscription()的页面,它也可以正常工作。它只是在远程(托管服务器和 Travis CI)失败。 -
运行
php artisan config:cache可能会解决问题。在这种情况下,它确实是一个 laravel 缓存造成了冲突。将此与composer dump-autoload -o(或 --optimize)结合起来,作曲家解释为“优化 PSR0 和 PSR4 包以加载类映射,这对生产有好处。”
标签: php laravel stripe-payments laravel-cashier