App\Http\Controllers\Forum\TopicsController::show PHP Method

show() public method

public show ( $id )
    public function show($id)
    {
        $postStartId = Request::input('start');
        $postEndId = get_int(Request::input('end'));
        $nthPost = get_int(Request::input('n'));
        $skipLayout = Request::input('skip_layout') === '1';
        $jumpTo = null;
        $topic = Topic::with(['forum.cover', 'pollOptions.votes', 'pollOptions.post'])->findOrFail($id);
        priv_check('ForumView', $topic->forum)->ensureCan();
        $posts = $topic->posts();
        if ($postStartId === 'unread') {
            $postStartId = Post::lastUnreadByUser($topic, Auth::user());
        } else {
            $postStartId = get_int($postStartId);
        }
        if ($nthPost !== null) {
            $post = $topic->nthPost($nthPost);
            if ($post) {
                $postStartId = $post->post_id;
            }
        }
        if (!$skipLayout) {
            foreach ([$postStartId, $postEndId, 0] as $jumpPoint) {
                if ($jumpPoint === null) {
                    continue;
                }
                $jumpTo = $jumpPoint;
                break;
            }
        }
        if ($postStartId !== null && !$skipLayout) {
            // move starting post up by ten to avoid hitting
            // page autoloader right after loading the page.
            $postPosition = $topic->postPosition($postStartId);
            $post = $topic->nthPost($postPosition - 10);
            $postStartId = $post->post_id;
        }
        if ($postStartId !== null) {
            $posts = $posts->where('post_id', '>=', $postStartId);
        } elseif ($postEndId !== null) {
            $posts = $posts->where('post_id', '<=', $postEndId)->orderBy('post_id', 'desc');
        }
        $posts = $posts->take(20)->with('topic')->with('user.rank')->with('user.country')->with('user.supports')->get()->sortBy('post_id');
        if ($posts->count() === 0) {
            abort($skipLayout ? 204 : 404);
        }
        $postsPosition = $topic->postsPosition($posts);
        $pollSummary = PollOption::summary($topic, Auth::user());
        Event::fire(new TopicWasViewed($topic, $posts->last(), Auth::user()));
        $template = $skipLayout ? '_posts' : 'show';
        $cover = json_item($topic->cover()->firstOrNew([]), new TopicCoverTransformer());
        $isWatching = TopicWatch::check($topic, Auth::user());
        return view("forum.topics.{$template}", compact('cover', 'isWatching', 'jumpTo', 'pollSummary', 'posts', 'postsPosition', 'topic'));
    }