Цепочка метода в библиотеке CodeIgniter

Chris Mellor спросил: 28 марта 2018 в 01:35 в: php

Я работаю над скриптом для работы. Это использовать Slack с PHP. На работе мы используем CodeIgniter (печальное лицо), поэтому мне приходится приспосабливаться, и я решил написать свой скрипт как библиотеку.

Здесь нет проблемы, поскольку код не работает, так как он отлично работает, но мне просто интересно узнать, как я могу применить цепочку методов при вызове библиотеки, чтобы я и мои коллеги могли писать код более чистым, когда мы используем библиотеку.

Вот библиотека, которую я написал - я больше программиста на тренировках, поэтому мои знания ООП ограничены.

<?php defined('BASEPATH') OR exit('No direct script access allowed');include('../vendor/autoload.php');use GuzzleHttp\Client;class Slack {    protected $ci;    private $channel;    private $endpoint;    private $icon;    private $username;    public function __construct()
    {
        $this->ci =& get_instance();
        $this->ci->config->load('slack');        $this->baseUri  = $this->ci->config->item('base_uri');
        $this->channel  = $this->ci->config->item('channel');
        $this->endpoint = $this->ci->config->item('endpoint');
        $this->icon     = $this->ci->config->item('icon');
        $this->username = $this->ci->config->item('username');        $this->client = new Client([
            'base_uri' => $this->baseUri
        ]);
    }    public function getChannel()
    {
        return $this->channel;
    }    public function setChannel($channel)
    {
        $this->channel = $channel;        return $this;
    }    public function getEndpoint()
    {
        return $this->endpoint;
    }    public function setEndpoint($endpoint)
    {
        $this->endpoint = $endpoint;        return $this;
    }    public function getIcon()
    {
        return $this->icon;
    }    public function setIcon($icon)
    {
        (mb_substr($icon, 0, 1) == ':')
            ? $this->iconType = 'icon_emoji'
            : $this->iconType = 'icon_url';        $this->icon = $icon;        return $this;
    }    public function getIconType()
    {
        return ($this->iconType) ? $this->iconType : 'icon_emoji';
    }    public function getUsername()
    {
        return $this->username;
    }    public function setUsername($username)
    {
        $this->username = $username;        return $this;
    }    public function to($channel)
    {
        $this->setChannel($channel);        return $channel;
    }    public function from($username)
    {
        $this->setUsername($username);        return $username;
    }    public function icon($icon)
    {
        $this->setIcon($icon);        return $icon;
    }    public function payload($text)
    {
        $payload = [
            'channel' => $this->getChannel(),
            $this->getIconType() => $this->getIcon(),
            'link_names' => 1,
            'text' => $text,
            'username' => $this->getUsername(),
        ];        return $payload;
    }    public function send($text)
    {
        $payload = json_encode($this->payload($text));        $this->client->post($this->getEndpoint(), [
            'body' => $payload
        ]);        return $this;
    }}

Теперь я использую это в нашем API, который закодирован в контроллере, и вот как я я вызываю методы:

<?php
// ...
$this->load->library('slack');$this->slack->icon(':hotdog:');
$this->slack->send('Hello...');

Как я уже сказал, это прекрасно работает ...

Я хотел, чтобы иметь возможность делать цепочку методов, например :

<?php
// ...
$this->slack->icon(':hotdog:')->send('Hello...');

Можете ли вы сказать мне, возможно ли это и как его достичь?

Спасибо.

1 ответ

Есть решение
Sider Topalov ответил: 28 марта 2018 в 01:50

Как я вижу, чтобы заархивировать то, что вы хотите, вам просто нужно заменить это

public function icon($icon)
    {
        $this->setIcon($icon);        return $icon;
    }

на это

public function icon($icon)
{
    $this->setIcon($icon);    return $this;
}

, а затем вы сможете делать то, что хотите

$this->slack->icon(':hotdog:')->send('Hello...');

В любом случае, ваш метод icon не должен возвращать $ icon, у вас уже есть метод getIcon, также ваш метод send вызывает метод payload перед выполнением запроса, так что работа

Chris Mellor ответил: 28 марта 2018 в 02:15
Я был так близко!
Chris Mellor ответил: 28 марта 2018 в 02:15
Я был так близко! Спасибо за правильный ответ!