www.gusucode.com > Flarum开源的PHP国外手机版论坛 0.1 Beta2 源码程序 > Flarum_v0.1.beta2/flarum/vendor/flarum/core/src/Api/Actions/Discussions/ShowAction.php

    <?php
/*
 * This file is part of Flarum.
 *
 * (c) Toby Zerner <toby.zerner@gmail.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Flarum\Api\Actions\Discussions;

use Flarum\Core\Discussions\DiscussionRepository;
use Flarum\Core\Posts\PostRepository;
use Flarum\Api\Actions\SerializeResourceAction;
use Flarum\Api\Actions\Posts\GetsPosts;
use Flarum\Api\JsonApiRequest;
use Tobscure\JsonApi\Document;

class ShowAction extends SerializeResourceAction
{
    use GetsPosts;

    /**
     * @var \Flarum\Core\Discussions\DiscussionRepository
     */
    protected $discussions;

    /**
     * @inheritdoc
     */
    public $serializer = 'Flarum\Api\Serializers\DiscussionSerializer';

    /**
     * @inheritdoc
     */
    public $include = [
        'startUser' => false,
        'lastUser' => false,
        'startPost' => false,
        'lastPost' => false,
        'posts' => true,
        'posts.user' => true,
        'posts.user.groups' => true,
        'posts.editUser' => true,
        'posts.hideUser' => true
    ];

    /**
     * @inheritdoc
     */
    public $link = ['posts', 'posts.discussion'];

    /**
     * @inheritdoc
     */
    public $limitMax = 50;

    /**
     * @inheritdoc
     */
    public $limit = 20;

    /**
     * @inheritdoc
     */
    public $sortFields = ['time'];

    /**
     * @inheritdoc
     */
    public $sort = ['time' => 'asc'];

    /**
     * Instantiate the action.
     *
     * @param DiscussionRepository $discussions
     * @param PostRepository $posts
     */
    public function __construct(DiscussionRepository $discussions, PostRepository $posts)
    {
        $this->discussions = $discussions;
        $this->posts = $posts;
    }

    /**
     * Get a single discussion, ready to be serialized and assigned to the
     * JsonApi response.
     *
     * @param JsonApiRequest $request
     * @param Document $document
     * @return \Flarum\Core\Discussions\Discussion
     */
    protected function data(JsonApiRequest $request, Document $document)
    {
        $discussionId = $request->get('id');
        $actor = $request->actor;

        $discussion = $this->discussions->findOrFail($discussionId, $actor);

        $discussion->posts_ids = $discussion->postsVisibleTo($actor)->orderBy('time')->lists('id');

        // TODO: Refactor to be simpler, and get posts straight from the
        // discussion's postsVisibleTo relation method.
        if (in_array('posts', $request->include)) {
            $prefixLength = strlen($prefix = 'posts.');

            $postRelations = array_filter(array_map(function ($relation) use ($prefix, $prefixLength) {
                return substr($relation, 0, $prefixLength) === $prefix ? substr($relation, $prefixLength) : false;
            }, $request->include));

            $discussion->posts = $this->getPosts($request, ['discussion_id' => $discussion->id])->load($postRelations);
        }

        return $discussion;
    }
}