This commit is contained in:
chrosey
2017-09-13 07:52:34 +02:00
parent a1f16c37f4
commit 2340b0226b
24621 changed files with 2912161 additions and 149 deletions
+110
View File
@@ -0,0 +1,110 @@
<?php
namespace Laravel\Tinker\Console;
use Psy\Shell;
use Psy\Configuration;
use Illuminate\Console\Command;
use Symfony\Component\Console\Input\InputArgument;
class TinkerCommand extends Command
{
/**
* Artisan commands to include in the tinker shell.
*
* @var array
*/
protected $commandWhitelist = [
'clear-compiled', 'down', 'env', 'inspire', 'migrate', 'optimize', 'up',
];
/**
* The console command name.
*
* @var string
*/
protected $name = 'tinker';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Interact with your application';
/**
* Execute the console command.
*
* @return void
*/
public function fire()
{
$this->getApplication()->setCatchExceptions(false);
$config = new Configuration([
'updateCheck' => 'never'
]);
$config->getPresenter()->addCasters(
$this->getCasters()
);
$shell = new Shell($config);
$shell->addCommands($this->getCommands());
$shell->setIncludes($this->argument('include'));
$shell->run();
}
/**
* Get artisan commands to pass through to PsySH.
*
* @return array
*/
protected function getCommands()
{
$commands = [];
foreach ($this->getApplication()->all() as $name => $command) {
if (in_array($name, $this->commandWhitelist)) {
$commands[] = $command;
}
}
return $commands;
}
/**
* Get an array of Laravel tailored casters.
*
* @return array
*/
protected function getCasters()
{
$casters = [
'Illuminate\Support\Collection' => 'Laravel\Tinker\TinkerCaster::castCollection',
];
if (class_exists('Illuminate\Database\Eloquent\Model')) {
$casters['Illuminate\Database\Eloquent\Model'] = 'Laravel\Tinker\TinkerCaster::castModel';
}
if (class_exists('Illuminate\Foundation\Application')) {
$casters['Illuminate\Foundation\Application'] = 'Laravel\Tinker\TinkerCaster::castApplication';
}
return $casters;
}
/**
* Get the console command arguments.
*
* @return array
*/
protected function getArguments()
{
return [
['include', InputArgument::IS_ARRAY, 'Include file(s) before starting tinker'],
];
}
}
+95
View File
@@ -0,0 +1,95 @@
<?php
namespace Laravel\Tinker;
use Exception;
use Symfony\Component\VarDumper\Caster\Caster;
class TinkerCaster
{
/**
* Application methods to include in the presenter.
*
* @var array
*/
private static $appProperties = [
'configurationIsCached',
'environment',
'environmentFile',
'isLocal',
'routesAreCached',
'runningUnitTests',
'version',
'path',
'basePath',
'configPath',
'databasePath',
'langPath',
'publicPath',
'storagePath',
'bootstrapPath',
];
/**
* Get an array representing the properties of an application.
*
* @param \Illuminate\Foundation\Application $app
* @return array
*/
public static function castApplication($app)
{
$results = [];
foreach (self::$appProperties as $property) {
try {
$val = $app->$property();
if (! is_null($val)) {
$results[Caster::PREFIX_VIRTUAL.$property] = $val;
}
} catch (Exception $e) {
//
}
}
return $results;
}
/**
* Get an array representing the properties of a collection.
*
* @param \Illuminate\Support\Collection $collection
* @return array
*/
public static function castCollection($collection)
{
return [
Caster::PREFIX_VIRTUAL.'all' => $collection->all(),
];
}
/**
* Get an array representing the properties of a model.
*
* @param \Illuminate\Database\Eloquent\Model $model
* @return array
*/
public static function castModel($model)
{
$attributes = array_merge(
$model->getAttributes(), $model->getRelations()
);
$visible = array_flip(
$model->getVisible() ?: array_diff(array_keys($attributes), $model->getHidden())
);
$results = [];
foreach (array_intersect_key($attributes, $visible) as $key => $value) {
$results[(isset($visible[$key]) ? Caster::PREFIX_VIRTUAL : Caster::PREFIX_PROTECTED).$key] = $value;
}
return $results;
}
}
+40
View File
@@ -0,0 +1,40 @@
<?php
namespace Laravel\Tinker;
use Illuminate\Support\ServiceProvider;
use Laravel\Tinker\Console\TinkerCommand;
class TinkerServiceProvider extends ServiceProvider
{
/**
* Indicates if loading of the provider is deferred.
*
* @var bool
*/
protected $defer = true;
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
$this->app->singleton('command.tinker', function () {
return new TinkerCommand;
});
$this->commands(['command.tinker']);
}
/**
* Get the services provided by the provider.
*
* @return array
*/
public function provides()
{
return ['command.tinker'];
}
}