如何将动作处理转发给 Laravel 控制器中的第二个动作?

How to forward action processing to a second action in Laravel Controllers?

我有两个相似的用户配置文件,它们共享几乎相同的视图结构和信息。但是,"special user profile" 会显示一个额外的块,并且需要不同的 URL - 例如,/user/igor/special-user/igor.

处理此问题的最佳方法是什么?

在其他框架中,我会有类似这样的伪代码:

class UserController extends Controller {

    /** @url /user/{$slug} */
    function actionSimpleUser($slug) {
        if (!$this->viewHas('special')) {
            $this->toView('special', false);
        }
        return $this->render('user', ['slug' => $slug]);
    }

    /** @url /special-user/{$slug} */
    function actionSpecialUser($slug) {
        $this->toView('special', true);
        return $this->forwardAction('user/simpleUser', [$slug]);
    }
}

在 Laravel.

中,您可以通过多种方式实现这一点

你可以有 2 个路由进入 2 个控制器操作:

Route::get('/user/{slug}', 'UserController@userProfile');
Route::get('/special-user/{slug}', 'UserController@specialUserProfile');

然后在这些控制器操作中,您可以呈现相同的视图并设置一个标志以将其标记为特殊或非特殊:

public function userProfile($slug)
{
    $user = User::where('slug', $slug)->first();
    $special = false;
    return view('users.show', compact('user', 'special');
}

public function specialUserProfile($slug)
{
    $user = User::where('slug', $slug)->first();
    $special = true;
    return view('users.show', compact('user', 'special');
}

然后在视图文件中检查用户是否特殊:

@if($special === true)
    // special user code block
@endif