Использование пакета non-laravel на Laravel 4

Можно ли включить пакет, который не был специально разработан для L4 в рамках? Если да, то как это делается? Я знаю, что мне нужно добавить пакет в мой composer.json который добавляет его в папку vendor , но могу ли я каким-либо образом зарегистрировать его в массиве providers ? нужны ли какие-либо другие шаги?

Я хотел бы использовать пакет проверки Google, первоначально разработанный для Yii

Использование сторонних композиционных пакетов с Laravel 4

Когда разработчики создают пакеты композиторов, они должны отображать автоматическую загрузку с использованием стандартов PSR-0 или PSR-4. Если это не так, могут возникнуть проблемы с загрузкой пакета в вашем приложении Laravel. Стандарт PSR-0:

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

И стандарт PSR-4:

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

В основном вышеприведенное является стандартом для того, чтобы рассказывать композитору, где искать файлы с именами. Если вы не используете свои собственные пространства имен, вам не нужно ничего настраивать.

СЦЕНАРИЙ 1

Стандартные следующие PSR-0 пакеты (с классом карт автозагрузки) в Laravel

Это простой пример, и, например, я буду использовать facebook php sdk, который можно найти:

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

Шаг 1:

Включите пакет в файл composer.json.

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

Шаг 2:

 run: composer update 

Шаг 3:

Поскольку в пакете facebook используется карта классов, из которой он работает, вы можете сразу начать использовать пакет. (Пример кода приведен непосредственно с обычного вида. Пожалуйста, сохраните свою логику из представлений в своем производственном приложении.)

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

СЦЕНАРИЙ 2

В этом примере я буду использовать обертку из instagram php api. Здесь нужно сделать некоторые настройки, чтобы загрузить пакет. Давайте попробуем! Пакет можно найти здесь:

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

Шаг 1:

Добавить в композитор .json

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

Затем вы можете нормально обновлять (обновление композитора)

Затем попробуйте использовать пакет, как вы делали с пакетом facebook. Опять же, это просто код в представлении.

 $instagramconfig = array( 'client_id' => 'secret', 'client_secret'=> 'secret', 'access_token' => 'secret' ); $api = Instaphp::Instance(null, $instagramconfig); var_dump($api); // Epic fail! 

Если вы попробуете приведенный выше пример, вы получите эту ошибку:

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

Поэтому нам нужно исправить эту проблему. Для этого мы можем изучить instagram composer.json, у которого есть автозагрузка, отличная от php facebook php sdk.

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

По сравнению с facebook composer.json:

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

(Composer обрабатывает различные типы автозагрузки, от файлов и карт классов до PSR. Посмотрите на свой vendor/composer/ папку, чтобы узнать, как это делается.)

Теперь нам придется загрузить класс вручную. Легко, просто добавьте это (сверху вашего контроллера, модели или вида):

 use Instaphp\Instaphp; 

композитор дамп-автозагрузка, и он работает!

step2 (необязательно)

Другой метод (если вы не хотите использовать инструкцию «use», вы можете просто сказать композитору искать файлы прямо из вашего кода. Просто измените экземпляр так:

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

Однако я предлагаю use инструкцию use чтобы дать понять другим разработчикам (и вашему будущему «я»), какие (внешние) классы / пакеты используются в программе.

СКЭНАРИО 3

Здесь мы используем Laravels, встроенный в контейнер IOC, для регистрации поставщиков услуг. Обратите внимание, что некоторые пакеты могут не подходить для этого метода. Я буду использовать тот же пакет Instagram, что и в сценарии 2.

Быстро и грязно

Если вам не нравятся шаблоны проектирования и поставщики услуг, вы можете связать класс следующим образом:

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

И вы разрешаете это так.

 App::make('Instaphp'); 

Быстрый и грязный конец

Если вы работаете над более крупным проектом и используете интерфейсы, вы, вероятно, должны абстрагировать привязки.

Шаг 1:

Создайте папку в папке вашего приложения, например, папку «поставщиков».

 app/providers 

Убедитесь, что Laravel автоматически загружает эту папку, вы можете передать некоторую дополнительную информацию в composer.json, например:

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

Теперь создайте файл в новой папке Instagram.php и поместите его внутрь:

  <?php use Illuminate\Support\ServiceProvider; class InstagramServiceProvider extends ServiceProvider { public function register() { $this->app->bind('Instaphp', function() { return new Instaphp\Instaphp; }); } } 

Теперь запустите компоновщик dump-autoload снова, и вы можете использовать пакет. Обратите внимание, что пакет instagram имеет final private function __construct() , это означает, что вы не можете использовать этот пакет вне исходного класса, не изменяя метод построения для публики. Я не говорю, что это хорошая практика, и я предлагаю использовать сценарий 2, в случае пакета instagram.

В любом случае, после этого вы можете использовать пакет следующим образом:

 $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! 

Добавьте "tvr/googlecheckout": "dev-master" это к вашему composer.json .

Запустите composer install , затем вы можете использовать контейнер IoC. Некоторые примеры кода можно найти в официальных документах для Laravel 4: http://four.laravel.com/docs/ioc#basic-usage