Блог

Вывод последних твитов в Laravel

Вывод последних твитов в Laravel

На самом деле отношение статьи к Laravel притянуто за ушли и при реализации выбор фреймворка не важен. Благодаря готовой библиотеке TwitterOAuth список последних твитов из вашего профиля в Twitter возможно вывести без лишних заморочек на любом сайте, написанном на PHP. Тем не менее, я пишу только о том, чем занимался сам, - и в моем случае задача касается именно Laravel.

Установим пакет через Composer:

composer require abraham/twitteroauth

Для того, чтобы каждый раз (мало ли где еще понадобится взаимодействовать с Twitter) не прописывать настройки я создал дочерний класс с объявлением необходимых переменных в __construct()

<?php

namespace App\Helpers;

use Abraham\TwitterOAuth\TwitterOAuth;

class Twitter extends TwitterOAuth
{
    public function __construct()
    {
        parent::__construct('CONSUMER_KEY', 'CONSUMER_SECRET', 'ACCESS_TOKEN', 'ACCESS_TOKEN_SECRET');
    }
}

Переменные берем из созданного в Twitter Applicaton Manager приложения.

Люблю асинхронность, поэтому список записей загружаю не в момент обращения к странице, а после ее загрузки через AJAX. Добавим новый POST-маршрут:

Route::post('/tweets', 'IndexController@twitter');

...и создадим метод в контроллере. Так как необходимость получать свежие данные на каждом хите отсутствует, дополнительно закешируем на 120 минут полученный список твитов.

<?php

namespace App\Http\Controllers;

use App\Helpers\Twitter;

class IndexController extends Controller
{
    public function twitter()
    {
        $items = \Cache::remember('tweets', 120, function() {
            $twitter = new Twitter();
            return $twitter->get('statuses/user_timeline', ['count' => 2]);
        });

        return view('parts.tweets', compact('items'));
    }
}

Данный метод получает последние 2 записи из профиля пользователя-владельца приложения и отдает их в шаблон parts.tweets. У метода есть еще куча необязательных параметров вроде возможности изменить пользователя для вывода твитов, все они описаны в документации.

Теперь займемся шаблоном. Тут все довольно просто, ничего переделывать не буду и выложу свое содержимое шаблона. Он основан на Bootstrap и если вы тоже его используете - стили подтянутся сами. Шаблон довольно прост, выводится блок-ссылка на запись с текстом, количеством ретвитов и лайков, дата публикации твита в формате "10 секунд назад". 

<div class="row">
    @foreach($items as $item)
        <div class="col-md-12">
            <a href="https://twitter.com/{{ $item->user->screen_name }}/status/{{ $item->id }}" target="_blank" class="thumbnail" title="Перейти к твиту">
                <div class="caption">
                    <p>{{ $item->text }}</p>
                    <p>
                        <span class="label label-primary">{{ \Carbon\Carbon::parse($item->created_at)->diffForHumans() }}</span>
                        <span class="label label-primary"><i class="fa fa-retweet" aria-hidden="true"></i> {{ $item->retweet_count }}</span>
                        <span class="label label-primary"><i class="fa fa-heart" aria-hidden="true"></i> {{ $item->favorite_count }}</span>
                    </p>
                </div>
            </a>
        </div>
    @endforeach
</div>

Кстати, касательно метода diffForHumans(). Carbon не учитывает локаль из настроек и по-умолчанию выводит дату на английском языке. В поисках русской локализации я сначала набрел на класс от LaravelRUS, а уже после открыл официальную документацию и узнал, что довольно давно Carbon поддерживает несколько языков, в т.ч. русский. Откроем AppServiceProvider, добавим в boot():

<?php

namespace App\Providers;

use Carbon\Carbon;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Carbon::setLocale('ru');
    }
}

Но это уже не совсем по теме. Последний шаг - вывод записей на сайт. Для этого в необходимом месте добавим блок:

<div id="tweets"></div>

И подключим скрипт, выполняющий запрос к нашему роутеру:

$.post('/tweets', function(response) {
    $('#tweets').html(response);
});

На этом все. Пример работы вы можете увидеть прямо под этим постом. Удачи :)

Комментариев: 0