Можно ли включить пакет, который не был специально разработан для 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