欢迎各位兄弟 发布技术文章
这里的技术是共享的
插件包是Laravel 3.0 改进中最核心的部分。插件包让我们能更加方便的把代码组织到一个模块中。每个插件包都可以包含自己的视图、设置、路由、数据库迁移、任务等。你可以把插件包用到任何地方,它可以是一个对象关系数据库映射,也可以是一个强大的身份验证系统。插件包的代码模块化是驱动Laravel所有设计决策的重要方面。你甚至可以把整个application目录看作是一个Laravel框架默认加载和使用的插件包。
在创建一个插件包之前,你必须在bundles目录为它新建一个文件夹。比如我们要建立一个"admin"插件包,作为我们应用的管理后台。在application/start.php文件中提供的基本配置可以帮助我们限定应用程序如何运行。同样,我们要在新建的插件包文件夹中创建一个start.php文件,每次加载插件包的时候它都会运行。让我们来创建它:
<?php
Autoloader::namespaces(array(
'Admin' => Bundle::path('admin').'models',
));
在这个start文件中,我们让自动加载类自动加载在admin命名空间中定义的models目录下的类。你可以在start文件中做任何事情,但是通常情况下,我们用它来自动加载需要的文件。事实上,你并不一定要为应用包建立一个启动文件。
然后,我们来看怎么为应用程序注册一个插件包!
先我们建立了一个admin插件包,我们需要在Laravel中注册它。打开application/bundles.php文件。我们应用程序使用的所有插件包都在这里注册的。让我们把admin插件包添加进去:
return array('admin'),
默认情况下,Laravel会假设Admin插件包是在插件目录的根目录下,但是我们也可以自定义插件包路径。
return array(
'admin' => array('location' => 'userscape/admin'),
);
现在Laravel会在bundles/userscape/admin目录中寻找admin插件包。
通常情况下,插件包的start.php文件只包含了自动加载注册信息。因此有时候你希望跳过start.php文件,直接在注册数组中声明自己的插件包映射信息。可以用下面的方法:
return array(
'admin' => array(
'autoloads' => array(
'map' => array(
'Admin' => '(:bundle)/admin.php',
),
'namespaces' => array(
'Admin' => '(:bundle)/lib',
),
'directories' => array(
'(:bundle)/models',
),
),
),
);
请注意,这里的每一项设置都对应Laravelauto-loader中的一个函数。事实上,每一项设置的参数都会自动传递给auto-loader中对应的函数。
你还要注意下(:bundle)占位符。它会自动替换为插件包的路径。
现在我们已经创建并注册了插件包,但是我们还不能使用它,我们需要先启动它:
Bundle::start('admin');
这行代码告诉Laravel执行插件包的start.php文件,并在auto-loader中注册。如果插件包存在routes.php文件,start方法也会自动加载。
Note: 插件包只会启动一次,重复的请求都会被start方法忽略。
如果你在应用程序中使用了一个插件包,但是又不想每次使用前都手动启动它。那么你可以在application/bundles.php文件中,把它设置为自动启动:
return array(
'admin' => array('auto' => true),
);
如果插件包被设置为自动启动,那你不必要再去手动启用一个插件包,你只需要直接使用它,剩余的工作都交给Laravel去完成。如果你尝试使用插件包的视图文件,那么插件包的配置文件、语言文件、路由或者过滤器都会自动启用。
每当一个插件包启动成功,都将触发一个事件。你可以用下面的方法来监听已经启动的插件包:
Event::listen('laravel.started: admin', function()
{
// The "admin" bundle has started…
});
同样还可以将一个插件包设置为不可启用,那么这个插件包就不能被启用了。
Bundle::disable('admin');
更多关于插件包路由和控制器的信息可以阅读:bundle routing和bundle controllers。
前面已经说过,插件包可以包含自己的视图、配置、语言等文件。在Laravel框架中可以通过双冒号来使用它们。让我们看下面的例子:
return View::make('bundle::view');
return Config::get('bundle::file.option');
return Lang::line('bundle::file.line');
有些时候你想要获取插件包更多的"meta"信息,比如插件包是否存在、插件包路径或者插件包的配置数组。那么可以用下面的方法:
Bundle::exists('admin');
$location = Bundle::path('admin');
$config = Bundle::get('admin');
$names = Bundle::names();
如果你的插件包包含视图,并且希望它们能像Javascript和images文件一样在public目录被调用。方法很简单,只需要在你的插件包目录中新建一个public文件夹,然后把静态文件放到里面即可。
但是现在我们怎么把它们放到应用程序的public文件夹中呢?Laravel框架的"Artisan"命令行工具提供了一个简单的命令可以把插件包assets文件夹中的文件复制到public目录中:
php artisan bundle:publish
这条命令会在public目录中为bundles创建一个public/bundles目录。比如你的插件包叫"admin",那么就会建立一个public/bundles/admin文件夹,里面包含了所有admin插件包public目录里的文件。
更多与插件包assets相关的信息可以阅读:asset management。
很多时候我们都需要手动安装插件包,不过"Artisan"CLI工具提供了一种更好的方法来安装和升级插件包。Laravel可以通过解压ZIP压缩包来安装插件包:
php artisan bundle:install eloquent
命令执行完插件包就安装成功了,现在你可以注册它,发布它的assets文件了。
可以访问官方的Laravel bundle directory获得优秀的插件包。
当你升级插件包时,Laravel会自动移除旧的插件包,然后重新安装。
php artisan bundle:upgrade eloquent
Note: 在升级插件包之后,你需要重新发布插件包的assets文件。
重要提醒: 当插件包在升级重新安装成功之后,你必须留意插件包升级前的所有变动,你可能需要再次修改插件包的配置,修改插件包的目录等。可以用插件包的启动事件来设置它们,把类似下面的代码加入到application/start.php文件中:
Event::listen('laravel.started: admin', function()
{
Config::set('admin::file.option', true);
});
来自 http://v3.golaravel.com/docs/bundles.html#creating-bundles