Я работаю над скриптом для работы. Это использовать 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...');
Можете ли вы сказать мне, возможно ли это и как его достичь?
Спасибо.
Как я вижу, чтобы заархивировать то, что вы хотите, вам просто нужно заменить это
на это
, а затем вы сможете делать то, что хотите
В любом случае, ваш метод icon не должен возвращать $ icon, у вас уже есть метод getIcon, также ваш метод send вызывает метод payload перед выполнением запроса, так что работа