add options to service container

This commit is contained in:
printempw 2016-08-28 22:15:09 +08:00
parent b7dc5e395e
commit ca775a2809
6 changed files with 207 additions and 79 deletions

View File

@ -24,5 +24,6 @@ class AppServiceProvider extends ServiceProvider
public function register()
{
$this->app->singleton('database', \App\Services\Database\Database::class);
$this->app->singleton('option', \App\Services\OptionRepository::class);
}
}

View File

@ -1,6 +1,6 @@
<?php
namespace App\Services;
namespace App\Services\Facades;
use \Illuminate\Support\Facades\Facade;

View File

@ -0,0 +1,18 @@
<?php
namespace App\Services\Facades;
use \Illuminate\Support\Facades\Facade;
class Option extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return 'option';
}
}

View File

@ -1,76 +0,0 @@
<?php
namespace App\Services;
use \Illuminate\Database\Eloquent\Model;
use \Exception;
class Option
{
public static function get($key, $default_value = null)
{
$option = OptionModel::where('option_name', $key)->first();
if (!$option) {
if (!is_null($default_value)) {
return $default_value;
} else {
$options = require BASE_DIR."/config/options.php";
if (array_key_exists($key, $options)) {
self::add($key, $options[$key]);
return $options[$key];
}
throw new Exception('Unexistent option.', 1);
}
}
return $option->option_value;
}
public static function set($key, $value)
{
$option = OptionModel::where('option_name', $key)->first();
if (!$option)
throw new Exception('Unexistent option.', 1);
$option->option_value = $value;
return $option->save();
}
public static function add($key, $value)
{
if (self::has($key))
return true;
$option = new OptionModel;
$option->option_name = $key;
$option->option_value = $value;
$option->save();
}
public static function has($key)
{
try {
OptionModel::where('option_name', $key)->firstOrFail();
} catch (\Illuminate\Database\Eloquent\ModelNotFoundException $e) {
return false;
}
return true;
}
public static function delete($key)
{
OptionModel::where('option_name', $key)->delete();
}
}
class OptionModel extends Model
{
protected $table = 'options';
public $timestamps = false;
protected $fillable = ['option_value'];
}

View File

@ -0,0 +1,185 @@
<?php
namespace App\Services;
use DB;
use ArrayAccess;
use Illuminate\Support\Arr;
use Illuminate\Contracts\Config\Repository as ConfigContract;
class OptionRepository implements ArrayAccess, ConfigContract
{
/**
* All of the option items.
*
* @var array
*/
protected $items = [];
protected $items_modified = [];
/**
* Create a new option repository.
*
* @return void
*/
public function __construct()
{
$options = DB::table('options')->get();
foreach ($options as $option) {
$this->items[$option->option_name] = $option->option_value;
}
}
/**
* Determine if the given option value exists.
*
* @param string $key
* @return bool
*/
public function has($key)
{
return Arr::has($this->items, $key);
}
/**
* Get the specified option value.
*
* @param string $key
* @param mixed $default
* @return mixed
*/
public function get($key, $default = null)
{
return Arr::get($this->items, $key, $default);
}
/**
* Set a given option value.
*
* @param array|string $key
* @param mixed $value
* @return void
*/
public function set($key, $value = null)
{
if (is_array($key)) {
foreach ($key as $innerKey => $innerValue) {
Arr::set($this->items, $innerKey, $innerValue);
$this->items_modified[] = $innerKey;
}
} else {
Arr::set($this->items, $key, $value);
$this->items_modified[] = $key;
}
}
protected function save()
{
$this->items_modified = array_unique($this->items_modified);
foreach ($this->items_modified as $key) {
DB::table('options')
->where('option_name', $key)
->update(['option_value' => $this[$key]]);
}
}
/**
* Prepend a value onto an array option value.
*
* @param string $key
* @param mixed $value
* @return void
*/
public function prepend($key, $value)
{
$array = $this->get($key);
array_unshift($array, $value);
$this->set($key, $array);
}
/**
* Push a value onto an array option value.
*
* @param string $key
* @param mixed $value
* @return void
*/
public function push($key, $value)
{
$array = $this->get($key);
$array[] = $value;
$this->set($key, $array);
}
/**
* Get all of the option items for the application.
*
* @return array
*/
public function all()
{
return $this->items;
}
/**
* Determine if the given option option exists.
*
* @param string $key
* @return bool
*/
public function offsetExists($key)
{
return $this->has($key);
}
/**
* Get a option option.
*
* @param string $key
* @return mixed
*/
public function offsetGet($key)
{
return $this->get($key);
}
/**
* Set a option option.
*
* @param string $key
* @param mixed $value
* @return void
*/
public function offsetSet($key, $value)
{
$this->set($key, $value);
}
/**
* Unset a option option.
*
* @param string $key
* @return void
*/
public function offsetUnset($key)
{
$this->set($key, null);
}
/**
* Save all modified options into database
*/
public function __destruct()
{
$this->save();
}
}

View File

@ -215,12 +215,12 @@ return [
* Blessing Skin
*/
'View' => App\Services\View::class,
'Option' => App\Services\Option::class,
'Option' => App\Services\Facades\Option::class,
'Utils' => App\Services\Utils::class,
'Minecraft' => App\Services\Minecraft::class,
'Validate' => App\Services\Validate::class,
'Updater' => App\Services\Updater::class,
'Database' => App\Services\Database::class,
'Database' => App\Services\Facades\Database::class,
'Http' => App\Services\Http::class
],