43 votes

Utilisation d'un paquetage non-laravel sur Laravel 4

Est-il possible d'inclure dans le cadre un paquet qui n'a pas été spécifiquement conçu pour L4 ? Si oui, comment faire ? Je sais que je dois ajouter le paquet à mon composer.json qui l'ajoute à la vendor mais puis-je l'enregistrer d'une manière ou d'une autre dans le dossier providers array ? y a-t-il d'autres étapes nécessaires ?

Je voudrais utiliser le Paquet de caisse Google conçu à l'origine pour Yii

100voto

stormpat Points 1546

L'aide de tiers compositeur paquets avec Laravel 4

Lorsque les développeurs de créer compositeur paquets, ils devraient la carte de l'auto-chargement à l'aide de PSR-0 ou PSR-4 normes. Si ce n'est pas le cas, il peut y avoir des problèmes de chargement du package de votre application Laravel. Le PSR-0 standard est:

{
    "autoload": {
        "psr-0": { "Acme": "src/" }
    }
}

Et le PSR-4 standard:

{
    "autoload": {
         "psr-4": { "Acme\\": "src/" }
    }
}

Fondamentalement, le ci-dessus est un standard pour raconter compositeur où chercher pour le nom interligne fichiers. Si vous n'utilisez pas vos propres espaces de noms, vous n'avez pas à configurer quoi que ce soit d'autre.

SCÉNARIO 1

PSR-0 standard paquets suivants (avec chargement automatique classmap) dans Laravel

C'est simple, et pour l'exemple, je vais utiliser le facebook sdk php, qui peut être trouvé:

https://packagist.org/packages/facebook/php-sdk

Étape 1:

Inclure l'emballage de votre compositeur.fichier json.

"require": {
    "laravel/framework": "4.0.*",
    "facebook/php-sdk": "dev-master"
}

Étape 2:

run: composer update

Étape 3:

Parce que le facebook utilise un package de la classe de la carte son travail hors de la boîte, vous pouvez commencer à utiliser le package instantanément. (L'exemple de code ci-dessous est livré directement à partir de l'affichage normal. Veuillez vous en tenir à la logique de partir de points de vue dans votre production, app.)

$facebook = new Facebook(array(
    'appId'  => 'secret',
    'secret' => 'secret'
));
var_dump($facebook); // It works!

SCÉNARIO 2

Pour cet exemple, je vais utiliser un wrapper de la instagram php api. Ici, il doit y avoir fait quelques ajustements pour obtenir le package chargé. Permet de lui donner un essai! Le package peut être trouvé ici:

https://packagist.org/packages/fishmarket/instaphp

Étape 1:

Ajouter au compositeur .json

"require": {
    "laravel/framework": "4.0.*",
    "fishmarket/instaphp": "dev-master"
}

Ensuite, vous pouvez mettre à jour normalement (compositeur de mise à jour)

Ensuite essayez d'utiliser le package comme vous l'avez fait avec le facebook paquet. Encore une fois, c'est juste le code dans une vue.

$instagramconfig = array(
    'client_id' => 'secret',
    'client_secret'=> 'secret',
    'access_token' => 'secret'
);

$api = Instaphp::Instance(null, $instagramconfig);                
var_dump($api); // Epic fail!

Si vous essayez de l'exemple ci-dessus, vous obtiendrez ce message d'erreur:

FatalErrorException: Error: Class 'Instaphp' not found in ...

Nous avons donc besoin de résoudre ce problème. Pour ce faire, nous pouvons examiner l'instagram compositeur.json, qui a son autoload différente de l'facebook sdk php eu.

"autoload": {
         "psr-0": { "Instaphp": "." }
    }

Par rapport à la facebook compositeur.json:

"autoload": {
        "classmap": ["src"]
    }

(Compositeur traite différents types de chargement automatique, à partir de fichiers et de classe-cartes de RP. Jetez un oeil à votre vendor/composer/ le dossier pour voir comment c'est fait.)

Maintenant, nous allons avoir à charger la classe, manuellement. C'est simple, il suffit d'ajouter ce (en haut de votre contrôleur, modèle ou de la vue):

use Instaphp\Instaphp;

compositeur de la benne de chargement automatique, et ça marche!

étape 2 (facultatif)

Une autre méthode consiste (si vous ne voulez pas utiliser l'instruction "use", vous pouvez simplement dire compositeur pour rechercher les fichiers directement à partir de votre code. Il suffit de changer l'Instance comme suit:

// reference the name-spaced class straight in the code
$api = Instaphp\Instaphp::Instance(null, $instagramconfig); 
var_dump($api); // It works

Cependant, je suggère à l'aide de l' usedéclaration à faire comprendre aux autres développeurs (et votre soi futur) quel (externe) classes/les paquets sont utilisés dans le programme.

SCÉNARIO 3

Ici, nous utilisons la Laravels construit dans le conteneur IOC pour enregistrer les fournisseurs de services. Veuillez noter que certains paquets peuvent ne pas être adaptés à cette méthode. Je vais utiliser le même Instagram paquet comme dans le scénario 2.

Rapide et sale

Si vous n'avez pas de soins sur les design patterns et les fournisseurs de services, vous pouvez lier une classe comme ceci:

App::bind('Instaphp', function($app)
{
    return new Instaphp\Instaphp;
});

Et vous le résoudre comme ça.

App::make('Instaphp');

Rapide et sale à la fin

Si vous travaillez sur un projet de plus grande envergure, et de vous faire utiliser des interfaces, vous devriez probablement abstrait les liaisons plus loin.

Étape 1:

Créer un dossier dans votre dossier app, par exemple un 'fournisseurs' dossier.

app/providers

Assurez-vous que Laravel auto-charge de ce dossier, vous pouvez passer quelques informations supplémentaires au compositeur.json, comme ceci:

"autoload": {

    "classmap": [
        "app/commands",
        "app/controllers",
        "app/models",
        "app/database/migrations",
        "app/database/seeds",
        "app/tests/TestCase.php",
        "app/providers" // this was added
    ]

},

Maintenant, créez un Fichier dans le nouveau dossier appelé Instagram.php et les place à l'intérieur:

 <?php

    use Illuminate\Support\ServiceProvider;

    class InstagramServiceProvider extends ServiceProvider {

    public function register()
    {
        $this->app->bind('Instaphp', function()
        {
            return new Instaphp\Instaphp;
        });

    }

}

Maintenant, exécutez le compositeur de vidage-autoload de nouveau, et vous pouvez utiliser le package. Notez que le instagram paquet a un final private function __construct(), cela signifie que vous ne pouvez pas utiliser ce package à l'extérieur de la classe d'origine, sans modification de la méthode de construction pour le public. Je ne dis pas que c'est une bonne pratique, et je vous suggérons d'utiliser le scénario 2, dans le cas de l'instagram de package.

De toute façon, après cela, vous pouvez utiliser le paquet comme ça:

$instagramInstance = App::make('Instaphp');

$instagramconfig = array(
    'client_id' => 'secret',
    'client_secret'=> 'secret',
    'access_token' => 'secret'
 );

$instagram = new $instagramInstance();
$userfeed = $instagram->Users->feed($instagramconfig);

var_dump($userfeed); // It works!

1voto

conradk Points 1212

Añadir "tvr/googlecheckout": "dev-master" à votre composer.json .

Exécuter composer install alors vous pouvez utiliser le conteneur IoC. Vous trouverez des exemples de code dans la documentation officielle de Laravel 4 : http://four.laravel.com/docs/ioc#basic-usage

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X