web-dev-qa-db-fra.com

Laravel Interfaces

J'ai utilisé le tutoriel suivant pour me faire une idée des interfaces:

http://vegibit.com/what-is-a-laravel-interface/

Mais je voulais changer le répertoire d'où je mets mes interfaces en "App/Models/Interfaces". Et c'est ce que j'ai fait. Mais maintenant, je ne peux plus le faire fonctionner. Voici mon code:

Routes.php

App::bind('CarInterface', 'Subaru');

Route::get('subaru', function()
{
$car = App::make('CarInterface');  
$car->start();
$car->gas();
$car->brake(); 
});

Modèle Subaru.php

<?php

use App\Models\Interfaces\CarInterface;

class Subaru implements CarInterface {

..etc

Interface CarInterface

<?php namespace App\Models\Interfaces;

interface CarInterface {
public function start();
public function gas();
public function brake();
}

J'ai ajouté ceci dans mon composer.json:

"psr-0": {
"Interfaces": "app/models/interfaces"
}

Et j'ai même ajouté ceci dans mon fichier start/global.php:

ClassLoader::addDirectories(array(

app_path().'/models/interfaces',
16
Hardist

Dans mon récent projet laravel 5, je suis habitué à préparer mes logiques en tant que méthode de référentiel. Voici donc ma structure de répertoire actuelle. Par exemple, nous avons 'Car'.

Donc, je crée d'abord un répertoire, appelez-le libs sous app répertoire et chargez-le dans composer.json

"autoload": {
        "classmap": [
            "database",
            "app/libs" //this is the new changes (remove this comment)
        ]
    }

après cela, je crée un sous-dossier appelez-le Car. Sous le dossier Car, créez deux fichiers 'CarEloquent.php' pour une implémentation éloquente et CarInterface.php comme interface.

CarInterface

namespace App\libs\Car;
interface CarInterface {
    public function getAll();
    public function create(array $data);
    public function delete($id);
    public function getByID($id);
    public function update($id,array $data);
}

CarEloquent

namespace App\lib\Car;

use App\lib\Car\CarInterface;
use App\Car; //car model
class CarEloquent implements CarInterface {
    protected $car;

    function __construct(Car $a) {
        $this->car = $a;
    }
    public function getAll(){
        return $this->car->all();
    }
}

Créez ensuite Car Service Provider pour lier le contrôleur ioc. Pour créer un fournisseur de services de voiture, vous pouvez également utiliser la commande php artisan de laravel. php artisan make:provider CarServiceProvider

Fournisseur de services

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class CarServiceProvider extends ServiceProvider {
   public function register() {
        $this->app->bind('App\lib\Car\CarInterface', 'App\lib\Car\CarEloquent');
    }

}

Et la dernière étape serait d'ajouter ces fournisseurs de services à config/app.php tableau de fournisseurs.

'providers' => [
  'App\Providers\CatServiceProvider',
]

Et enfin, nous sommes prêts à utiliser notre méthode de référentiel dans notre contrôleur.

Exemple de contrôleur

namespace App\Http\Controllers;
use App\lib\Car\CarInterface as Car;
class CarController extends Controller {
    protected $carObject;
    public function __construct(Car $c) {
        $this->carObject = $c;
    }
    public function getIndex(){
        $cars = $this->carObject->getAll();
        return view('cars.index')->with('cars',$cars);
    }
}

Objectif principal pour atteindre ici la méthode de référentiel d'appel au contrôleur, mais vous devez les utiliser selon vos besoins.

Mettre à jour

CarEloqent nous aide essentiellement à améliorer l'implémentation de la base de données, par exemple à l'avenir si vous souhaitez implémenter la même fonctionnalité pour une autre base de données comme redis il vous suffit d'ajouter une autre classe CarRedis et de modifier le chemin du fichier d'implémentation à partir du fournisseur de serveur.

Mise à jour 1: bonne ressource

http://programmingarehard.com/2014/03/12/what-to-return-from-repositories.html

[livre] De l'apprenti à l'artisan par Taylor Otwell

Très bonne explication sur la méthode du référentiel et le principe de conception logicielle communément appelé séparation des préoccupations. Tu devrais lire ce livre.

Si vous avez encore de la confusion pour obtenir ces comportements, faites le moi savoir et cependant je garderai un œil sur cette question pour mettre à jour cette réponse, si je trouve des choses à changer ou à mettre à jour ou selon les exigences.

25
Safoor Safdar