Ответ 1
Использование сторонних композиционных пакетов с 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;
композитор dump-autoload, и он работает!
шаг2 (необязательно)
Другой метод (если вы не хотите использовать инструкцию "use", вы можете просто сказать композитору искать файлы прямо из вашего кода. Просто измените экземпляр так:
// reference the name-spaced class straight in the code
$api = Instaphp\Instaphp::Instance(null, $instagramconfig);
var_dump($api); // It works
Однако я предлагаю использовать оператор 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!