【问题标题】:Data not passed correctly from Laravel controller to blade view **ONLY IN PRODUCTION**数据未从 Laravel 控制器正确传递到刀片视图**仅在生产中**
【发布时间】:2021-10-11 22:55:09
【问题描述】:
//profile.blade.php

<form action="{{ $isFollowing ? route('unfollow', $user->username) : route('follow', $user->username) }}" method="post">
    @csrf
    <button type="submit">{{ $isFollowing ? 'Unfollow' : 'Follow' }}</button>
</form>
// ProfileController.php

public function index()
{
    $reqUsername = request()->route()->parameter('username');

    $user = User::where('username', $reqUsername)
        ->with(['followers', 'records' => function($query) {
            $query->with('likes');
        }])
        ->firstOrFail();

    if ($user->followers->count()) {
        foreach ($user->followers as $follower) {
            $isFollowing = $follower->id == auth()->id();
        }
    } else {
        $isFollowing = false;
    }

    return view('users.profile', [
        'user' => $user,
        'isFollowing' => $isFollowing
    ]);
}

我最近在将 Laravel 应用程序部署到 Heroku 时遇到了问题。请注意,直到最近,这在生产中一直运行良好。上面的 sn-ps 在使用 Laravel Valet 的开发中仍然可以正常工作;但是,在生产环境中,$isFollowing 变量始终以 bool(false) 的形式返回到视图中,无论数据是否显示我们所在的用户正在被当前经过身份验证的用户关注。

到目前为止我尝试过的事情;

  1. dd($isFollowing) 在生产中。我希望当我们到达路线时这会显示真或假,在生产中,我看到假前有一个插入符号 => ^ False

  2. 显式设置所有条件值和比较,即if ($user-&gt;followers-&gt;count() &gt; 0) 而不是if ($user-&gt;followers-&gt;count())

我目前正在研究的内容;

  1. 可能是对某个 composer 包(或 PHP/Laravel/Composer 版本)的更新导致了这个问题吗?我自己没有对这些进行任何更改,所以这可能是 Heroku 的自动更新?

在此先感谢您对此问题的任何帮助。

【问题讨论】:

  • 您能否确认dd 的任何其他变量或静态值转储为^
  • 我可以确认插入符号在其他变量中也很明显。示例dd($user-&gt;username) 转储^ "my_username"
  • 在您错误地添加^ 的任何文件中。尝试在整个项目中查找。希望对您有所帮助。
  • 不幸的是,没有。就像我在 OP 中解释的那样,这个问题只在生产服务器上很明显,$isFollowing 变量是应用程序中唯一没有拉到视图的数据。这让我认为dd() 中的插入符号问题不会导致问题,因为其他数据(例如用户和关注者数量)正常。我不知道是什么原因造成的。
  • 如果这有一段时间有效,但不再有效,那么发生了什么变化?你升级了 PHP 版本,或者 Laravel 版本,或者那个服务器上的其他任何东西?

标签: php laravel heroku composer-php laravel-blade


【解决方案1】:

所以,我没有弄清楚是什么导致了这个错误,但是对我的控制器代码稍作改动似乎已经解决了这个问题。

public function index()
{
    $reqUsername = request()->route()->parameter('username');

    $user = User::where('username', $reqUsername)
        ->with(['followers', 'records' => function($query) {
            $query->with('likes');
        }])
        ->firstOrFail();

        return view('users.profile', [
            'user' => $user,
            'isFollowing' => $user->followers->contains('id', auth()->id())
        ]);
    }

【讨论】:

  • 当你循环你的变量时,它可能首先使它成为真,然后又成为假。所以一旦你发现它是真的,你就需要打破它。
  • 我想你已经明白了。随着用户数量的增加,这个问题似乎才成为一个问题。重构为使用 $user-&gt;followers-&gt;contains 已解决此问题。谢谢。
猜你喜欢
  • 2017-09-03
  • 2019-11-13
  • 2019-04-13
  • 1970-01-01
  • 1970-01-01
  • 2016-06-25
  • 1970-01-01
  • 2019-04-15
  • 2019-01-12
相关资源
最近更新 更多