gpt4 book ai didi

php - Laravel:无法声明类 App\Models\Customer,因为该名称已被使用

转载 作者:行者123 更新时间:2023-12-03 17:07:10 27 4
gpt4 key购买 nike

我有点困惑。我在我的用户(实际上是“客户”)模型上有一个简单的方法来返回用户的订阅续订日期:

public function subscriptionRenewalDate() : string
{
$subscription = $this->subscriptions()->active()->first()->asStripeSubscription();

return Carbon::createFromTimeStamp($subscription->current_period_end)->format('F jS, Y');
}
我从 Blade 模板( {{ auth()->user()->subscriptionRenewalDate() }} )和 对经过身份验证的用户调用此方法它在本地工作正常 ,但是一旦我将它上传到远程登台服务器,它就会失败并显示错误:

Cannot declare class App\Models\Customer, because the name is already in use


它指向 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() 引起的.如果我从方法中删除它, Blade 模板加载正常(一切正常)。
需要明确的是,我可以成功(这是本地、远程和 Travis CI):
  • 在 Laravel 注册
  • 登录 Laravel
  • 重设密码
  • 更新我的个人资料
  • 输入付款信息以订阅 Stripe 订阅
  • 查看和修改我的 Stripe 订阅
  • 在 Stripe.com 上查看我的所有客户和订阅信息
  • 编辑我在 Stripe.com 上的信息并查看通过我服务器上的 webhook 更新的信息

  • 唯一出现问题的时候是 asStripeSubscription()出现在代码中。它仅在远程服务器上。在本地,即使这样也能正常工作。
    我试过将此调用移至各种模型。我试过从 Controller 调用它并将结果传递给 View 。我什至尝试重新启动服务器并清除 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: Cannot declare class App\Models\Customer, because the name is already in use {"userId":1127215,"exception":"[object] (Symfony\Component\ErrorHandler\Error\FatalError(code: 0): Cannot declare class App\Models\Customer, because the name is already in use at /var/app/current/app/Models/Customer.php:13)[stacktrace]


    enter image description here

    最佳答案

    我找到了解决方案。我不知道这一点,但这基本上是一个与 ENV 变量相关的缓存问题,以及我如何传入这些变量。
    使用我们的 Elastic Beanstalk 临时服务器,我通过 .ebextensions 文件夹中的 .config 文件声明环境变量。例如:

    option_settings:
    "aws:elasticbeanstalk:application:environment":
    APP_NAME: Membership
    APP_ENV: production
    ...
    这在大多数情况下都非常有效。您可以在 AWS 中查看变量,大多数应用程序将完全按预期工作。
    但是在这种情况下,我需要确保我运行了 php artisan config:cache作为部署的一部分(感谢@DimitriMostrey)。如果您这样做……它会忽略您传递给 Elastic Beanstalk 的 ENV 变量!呵呵。
    我不知道为什么,因为您可以轻松确认您的应用程序能够读取 env('DB_HOST')等等,但它实际上无法使用它们连接到您的数据库或其他任何东西。
    如果你不运行 config:cache然后收银员不能按预期工作(给出完全令人困惑的错误)。
    所以我将我的生产环境变量从 .config 文件移动到他们自己的 .env 文件,然后使用命令将该文件重命名为 .env部署期间。
    现在一切都按预期进行。
    对于 Travis CI,情况类似:我将重要的环境变量移至 .env.travis然后确保我运行了 config:cache.travis.yml .
    在 Travis CI 中,现在一切都按预期进行。
    我不知道 Elastic Beanstalk 环境变量的处理方式与 .env 文件中的环境变量不同……但我不会很快忘记!

    关于php - Laravel:无法声明类 App\Models\Customer,因为该名称已被使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66643550/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com