Skip to content

Commit

Permalink
🔨 Refactoring for mini-program. (#632)
Browse files Browse the repository at this point in the history
* Refactoring for mini-program.

* Fix styles.

* Fix styles again 💣

* Modify name.

* naming.

* PrefixedContainer Trait.
  • Loading branch information
mingyoung authored and overtrue committed Apr 2, 2017
1 parent 1ae43c0 commit a59297f
Show file tree
Hide file tree
Showing 8 changed files with 183 additions and 122 deletions.
63 changes: 43 additions & 20 deletions src/Foundation/ServiceProviders/MiniProgramServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,13 @@

use EasyWeChat\Encryption\Encryptor;
use EasyWeChat\MiniProgram\AccessToken;
use EasyWeChat\MiniProgram\Material\Temporary;
use EasyWeChat\MiniProgram\MiniProgram;
use EasyWeChat\MiniProgram\Notice\Notice;
use EasyWeChat\MiniProgram\QRCode\QRCode;
use EasyWeChat\MiniProgram\Server\Guard;
use EasyWeChat\MiniProgram\Sns\Sns;
use EasyWeChat\MiniProgram\Staff\Staff;
use Pimple\Container;
use Pimple\ServiceProviderInterface;

Expand All @@ -44,40 +49,58 @@ class MiniProgramServiceProvider implements ServiceProviderInterface
*/
public function register(Container $pimple)
{
$pimple['mini_program_access_token'] = function ($pimple) {
$config = $pimple['config']->get('mini_program');

$pimple['mini_program.access_token'] = function ($pimple) {
return new AccessToken(
$config['app_id'],
$config['secret'],
$pimple['config']['mini_program']['app_id'],
$pimple['config']['mini_program']['secret'],
$pimple['cache']
);
};

$pimple['mini_program_encryptor'] = function ($pimple) {
$config = $pimple['config']->get('mini_program');

$pimple['mini_program.encryptor'] = function ($pimple) {
return new Encryptor(
$config['app_id'],
$config['token'],
$config['aes_key']
$pimple['config']['mini_program']['app_id'],
$pimple['config']['mini_program']['token'],
$pimple['config']['mini_program']['aes_key']
);
};

$pimple['mini_program'] = function ($pimple) {
$config = $pimple['config']->get('mini_program');
$pimple['mini_program.server'] = function ($pimple) {
$server = new Guard($pimple['config']['mini_program']['token']);
$server->debug($pimple['config']['debug']);
$server->setEncryptor($pimple['mini_program.encryptor']);

$server = new Guard($config['token']);
return $server;
};

$server->debug($pimple['config']['debug']);
$pimple['mini_program.staff'] = function ($pimple) {
return new Staff($pimple['mini_program.access_token']);
};

$pimple['mini_program.notice'] = function ($pimple) {
return new Notice($pimple['mini_program.access_token']);
};

$pimple['mini_program.material_temporary'] = function ($pimple) {
return new Temporary($pimple['mini_program.access_token']);
};

$server->setEncryptor($pimple['mini_program_encryptor']);
$pimple['mini_program.sns'] = function ($pimple) {
return new Sns(
$pimple['mini_program.access_token'],
$pimple['config']['mini_program']
);
};

return new MiniProgram(
$server,
$pimple['mini_program_access_token'],
$config
$pimple['mini_program.qrcode'] = function ($pimple) {
return new QRCode(
$pimple['mini_program.access_token'],
$pimple['config']['mini_program']
);
};

$pimple['mini_program'] = function ($pimple) {
return new MiniProgram($pimple);
};
}
}
11 changes: 3 additions & 8 deletions src/MiniProgram/Material/Temporary.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,12 @@

namespace EasyWeChat\MiniProgram\Material;

use EasyWeChat\Material\Temporary as BaseTemporary;
use EasyWeChat\Material\Temporary as MaterialTemporary;

/**
* Class Temporary.
*/
class Temporary extends BaseTemporary
class Temporary extends MaterialTemporary
{
public function __construct()
{
$accessToken = func_get_args()[0];

parent::__construct($accessToken);
}
//
}
82 changes: 3 additions & 79 deletions src/MiniProgram/MiniProgram.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,95 +26,19 @@

namespace EasyWeChat\MiniProgram;

use EasyWeChat\Core\Exceptions\InvalidArgumentException;
use EasyWeChat\MiniProgram\Material\Temporary;
use EasyWeChat\MiniProgram\Notice\Notice;
use EasyWeChat\MiniProgram\QRCode\QRCode;
use EasyWeChat\MiniProgram\Staff\Staff;
use EasyWeChat\MiniProgram\User\User;
use EasyWeChat\Support\Arr;
use EasyWeChat\Support\Traits\PrefixedContainer;

/**
* Class MiniProgram.
*
* @property \EasyWeChat\MiniProgram\Server\Guard $server
* @property \EasyWeChat\MiniProgram\User\User $user
* @property \EasyWeChat\MiniProgram\Sns\Sns $sns
* @property \EasyWeChat\MiniProgram\Notice\Notice $notice
* @property \EasyWeChat\MiniProgram\Staff\Staff $staff
* @property \EasyWeChat\MiniProgram\QRCode\QRCode $qrcode
* @property \EasyWeChat\MiniProgram\Material\Temporary $material_temporary
*/
class MiniProgram
{
/**
* Access Token.
*
* @var \EasyWeChat\MiniProgram\AccessToken
*/
protected $accessToken;

/**
* Mini program config.
*
* @var array
*/
protected $config;

/**
* Guard.
*
* @var \EasyWeChat\MiniProgram\Server\Guard
*/
protected $server;

/**
* Components.
*
* @var array
*/
protected $components = [
'user' => User::class,
'notice' => Notice::class,
'staff' => Staff::class,
'qrcode' => QRCode::class,
'material_temporary' => Temporary::class,
];

/**
* MiniProgram constructor.
*
* @param \EasyWeChat\MiniProgram\Server\Guard $server
* @param \EasyWeChat\MiniProgram\AccessToken $accessToken
* @param array $config
*/
public function __construct($server, $accessToken, $config)
{
$this->server = $server;

$this->accessToken = $accessToken;

$this->config = $config;
}

/**
* Magic get access.
*
* @param $name
*
* @return mixed
*
* @throws InvalidArgumentException
*/
public function __get($name)
{
if (property_exists($this, $name)) {
return $this->$name;
}

if ($class = Arr::get($this->components, $name)) {
return new $class($this->accessToken, $this->config);
}

throw new InvalidArgumentException("Property or component \"$name\" does not exists.");
}
use PrefixedContainer;
}
7 changes: 0 additions & 7 deletions src/MiniProgram/Notice/Notice.php
Original file line number Diff line number Diff line change
Expand Up @@ -57,13 +57,6 @@ class Notice extends BaseNotice
*/
protected $required = ['touser', 'template_id', 'form_id'];

public function __construct()
{
$accessToken = func_get_args()[0];

parent::__construct($accessToken);
}

/**
* Send notice message.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,11 @@
* @see http://overtrue.me
*/

namespace EasyWeChat\MiniProgram\User;
namespace EasyWeChat\MiniProgram\Sns;

use EasyWeChat\MiniProgram\Core\AbstractMiniProgram;

class User extends AbstractMiniProgram
class Sns extends AbstractMiniProgram
{
/**
* Api.
Expand Down
7 changes: 1 addition & 6 deletions src/MiniProgram/Staff/Staff.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,5 @@

class Staff extends BaseStaff
{
public function __construct()
{
$accessToken = func_get_args()[0];

parent::__construct($accessToken);
}
//
}
71 changes: 71 additions & 0 deletions src/Support/Traits/PrefixedContainer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
<?php

/*
* This file is part of the overtrue/wechat.
*
* (c) overtrue <i@overtrue.me>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/

/**
* Trait PrefixedContainer.php.
*
* Part of Overtrue\WeChat.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*
* @author mingyoung <mingyoungcheung@gmail.com>
* @copyright 2017
*
* @see https://github.com/overtrue
* @see http://overtrue.me
*/

namespace EasyWeChat\Support\Traits;

use EasyWeChat\Support\Str;
use Pimple\Container;

/**
* Trait PrefixedContainer.
*/
trait PrefixedContainer
{
/**
* Container.
*
* @var \Pimple\Container
*/
protected $container;

/**
* ContainerAccess constructor.
*
* @param \Pimple\Container $container
*/
public function __construct(Container $container)
{
$this->container = $container;
}

/**
* Gets a parameter or an object from pimple container.
*
* @param string $key The unique identifier for the parameter or object
*
* @return mixed The value of the parameter or an object
*
* @throws \InvalidArgumentException if the identifier is not defined
*/
public function __get($key)
{
$className = (new \ReflectionClass($this))->getShortName();

$name = Str::snake($className).'.'.$key;

return $this->container->offsetGet($name);
}
}
60 changes: 60 additions & 0 deletions tests/MiniProgram/MiniProgramServerGuardTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<?php

use EasyWeChat\MiniProgram\Server\Guard;
use EasyWeChat\Support\XML;
use Symfony\Component\HttpFoundation\Request;

class MiniProgramServerGuardTest extends TestCase
{
public function getServer($queries = [], $content = null)
{
$queries = array_merge([
'signature' => 'b4d6a65981dd51a8d6d022364500e4430fe5e577',
'timestamp' => '1490925589',
'nonce' => '1854495049',
], $queries);

return new Guard('Mi5u8if', new Request($queries, [], [], [], [], [], $content));
}

public function testValidateRequest()
{
$result = $this->getServer(['echostr' => '3804283725124844375'])->serve();

$this->assertEquals('3804283725124844375', $result->getContent());
}

public function testUserEnterSession()
{
$json = json_encode([
'ToUserName' => 'toUser',
'FromUserName' => 'fromUser',
'CreateTime' => 1482048670,
'MsgType' => 'event',
'Event' => 'user_enter_tempsession',
'SessionFrom' => 'sessionFrom',
]);
$xml = '<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1482048670</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[user_enter_tempsession]]></Event>
<SessionFrom><![CDATA[sessionFrom]]></SessionFrom>
</xml>';

$server = $this->getServer([], $json);

$res = $server->setMessageHandler(function ($message) {
$this->assertEquals('user_enter_tempsession', $message->Event);
})->serve();
$this->assertEquals('success', $res->getContent());

$server = $this->getServer([], $xml);

$res2 = $server->setMessageHandler(function ($message) {
$this->assertEquals('user_enter_tempsession', $message->Event);
})->serve();
$this->assertEquals('success', $res2->getContent());
}
}

0 comments on commit a59297f

Please sign in to comment.