在Laravel 4上使用非laravel包
是否可以在框架中包含一个不是专门为L4devise的软件包? 如果是这样,那怎么办? 我知道我需要将该包添加到我的composer.json
,它将其添加到vendor
文件夹,但我可以在providers
数组中注册它? 还有其他必要的步骤吗?
我想使用最初为Yiidevise的Google checkout软件包
与Laravel 4一起使用第三方composer php软件包
当开发人员创buildComposer软件包时,他们应该使用PSR-0或PSR-4标准来映射自动加载。 如果情况并非如此,则可能会在Laravel应用程序中加载该程序包时出现问题。 PSR-0标准是:
{ "autoload": { "psr-0": { "Acme": "src/" } } }
而PSR-4标准:
{ "autoload": { "psr-4": { "Acme\\": "src/" } } }
基本上讲,这是一个告诉composer php在哪里寻找名字间隔文件的标准。 如果你不使用你自己的命名空间,你不必configuration任何其他的东西。
情景1
在Laravel中使用PSR-0标准包(带自动加载类映射)
这是一个简单的例子,我会使用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的包装器。 在这里需要做一些调整来获取包装。 试一试吧! 该包可以在这里find:
https://packagist.org/packages/fishmarket/instaphp
步骤1:
添加到composer php.json
"require": { "laravel/framework": "4.0.*", "fishmarket/instaphp": "dev-master" }
然后你可以正常更新(composer php更新)
接下来尝试像使用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,它的自动加载不像facebook php sdk。
"autoload": { "psr-0": { "Instaphp": "." } }
与facebook composer.json相比:
"autoload": { "classmap": ["src"] }
(composer php处理不同types的自动加载,从文件和class级地图到PSR。看看你的vendor/composer/
文件夹,看看它是如何完成的。
现在我们将不得不手动加载这个类。 它很容易,只需添加(控制器,模型或视图的顶部):
use Instaphp\Instaphp;
composer php转储自动加载,它的工作原理!
第二步(可选)
另一种方法是(如果你不想使用“use”语句,你可以直接告诉作曲者直接从你的代码中查找文件,只需要像这样更改实例:
// reference the name-spaced class straight in the code $api = Instaphp\Instaphp::Instance(null, $instagramconfig); var_dump($api); // It works
不过,我build议使用use
语句向其他开发人员(以及将来的自己)清楚程序中使用的是什么(外部)类/包。
情景3
这里我们使用IOC容器中的Laravels来注册服务提供者。 请注意,有些软件包可能不适合这种方法。 我将使用与场景2中相同的Instagram包。
快速和肮脏
如果你不关心devise模式和服务提供者,你可以像这样绑定一个类:
App::bind('Instaphp', function($app) { return new Instaphp\Instaphp; });
你就这样解决它。
App::make('Instaphp');
快速和肮脏的结局
如果您正在开发一个更大的项目,并且使用了接口,那么您应该进一步提取绑定。
步骤1:
在您的应用程序文件夹内创build一个文件夹,例如“providers”文件夹。
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的新文件夹中创build一个文件,并将其放在里面:
<?php use Illuminate\Support\ServiceProvider; class InstagramServiceProvider extends ServiceProvider { public function register() { $this->app->bind('Instaphp', function() { return new Instaphp\Instaphp; }); } }
现在运行composer dump-autoload,你可以使用这个包。 请注意,instagram包有一个final private function __construct()
,这意味着你不能在原来的类之外使用该包,而不必将构造方法改为public。 我不是说这是一个很好的做法,我build议在instagram包的情况下使用场景2。
无论如何,在这之后,你可以使用这样的包:
$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的官方文档中find: http ://four.laravel.com/docs/ioc#basic-usage