Skip to content

Commit

Permalink
Initial Commit
Browse files Browse the repository at this point in the history
  • Loading branch information
vagrant committed Mar 17, 2015
0 parents commit 8dec905
Show file tree
Hide file tree
Showing 16 changed files with 642 additions and 0 deletions.
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/vendor
composer.phar
composer.lock
.DS_Store
13 changes: 13 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
language: php

php:
- 5.4
- 5.5
- 5.6
- hhvm

before_script:
- travis_retry composer self-update
- travis_retry composer install --prefer-source --no-interaction --dev

script: phpunit
Empty file added README
Empty file.
24 changes: 24 additions & 0 deletions composer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{
"name": "cyvelnet/laravel5-fractal",
"description": "",
"authors": [
{
"name": "Cyvelnet",
"email": "cyvelnet@gmail.com"
}
],
"require": {
"php": ">=5.4.0",
"illuminate/support": "5.0.*",
"league/fractal" :"0.11.*"
},
"autoload": {
"classmap": [
"src/migrations"
],
"psr-0": {
"Cyvelnet\\Laravel5Fractal\\": "src/"
}
},
"minimum-stability": "stable"
}
18 changes: 18 additions & 0 deletions phpunit.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
bootstrap="vendor/autoload.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="false"
>
<testsuites>
<testsuite name="Package Test Suite">
<directory suffix=".php">./tests/</directory>
</testsuite>
</testsuites>
</phpunit>
159 changes: 159 additions & 0 deletions src/Cyvelnet/Laravel5Fractal/Commands/TransformerGeneratorCommand.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
<?php namespace Cyvelnet\Laravel5Fractal\Commands;

use Illuminate\Config\Repository as Config;
use Illuminate\Console\Command;
use Illuminate\Filesystem\Filesystem as File;
use Illuminate\View\Factory as View;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputOption;

/**
* Class TransformerGeneratorCommand
* @package Cyvelnet\Laravel5Fractal\Commands
*/
class TransformerGeneratorCommand extends Command
{

/**
* The console command name.
*
* @var string
*/
protected $name = 'make:transformer';

/**
* The console command description.
*
* @var string
*/
protected $description = 'Display an inspiring quote';
/**
* @var
*/
private $view;
/**
* @var
*/
private $namespace;
/**
* @var
*/
private $directory;
/**
* @var Config
*/
private $config;
/**
* @var File
*/
private $file;

/**
* @param View $view
*/
function __construct(Config $config, View $view, File $file)
{
parent::__construct();
$this->config = $config;
$this->view = $view;
$this->file = $file;
}

/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
try {

// replace all space after ucwords
$classname = preg_replace('/\s+/', '', ucwords($this->argument('name')));

//retrieves store directory configuration
$directory = app_path($this->option('directory') ? $this->option('directory') : $this->config->get('fractal
.directory'));
//retrieves namespace configuration
$namespace = $this->option('namespace') ? $this->option('namespace') : $this->config->get('fractal.namespace');
is_dir($directory) ?: $this->file->makeDirectory($directory, 0755, true);

$create = true;

if ($this->file->exists("{$directory}/{$classname}.php")) {
if ($usrResponse = strtolower($this->ask("The file ['{$classname}'] already exists, overwrite? [y/n]",
null))
) {
switch ($usrResponse) {
case 'y' :
$tempFileName = "{$directory}/{$classname}.php";

$prefix = '_';
while ($this->file->exists($tempFileName)) {
$prefix .= '_';
$tempFileName = "{$directory}/{$prefix}{$classname}.php";
}
rename("{$directory}/{$classname}.php", $tempFileName);
break;
default:
$this->info('No file has been created.');
$create = false;
}
}

}

// loading transformers template from views
$view = \View::make('fractal::transformer',
['namespace' => $namespace, 'classname' => $classname]);


if ($create) {
$this->file->put("{$directory}/{$classname}.php", $view->render());
$this->info("The class {$classname} generated successfully.");
}


} catch (\Exception $e) {
$this->error('Transformer creation failed.');
}


}

/**
* @return array
*/
protected function getArguments()
{
return array(
array('name', InputArgument::REQUIRED, 'Name of the transformer class'),
);
}

/**
* @return array
*/
protected function getOptions()
{

return array(
array(
'directory',
null,
InputOption::VALUE_OPTIONAL,
'transformer store directory (relative to App\)',
null
),
array(
'namespace',
null,
InputOption::VALUE_OPTIONAL,
'transformer namespace',
null
),
);
}


}
19 changes: 19 additions & 0 deletions src/Cyvelnet/Laravel5Fractal/Facades/Fractal.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php namespace Cyvelnet\Laravel5Fractal\Facades;

use Illuminate\Support\Facades\Facade;

/**
* Class Fractal
* @package Cyvelnet\Laravel5Fractal\Facades
*/
class Fractal extends Facade
{
/**
* @return string
*/
protected static function getFacadeAccessor()
{
return 'fractal';
}

}
134 changes: 134 additions & 0 deletions src/Cyvelnet/Laravel5Fractal/FractalServices.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
<?php namespace Cyvelnet\Laravel5Fractal;

use Cyvelnet\Laravel5Fractal\Paginators\IlluminateLengthAwarePaginatorAdapter;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Pagination\Paginator;
use League\Fractal\Manager;
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
use League\Fractal\Pagination\PaginatorInterface;
use League\Fractal\Resource\Collection;
use League\Fractal\Resource\Item;
use League\Fractal\Resource\ResourceInterface;
use League\Fractal\TransformerAbstract;
use Response;

/**
* Class FractalServices
* @package Cyvelnet\Laravel5Fractal
*/
class FractalServices
{

/**
* @var Manager
*/
private $manager;

/**
* @param Manager $fractalManager
*/
public function __construct(Manager $manager)
{
$this->manager = $manager;
}

/**
* @return mixed
*/
public function getManager()
{
return $this->manager;
}

/**
* includes sub level data transformer.
* @param array $includes
* @return $this
*/
public function includes($includes = [])
{
$this->manager->parseIncludes($includes);
return $this;
}

/**
* set data transformation recursion limit
* @param $limit
* @return $this
*/
public function setRecursionLimit($limit)
{
$this->manager->setRecursionLimit($limit);
return $this;
}

/**
* set data serializer
* @param \League\Fractal\Serializer\SerializerAbstract $serializer
* @return $this
*/
public function setSerializer(\League\Fractal\Serializer\SerializerAbstract $serializer)
{
$this->manager->setSerializer($serializer);
return $this;
}

/**
* transform item
* @param $item
* @param TransformerAbstract $transformer
* @param null $resourceKey
* @return mixed
*/
public function item($item, TransformerAbstract $transformer, $resourceKey = null)
{
$resource = new Item($item, $transformer, $resourceKey);

return $this->response($resource);
}

/**
* transform a collection
* @param $items
* @param TransformerAbstract $transformer
* @param null $resourceKey
* @param PaginatorInterface $adapter
* @return mixed
* @internal param Closure $callback
*/
public function collection(
$items,
TransformerAbstract $transformer,
$resourceKey = null,
PaginatorInterface $adapter = null
) {
$resources = new Collection($items, $transformer, $resourceKey);

if ($items instanceof Paginator OR $items instanceof LengthAwarePaginator) {

// for some reason in laravel5, we might not always receive a LengthAwarePaginator
if ($items instanceof LengthAwarePaginator and is_null($adapter)) {
$adapter = new IlluminateLengthAwarePaginatorAdapter($items);
} else {
if ($items instanceof Paginator and is_null($adapter)) {
$adapter = new IlluminatePaginatorAdapter($items);
}
}

$resources->setPaginator($adapter);

}
return $this->response($resources);
}

/**
* return result array as json
* @param ResourceInterface $resource
* @return mixed
*/
private function response(ResourceInterface $resource)
{
$fratalData = $this->manager->createData($resource);
return Response::json($fratalData->toArray());
}
}
Loading

0 comments on commit 8dec905

Please sign in to comment.