Heim PHP-Framework Denken Sie an PHP Verwenden Sie den Factory-Modus, um den Thinkphp6.0-Zugriff auf Alibaba Cloud SMS zu implementieren

Verwenden Sie den Factory-Modus, um den Thinkphp6.0-Zugriff auf Alibaba Cloud SMS zu implementieren

Apr 29, 2020 pm 10:39 PM
thinkphp6 短信

如今,短信验证码已成为网站、APP的基础必备应用,应用场景十分丰富,随着移动互联网的发展会越来越多。作为一名码农,对第三方短信接口也是必须掌握的。本文php中文网将介绍使用工厂模式怎么实现ThinkPHP6.0接入阿里云短信。

一、环境要求

    PHP版本 >= 7.1.0

    开发环境必须安装有Composer

    已开通阿里云短信服务,并且已获取AccessKey,创建模板和签名

    最重要的,阿里云账户余额一定要有钱。

这里我就不演示开通短信服务和创建签名模板了,小伙伴们可以查看官方文档:https://help.aliyun.com/document_detail/108072.html?spm=a2c4g.11186623.6.565.1b4825903BoqGV

二、使用Composer安装Thinkphp6.0

如果您是第一次安装,请在命令行中切换到您的web目录执行下面的命令

composer create-project topthink/think sms
Nach dem Login kopieren

本教程将安装在C盘www目录下 Verwenden Sie den Factory-Modus, um den Thinkphp6.0-Zugriff auf Alibaba Cloud SMS zu implementieren三、使用Composer安装 Alibaba Cloud SDK for PHP

进到刚刚创建的sms项目下执行下面的命令

composer require alibabacloud/sdk
Nach dem Login kopieren

Verwenden Sie den Factory-Modus, um den Thinkphp6.0-Zugriff auf Alibaba Cloud SMS zu implementieren四、使用编辑器打开项目 ,并在config文件夹下创建sms.php配置文件来管理阿里短信配置信息

<?php

return [
    //阿里云短信API接口地址
    &#39;host&#39;              => &#39;dysmsapi.aliyuncs.com&#39;,

    //AccessKey ID
    &#39;access_key_id&#39;     => &#39;您的AccessKey ID&#39;,

    //Access Key Secret
    &#39;access_key_secret&#39; => &#39;您的Access Key Secret&#39;,

    //地区ID
    &#39;region_id&#39;         => &#39;cn-hangzhou&#39;,

    //模板CODE
    &#39;template_code&#39;     => &#39;您的模板CODE&#39;,

    //签名名称
    &#39;sign_name&#39;         => &#39;您的短信签名名称&#39;,
];
Nach dem Login kopieren

五、顺便在config文件夹下打开cache.php添加Redis缓存配置,后面发送短信验证码会用到

<?php

// +----------------------------------------------------------------------
// | 缓存设置
// +----------------------------------------------------------------------

return [
    // 默认缓存驱动
    &#39;default&#39; => env(&#39;cache.driver&#39;, &#39;redis&#39;),

    // 缓存连接方式配置
    &#39;stores&#39;  => [
        &#39;file&#39; => [
            // 驱动方式
            &#39;type&#39;       => &#39;File&#39;,
            // 缓存保存目录
            &#39;path&#39;       => &#39;&#39;,
            // 缓存前缀
            &#39;prefix&#39;     => &#39;&#39;,
            // 缓存有效期 0表示永久缓存
            &#39;expire&#39;     => 0,
            // 缓存标签前缀
            &#39;tag_prefix&#39; => &#39;tag:&#39;,
            // 序列化机制 例如 [&#39;serialize&#39;, &#39;unserialize&#39;]
            &#39;serialize&#39;  => [],
        ],
        // Redis缓存
        &#39;redis&#39; =>  [
            //服务器地址
            &#39;host&#39;      =>  &#39;127.0.0.1&#39;,
            //redis端口
            &#39;port&#39;      =>  6379,
            //驱动方式
            &#39;type&#39;      =>  &#39;redis&#39;,
            //缓存前缀
            &#39;prefix&#39;    => &#39;sms_code_&#39;,
        ]
    ],
];
Nach dem Login kopieren

六、在app目录下创建common/lib/sms/Sms.php接口类,用来约束发送短信验证码的方法

<?php

namespace app\common\lib\sms;

//定义实现发送短信验证码的接口类,用来约束发送验证码的方法
interface Sms
{
    /**
     * @desc 发送短信验证码的方法
     * @param string $phone 手机号
     * @param int $code     验证码
     * @return mixed
     */
    public static function sendCode(string $phone, int $code);
}
Nach dem Login kopieren

七、在common/lib/sms目录下创建AliSms类来实现Sms接口的smsSend()

<?php

namespace app\common\lib\sms;

use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Client\Exception\ClientException;
use AlibabaCloud\Client\Exception\ServerException;

class AliSms implements Sms
{

    /**
     * @desc 阿里云发送短信验证码
     * @param string $phone 手机号
     * @param int $code 验证码
     * @return mixed|void
     * @throws ClientException
     */
    public static function sendCode(string $phone, int $code)
    {
        //判断手机号和验证码是否为空
        if (empty($phone) || empty($code)){
            return false;
        }

        AlibabaCloud::accessKeyClient(config(&#39;sms.access_key_id&#39;), config(&#39;sms.access_key_secret&#39;))->regionId(config(&#39;sms.region_id&#39;))->asDefaultClient();

        try {
            $result = AlibabaCloud::rpc()
                ->product(&#39;Dysmsapi&#39;)
                // ->scheme(&#39;https&#39;) // https | http
                ->version(&#39;2017-05-25&#39;)
                ->action(&#39;SendSms&#39;)
                ->method(&#39;POST&#39;)
                ->host(config(&#39;sms.host&#39;))
                ->options([
                    &#39;query&#39; => [
                        &#39;RegionId&#39; =>config(&#39;sms.region_id&#39;),
                        &#39;SignName&#39; => config(&#39;sms.sign_name&#39;),
                        &#39;PhoneNumbers&#39;  =>  $phone,
                        &#39;TemplateCode&#39;  =>  config(&#39;sms.template_code&#39;),
                        &#39;TemplateParam&#39; =>  json_encode([&#39;code&#39;  =>  $code]),
                    ],
                ])->request();
        } catch (ClientException $e) {
            return false;
        } catch (ServerException $e) {
            return false;
        }
        return true;
    }
}
Nach dem Login kopieren

八、在common\lib目录下创建生成短信验证码的类 Code.php

<?php

namespace app\common\lib;

class Code
{
    /**
     * @desc 生成4位或6位短信验证码,默认为4位
     * @param int $length 验证码长度
     * @return int
     */
    public static function getCode(int $length = 4)
    {
        $code = rand(1000,9999);
        if ($length == 6){
            $code = rand(100000,999999);
        }
        return $code;
    }
}
Nach dem Login kopieren

九、在common目录下创建service/Sms.php

<?php

namespace app\common\Service;

use app\common\lib\Code;

class Sms
{
    /**
     * @param string $phone 手机号
     * @param int $lengthCode 验证码长度
     * @param string $type 短信厂家,默认选用AliSms
     * @return mixed
     */
    public static function sendCode(string $phone,int $lengthCode,string $type=&#39;AliSms&#39;)
    {
        //生成短信验证码
        $code = Code::getCode(4);

        //使用工厂模式 调用Lib层发送短信
        $class = "app\common\lib\sms\\".$type;
        $sms = $class::sendCode($phone,$code);

        if ($sms){
            //发送成功,把短信验证码存储Redis缓存中,并给失效时间
            cache($phone,$code,300);
        }
        return $sms;
    }
}
Nach dem Login kopieren

十、在common目录下创建validate/SmsValidate验证器

<?php

namespace app\common\validate;

use think\Validate;

class SmsValidate extends Validate
{
    //验证规则
    protected $rule = [
        &#39;phone&#39;     =>  &#39;require|mobile&#39;,
        &#39;code&#39;      =>  &#39;require|number&#39;
    ];

    //错误信息
    protected $message = [
        &#39;phone.require&#39;     =>  &#39;请输入手机号&#39;,
        &#39;phone.mobile&#39;      =>  &#39;手机号格式错误&#39;,
        &#39;code.require&#39;      =>  &#39;短信验证码不能为空&#39;,
        &#39;code.number&#39;       =>  &#39;短信验证码必须为纯数字&#39;
    ];

    //验证场景
    protected $scene = [
        &#39;sendCode&#39;  =>  [&#39;phone&#39;]
    ];
}
Nach dem Login kopieren

十一、在controller目录下创建Sms.php

<?php

namespace app\controller;

use app\common\validate\SmsValidate;

class Sms
{
    /**
     * @desc 发送短信验证码
     * @return \think\response\Json
     */
    public function code()
    {
        if (request()->isPost()){
            //获取手机号
            $data =  [
                &#39;phone&#39; =>  request()->param(&#39;phone&#39;,&#39;&#39;,&#39;trim&#39;),
            ];

            //参数校验
            $validate = new SmsValidate();
            if (!$validate->scene(&#39;sendCode&#39;)->check($data)){
                return json([&#39;code&#39;=>0,&#39;msg&#39;=>$validate->getError()]);
            }
            //发送短信验证码
            if (\app\common\Service\Sms::sendCode($data[&#39;phone&#39;],6,&#39;AliSms&#39;)){
                return json([&#39;code&#39;=>1,&#39;msg&#39;=>&#39;发送成功,请注意查收。&#39;]);
            }else{
                return json([&#39;code&#39;=>0,&#39;msg&#39;=>&#39;发送失败,请稍后重试!&#39;]);
            }

        }
    }
}
Nach dem Login kopieren

十二、使用PostMan测试发送短信验证码

不输入手机号或输入错误手机号会给相应的提示。

Verwenden Sie den Factory-Modus, um den Thinkphp6.0-Zugriff auf Alibaba Cloud SMS zu implementieren

Verwenden Sie den Factory-Modus, um den Thinkphp6.0-Zugriff auf Alibaba Cloud SMS zu implementieren

输入正确的手机号,提示发送短信验证成功Verwenden Sie den Factory-Modus, um den Thinkphp6.0-Zugriff auf Alibaba Cloud SMS zu implementieren这时我们来看看收到的验证码和缓存中的验证码是否一致Verwenden Sie den Factory-Modus, um den Thinkphp6.0-Zugriff auf Alibaba Cloud SMS zu implementieren到这里我们的发送验证码已经完成

十三、这时我们需要校验验证码是否正确,在app\controller目录下创建Login.php

<?php

namespace app\controller;

use app\common\validate\SmsValidate;

class Login
{
    public function index()
    {
        //接收参数
        $data = [
            &#39;phone&#39; =>  request()->param(&#39;phone&#39;,&#39;&#39;,&#39;trim&#39;),
            &#39;code&#39;  =>  request()->param(&#39;code&#39;,&#39;&#39;,&#39;trim&#39;),
        ];
        //参数校验
        $validate = new SmsValidate();
        if (!$validate->check($data)){
            return json([&#39;code&#39;=>0,&#39;msg&#39;=>$validate->getError()]);
        }

        //从Redis中获取验证码
        $redisCode = cache($data[&#39;phone&#39;]);

        //判断验证码是否正确
        if (empty($redisCode)){
            return json([&#39;code&#39;=>0,&#39;msg&#39;=>&#39;验证码已过期,请重新发送!&#39;]);
        }
        if ($redisCode != $data[&#39;code&#39;]){
            return json([&#39;code&#39;=>0,&#39;msg&#39;=>&#39;验证码输入错误,请重新输入!&#39;]);
        }

        return &#39;验证成功&#39;;
    }
}
Nach dem Login kopieren

十四、使用PostMan校验验证码是否正确

输入错误的验证码,会给出响应的提示

Verwenden Sie den Factory-Modus, um den Thinkphp6.0-Zugriff auf Alibaba Cloud SMS zu implementieren

输入正确的验证码,提示验证成功Verwenden Sie den Factory-Modus, um den Thinkphp6.0-Zugriff auf Alibaba Cloud SMS zu implementieren

看到这里我相信很多小伙伴的验证码都已发送成功了。

不知道小伙伴们有没有发现文中有两处参数校验的代码相识度很高,在后续的thinkphp技术文章中我会对这个问题进行优化,感兴趣的小伙伴请关注。

Das obige ist der detaillierte Inhalt vonVerwenden Sie den Factory-Modus, um den Thinkphp6.0-Zugriff auf Alibaba Cloud SMS zu implementieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So richten Sie die SMS-Blockierung auf dem iPhone ein So richten Sie die SMS-Blockierung auf dem iPhone ein Feb 24, 2024 pm 01:48 PM

Mit der Beliebtheit von Smartphones erhalten wir täglich eine große Anzahl von Textnachrichten, bei denen es sich teilweise um Werbe- und Verkaufsförderungsnachrichten und bei einigen um Spam-Textnachrichten handelt. Diese Textnachrichten verschwenden nicht nur unsere Zeit, sondern belegen auch den Platz unserer Mobiltelefone. Glücklicherweise bieten iPhones jedoch einige Funktionen zum Blockieren dieser lästigen Textnachrichten. In diesem Artikel erfahren Sie, wie Sie Textnachrichten mit dem iPhone blockieren. Um Textnachrichten zu blockieren, öffnen Sie zunächst die App „Einstellungen“, scrollen Sie dann und tippen Sie auf „Nachrichten“. In der Benutzeroberfläche für Informationseinstellungen können Sie einige Optionen sehen, darunter „Blockiert“.

So passen Sie die Textgröße in Textnachrichten an So passen Sie die Textgröße in Textnachrichten an Aug 29, 2023 am 11:38 AM

So passen Sie die Schriftgröße in Textnachrichten an: 1. Öffnen Sie auf dem iOS-Gerät die Anwendung „Einstellungen“, wählen Sie dann die Option „Anzeige & Helligkeit“, suchen Sie den Schieberegler „Textgröße“ und schieben Sie den Schieberegler, um die Größe anzupassen des Textes auf dem gesamten Gerät, einschließlich Text in Textnachrichten. 2. Öffnen Sie auf einem Android-Gerät die Option „Anzeige“, suchen Sie die Option „Schriftgröße“ und zeigen Sie eine Vorschau an und passen Sie sie an Textnachrichten in Textnachrichten durch Auswahl verschiedener Schriftgrößen.

So blockieren Sie Textnachrichten auf dem iPhone So blockieren Sie Textnachrichten auf dem iPhone Jul 31, 2023 pm 09:49 PM

Wie blockiere ich Textnachrichten von jemandem auf dem iPhone? Wenn Sie eine Textnachricht von jemandem erhalten, den Sie blockieren möchten, müssen Sie die Nachricht auf Ihrem iPhone öffnen. Sobald Sie die Nachricht geöffnet haben, klicken Sie oben auf das Symbol mit der Telefonnummer oder dem Namen des Absenders darunter. Klicken Sie nun auf der rechten Seite des Bildschirms auf Nachrichten. Nun wird ein weiterer Bildschirm mit der Option angezeigt, diesen Anrufer zu blockieren. Klicken Sie auf diese Schaltfläche und wählen Sie Kontakt blockieren. Die Telefonnummer kann Ihnen keine Textnachrichten mehr senden; außerdem wird der Anruf auf Ihrem iPhone gesperrt. Wie entsperre ich blockierte Kontakte auf dem iPhone? Wenn Sie einer blockierten Person erlauben möchten, Ihnen Nachrichten zu senden, können Sie die Blockierung jederzeit auf Ihrem iPhone aufheben. Um Kontakte auf dem iPhone zu entsperren, müssen Sie dies tun

So stellen Sie gelöschte Textnachrichten auf einem Apple-Mobiltelefon wieder her So stellen Sie gelöschte Textnachrichten auf einem Apple-Mobiltelefon wieder her Mar 08, 2024 pm 03:19 PM

Einige wichtige Textnachrichten wurden aus Apple-Handy-Textnachrichten gelöscht, und viele Benutzer wissen nicht, wie sie sie wiederherstellen können. Tatsächlich ist die Wiederherstellungsmethode auch sehr einfach. Heute werde ich Ihnen die detaillierte Wiederherstellungsmethode vorstellen. Wie kann ich gelöschte Textnachrichten auf einem Apple-Mobiltelefon wiederherstellen? Antwort: Es gibt vier Methoden, nämlich iCloud-Wiederherstellung, iTunes-Wiederherstellung, Wiederherstellung durch Software von Drittanbietern und Wiederherstellung durch den Betreiber. 1. Wenn der Benutzer iCloud verwendet, um die Textnachrichtendaten seines Mobiltelefons zu sichern Telefon kann er die iCloud-Datenwiederherstellung direkt verwenden. 2. Gehen Sie einfach zu [Einstellungen] > [Allgemein] > [Wiederherstellen], stellen Sie dann die iCloud-Sicherung wieder her und wählen Sie die aktuellste SMS-Sicherung aus. 3. Wenn der Benutzer iTunes zum Sichern seines Mobiltelefons verwendet, muss der Player dies nur tun

PHP realisiert die automatische Anti-Swiping-Funktion des SMS-Bestätigungscodes PHP realisiert die automatische Anti-Swiping-Funktion des SMS-Bestätigungscodes Sep 13, 2023 pm 12:01 PM

PHP implementiert die automatische Anti-Swiping-Funktion des SMS-Verifizierungscodes, für die spezifische Codebeispiele erforderlich sind. In modernen Internetanwendungen ist der SMS-Verifizierungscode eine der gängigen Methoden zur Identitätsprüfung. Aufgrund der Existenz böswilliger Benutzer sind SMS-Verifizierungscodes jedoch häufig anfällig für automatisierte Angriffe, was das sogenannte Anti-Swiping-Problem von SMS-Verifizierungscodes darstellt. Um die Kontosicherheit und Systemstabilität des Benutzers zu schützen, müssen wir die automatische Anti-Swipe-Funktion von SMS-Bestätigungscodes in PHP implementieren. In diesem Artikel wird eine einfache Methode basierend auf IP-Adresse und Zeitintervall vorgestellt und spezifische PHP-Codebeispiele bereitgestellt. eins

So rufen Sie gelöschte Textnachrichten ab: Unbedingt lesen: Tutorial zur Wiederherstellung gelöschter Textnachrichten So rufen Sie gelöschte Textnachrichten ab: Unbedingt lesen: Tutorial zur Wiederherstellung gelöschter Textnachrichten Mar 25, 2024 pm 12:26 PM

Viele Freunde löschen versehentlich einige wichtige Textnachrichten, wenn sie ihre Mobiltelefone verwenden. Sie möchten sie wiederherstellen, wissen aber nicht, wie das geht. In diesem Artikel erfahren Sie, wie Sie auf gelöschte Textnachrichten antworten. Öffnen Sie zunächst Ihr Telefon und suchen Sie den „Cloud-Speicherplatz“, der mit Ihrem Telefon geliefert wird. Wie unten gezeigt: Die meisten Marken-Mobiltelefone verfügen mittlerweile über eine „Cloud-Dienst“-Funktion. Sobald sie aktiviert ist, werden einige wichtige Daten im Telefon, einschließlich Textnachrichten, regelmäßig gesichert. Öffnen Sie nach dem Einschalten des Cloud-Dienstes das Menü und überprüfen Sie die SMS-Backup-Zeit. Wie unten gezeigt: Wenn die Sicherungszeit vor dem Zeitpunkt liegt, zu dem Sie die Textnachrichten löschen, bedeutet dies, dass die gelöschten Textnachrichten in den Cloud-Bereich hochgeladen und gespeichert wurden. Klicken Sie zu diesem Zeitpunkt auf die Option „Sichern und Wiederherstellen“.

Lassen Sie Wetterwarnungsinformationen den Bildschirm dominieren! Obligatorische Erinnerungstechnologien wie Flash-Nachrichten werden an vorderster Front der Katastrophenprävention und -reduzierung eingesetzt Lassen Sie Wetterwarnungsinformationen den Bildschirm dominieren! Obligatorische Erinnerungstechnologien wie Flash-Nachrichten werden an vorderster Front der Katastrophenprävention und -reduzierung eingesetzt Jul 17, 2024 pm 08:28 PM

Laut Nachrichten vom 16. Juli kam es laut dem offiziellen öffentlichen Bericht der China Meteorological Administration zu Beginn der Hauptflutsaison an vielen Orten in meinem Land zu anhaltenden starken Niederschlägen und starkem konvektivem Wetter, was die Situation der Überschwemmungsprävention und -hilfe komplex und ernst machte . Seit Anfang dieses Jahres hat die China Meteorological Administration mehrere Treffen abgehalten, um Maßnahmen zur Katastrophenprävention und -reduzierung durchzuführen. Dabei wurde eine stärkere Verbindung zwischen Frühwarnung und Notfallreaktion gefordert und die Anwendung neuer obligatorischer Informationserinnerungen wie „Flash Messages“ energisch gefördert. , und kontinuierliche Verbesserung der öffentlichen Berichterstattung und Empfangsrate von Frühwarninformationen, damit die Präventionserinnerungen gezielter sind und einen geschlossenen Kreislauf aus Frühwarnung, Reaktion und Feedback bilden, um Möglichkeiten für die Hochwasserprävention und Katastrophenhilfe zu schaffen. 1. Das Public Meteorological Service Center der China Meteorological Administration (National Early Warning Information Release Center) stärkt die Direktionalität von Frühwarnungen und etabliert eine hochrangige Technologie zur Frühwarnungsfreigabe auf der Grundlage obligatorischer „Flash-Message“-Erinnerungen.

Anleitung zur Behebung des Problems, dass auf dem iPhone 11 keine Textnachrichten empfangen werden Anleitung zur Behebung des Problems, dass auf dem iPhone 11 keine Textnachrichten empfangen werden Mar 23, 2024 am 08:41 AM

1. Möglicherweise ist die SMS-Filterung von Kontakten aktiviert oder iMessages auf dem Telefon ist nicht aktiviert. 2. Möglicherweise sind der Flugmodus und der „Bitte nicht stören“-Modus aktiviert. 3. Der Betreiber in Ihrer Nähe hat möglicherweise eine Dienstunterbrechung oder Zahlungsrückstände beim Mobiltelefon. Es wird empfohlen, sich an den Betreiber zu wenden, um das Problem zu lösen. 4. Das Mobiltelefonsystem ist möglicherweise fehlerhaft. Es wird empfohlen, die Betreibereinstellungen und das Mobiltelefonsystem zu aktualisieren und das Mobiltelefon neu zu starten. 5. Möglicherweise liegt ein Hardwarefehler vor. Es wird empfohlen, sich zum Testen an das Apple Service Center zu wenden.

See all articles