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',
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.
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);
}
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
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.
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.
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.
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.