Créér et configurer une nouvelle ressource

app/Domain/{ResourceName}
--> {ResourceName}.php // resource model eloquent
--> {ResourceName}Service.php // resource service
--> {ResourceName}Transformer.php // resource transformer
--> {ResourceName}Validator.php // resource validator

app/Http/Controllers/Api/v1
--> {ResourceName}Controller.php // resource controller

ceci est juste une idée d'une bonne pratique à adopter pour classer ses resources api

Création du model Eloquent

model eloquent classique étendant de la superClasse Skimia\ApiFusion\Domain\ResourceServiceModel (simple classe étendant de Eloquent et implémentant l'interface Skimia\ApiFusion\Domain\Contracts\ResourceServiceModelContract)

Seule l'interface est requise (pour permettre de délivrer autre chose que des models BDD)

Attention touts les champs modifiables grâce à l'API doivent être dans l'attribut $fillable

Exemple de model

namespace App\Domain\Packages;

use Skimia\ApiFusion\Domain\ResourceServiceModel;

class Package extends ResourceServiceModel {

    protected $fillable = ['name','description'];
}

Création du validator

les validateur utilisent le package fadion/validator-assistant pour plus d'infos pour ecrire les validators veuillez consulter sa documentation

Exemple de validator

namespace App\Domain\Packages;

use Skimia\ApiFusion\Domain\Contracts\InputValidatorContract;
use Fadion\ValidatorAssistant\ValidatorAssistant;

class PackageValidator extends ValidatorAssistant implements InputValidatorContract{

    protected $rules = [
        'name' => 'required|noWhitespace|alnum:-/|length:5,25|unique:packages,name,{id}',
        'description' => 'required|length:10'
    ];

    protected $messages = [
        'name.required' => 'Package Name is Required',
    ];
}

Creation du service

le resourceService est le scotch entre le model eloquent, son validator ( et ses filtres ), ainsi que toutes les régles de sécurité c'est le manager sécurisé du model eloquent.

Exemple de service

namespace App\Domain\Packages;

use Skimia\ApiFusion\Domain\ResourceService;

class PackageService extends ResourceService{

    /**
     * Set the resource's model and validator
     */
    public function __construct()
    {
        parent::__construct(
            new Package, //le model
            new PackageValidator //sa classe de validation
        );
    }

    protected function readAuthorised()
    {
        return true;//autorise tout le monde à lire une ou la liste des resources
    }

    protected function storeAuthorised()
    {
        return true;//autorise tout le monde à ajouter/modfier une resource
    }

    protected function destroyAuthorised()
    {
        return true; //autorise tout le monde à supprimer une resource
    }

}

Création du transformer

les transformer utilisent le package league/fractal pour plus d'infos pour ecrire les classes transformer veuillez consulter sa documentation

Exemple de transformer

namespace App\Domain\Packages;

use League\Fractal\TransformerAbstract;

class PackageTransformer extends TransformerAbstract{

    /**
     * Transform resource into standard output format with correct typing
     * @param Package $package  Resource being transformed
     * @return array              Transformed object array ready for output
     */
    public function transform(Package $package)
    {
        return [
            'id'            => (int) $package->id,
            'name'          => $package->name,
            'description'   => $package->description,
            'links'         => [
                [
                    'rel' => 'self',
                    'uri' => (url('skimia.api.svc').'/packages/'. $package->id),//method url à changer pour avoir le veritable skimia.api.svc en fonction de la configuration au lieu de le mettre en brut
                ]
            ],
        ];
    }
}

Creation du controller

le resourceController est le scotch entre le service, sa représentation ( son transformer ), ainsi que le lien avec le router

Exemple de controller API

namespace App\Http\Controllers\Api\v1;

use App\Domain\Packages\PackageService;
use App\Domain\Packages\PackageTransformer;
use Skimia\ApiFusion\Http\Controllers\Api\ResourceServiceController;

//utilisation de l'annotation @ApiResource pour lier le controller au router d'api
/**
 * Class PackagesController
 * @package App\Http\Controllers\Api\v1
 *
 * @ApiResource("packages", version="v1" , except={"create", "edit"})
 *
 */
class PackagesController extends ResourceServiceController{

    /**
     * Set the service and transformer classes
     */
    public function __construct()
    {
        parent::__construct();
        $this->service = new PackageService;
        $this->transformer = new PackageTransformer;
    }
}

Commande de génération

api-fusion:generate.domain vous permet en répondant a quelques questions de générer l'ensemble des classes nécésaires a l'utilisation et la configuration d'une resource d'api