Drupal 8 中的 Composer:从 Twitter 获取最新推文
安装模块和库时,最好使用 Composer。Composer 是一个 PHP 库管理器,它允许你管理库和模块之间的依赖关系。如果一个模块依赖于某个库,Composer 会在安装模块时自动下载该库。虽然 Composer 在某种程度上增加了安装步骤,但它极大地简化了库的安装和加载过程,因为一切都将自动完成。
要下载并安装 Composer,请访问官方网站:
https://getcomposer.org/download/
顺便说一下,Drush 现在也通过 Composer 安装。如果你已经安装过 Drush,那么系统中已经有 Composer。可以通过以下命令验证是否安装成功:
composer --version
结果应显示 Composer 的版本:

现在,进入你的网站目录并通过控制台使用 Composer。
在 Drupal 8 中显示 Twitter 最新推文
首先,你需要在 Twitter 上创建一个应用程序(application),以获取一组令牌(tokens)用于 API 授权。创建应用程序的页面:
Twitter API 1.0 版本 即将被弃用,未授权请求将被拒绝。因此,建议使用 1.1 或更高版本的 Twitter API。
1. 创建开发者账户。请在 Twitter 上注册并配置你的 开发者账户。
填写注册表单,这是免费的,也是使用 Twitter API 1.1 的必备步骤。然后前往 My Apps 页面并点击 “Create New App”:

2. 创建 Twitter 应用程序。填写表单时需输入你的网站域名。

如果成功创建应用程序,你将被重定向到应用页面。接下来,你需要以下数据:
- Consumer key
- Consumer secret
- Access token
- Access token secret
Twitter API 文档详细说明了这些令牌的作用及使用方法:https://dev.twitter.com/oauth/overview/single-user
3. 生成 Access Token。Twitter 使用 OAuth 协议,因此需要生成多个令牌。

这将生成 Access Token 和 Access Token Secret,稍后将在 Drupal 模块中使用。
接下来,我们可以通过 Twitter API 获取推文。虽然可以直接使用 drupal_http_request 请求,但更推荐使用现成的 Twitter 库来简化工作。如果 API 升级,只需更新库即可保持兼容。
本文使用以下 PHP 库:
https://packagist.org/packages/j7mbo/twitter-api-php
使用 Composer 安装该库:
composer require j7mbo/twitter-api-php
Composer 将自动下载库及其依赖项,你可以立即在代码中使用。
以下是用于在区块中显示最新推文的自定义模块代码。密钥和令牌存放在配置表单中:
/admin/structure/twitter-block/settings
模块代码可在本文附件或 Github 上获取:
https://github.com/Drupalbook/bootstrap
模块文件结构:
/modules/twitter_block/twitter_block.info.yml — 模块信息文件:
name: Twitter Block description: Display Last tweets. type: module core: 8.x package: Custom
/modules/twitter_block/src/Plugin/Block/TwitterBlock.php — 区块插件:
<?php
namespace Drupal\twitter_block\Plugin\Block;
use Drupal\Core\Block\BlockBase;
/**
* Provides a Last tweet block.
*
* @Block(
* id = "twitter_block",
* admin_label = @Translation("Twitter block"),
* )
*/
class TwitterBlock extends BlockBase {
public function build() {
$content = '';
$config = \Drupal::config('twitter_block.settings');
$settings = [
'consumer_key' => $config->get('consumer_key'),
'consumer_secret' => $config->get('consumer_secret'),
'oauth_access_token' => $config->get('access_token'),
'oauth_access_token_secret' => $config->get('access_token_secret'),
];
$screen_name = 'netglooweb';
$url = 'https://api.twitter.com/1.1/statuses/user_timeline.json';
$getfield = "?count=1";
$requestMethod = 'GET';
$twitter = new \TwitterAPIExchange($settings);
$user_timeline = $twitter
->setGetfield($getfield)
->buildOauth($url, $requestMethod)
->performRequest();
$messages = json_decode($user_timeline);
if (!empty($messages)) {
foreach ($messages as $message) {
$content .= '<div class="twitter-message">' . $message->text . '</div>';
}
}
return ['#markup' => $content];
}
}
/modules/twitter_block/src/Form/TwitterBlockSettingsForm.php — 配置表单:
<?php
namespace Drupal\twitter_block\Form;
use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;
class TwitterBlockSettingsForm extends ConfigFormBase {
public function getFormId() {
return 'twitter_block_admin_settings';
}
protected function getEditableConfigNames() {
return ['twitter_block.settings'];
}
public function buildForm(array $form, FormStateInterface $form_state) {
$config = $this->config('twitter_block.settings');
$form['consumer_key'] = [
'#type' => 'textfield',
'#title' => $this->t('Consumer key'),
'#default_value' => $config->get('consumer_key'),
];
$form['consumer_secret'] = [
'#type' => 'textfield',
'#title' => $this->t('Consumer secret'),
'#default_value' => $config->get('consumer_secret'),
];
$form['access_token'] = [
'#type' => 'textfield',
'#title' => $this->t('Access token'),
'#default_value' => $config->get('access_token'),
];
$form['access_token_secret'] = [
'#type' => 'textfield',
'#title' => $this->t('Access token secret'),
'#default_value' => $config->get('access_token_secret'),
];
return parent::buildForm($form, $form_state);
}
public function submitForm(array &$form, FormStateInterface $form_state) {
$this->config('twitter_block.settings')
->set('consumer_key', $form_state->getValue('consumer_key'))
->set('consumer_secret', $form_state->getValue('consumer_secret'))
->set('access_token', $form_state->getValue('access_token'))
->set('access_token_secret', $form_state->getValue('access_token_secret'))
->save();
parent::submitForm($form, $form_state);
}
}
/modules/twitter_block/twitter_block.routing.yml — 配置表单路由:
twitter_block.settings:
path: '/admin/structure/twitter-block/settings'
defaults:
_form: '\Drupal\twitter_block\Form\TwitterBlockSettingsForm'
_title: 'Twitter API Settings'
requirements:
_permission: 'administer site configuration'
/modules/twitter_block/composer.json — 定义模块对库 j7mbo/twitter-api-php 的依赖:
{
"name": "drupal/twitter_block",
"type": "drupal-module",
"description": "Displays Last tweets.",
"homepage": "https://drupalbook.org/ru/drupal/composer-v-drupal-8-vyvod-poslednih-tvitov-iz-twitter",
"license": "GPL-2.0+",
"require": {
"j7mbo/twitter-api-php": "dev-master"
},
"minimum-stability": "dev"
}
Github 源码地址: