视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Laravel大型项目系列教程(七)
2025-09-29 09:07:16 责编:小OO
文档
Laravel大型项目系列教程(七)

扩展包和Artisan开发

1、前言

本节教程将讲解扩展包开发和Artisan扩展开发,并浏览不同分辨率下的自适应效果。

2、Let's go

1.扩展包开发

在前面开发中,我们经常要用到通知,如修改用户信息时视图要写

@if (Session::has('message')) "am-alert am-alert-{{ Session::get('message')['type'] }}" data-am-alert>

{{ Session::get('message')['content'] }}

>@endif

在业务逻辑代码中需要使用

return Redirect::route('user.edit', $id)->with('user', $user)->with('message', array('type' => 'success', 'content' => 'Modify successfully'));

现在我们这里实现一个简单的通知插件,先创建包:

$ php artisan workbench shiyanlou/notification --resources

这时会在项目根目录下多一个名为workbench的目录,里面存放的就是刚才创建的包,我们进入shiyanlou/notification目录,src/Shiyanlou/Notification目录是所有class的主目录,包括ServiceProvider。config、lang、migrations和views目录,就如你所猜测,包含了你创建的包的相应资源。包可以包含这些资源中的任意几个,就像一个"常规"的应用。

修改下包里composer.json中的authors:

"authors": [    {        "name": "shiyanlou",        "email": "support@shiyanlou.com"    }]

在项目根目录下执行:

$ php artisan dump-autoload

然后我们在app/config/app.php中的providers中增加:

'Shiyanlou\\Notification\\NotificationServiceProvider',

这步做完后启动开发服务器:

$ php artisan serve

如果启动成功,就说明扩展包的基础就搭建完成了。

现在我们在src/Shiyanlou/Notification下创建一个名为Notification.php的文件,修改:

session = $session; } private function addMessage($type, $content) { $this->session->put('notification_message', '' . $content . ''); } public function primary($content) { $this->addMessage('am-alert-primary', $content); } public function secondary($content) { $this->addMessage('am-alert-secondary', $content); } public function success($content) { $this->addMessage('am-alert-success', $content); } public function warning($content) { $this->addMessage('am-alert-warning', $content); } public function danger($content) { $this->addMessage('am-alert-danger', $content); } public function show() { echo $this->session->pull('notification_message', ''); }}

上面用到了Session,Session表示一次会话,就是从你打开浏览器窗口到关闭。

修改NotificationServiceProvider.php中的register()和provides():

public function register(){ $this->app['notification'] = $this->app->share(function($app) { return new Notification($this->app['session.store']); });}public function provides(){ return array('notification');}

上面是向Ioc容器注册类。

然后在src/Shiyanlou/Notification下创建一个名为Facades的文件夹,在Facades目录下创建一个名为Notification.php的文件,修改:

我们这里继承了Facade类,用Facades可以访问IoC容器中注册的类,有了IoC容器,我们可以在任何地方调用注册的类。

为了方便我们的使用,我们在app/config/app.php的aliases中增加一个别名:

'Notification' => 'Shiyanlou\\Notification\\Facades\\Notification',

下面就来试试这个插件,把上面的

@if (Session::has('message'))

{{ Session::get('message')['content'] }}

@endif

替换成

{{ Notification::show() }}

return Redirect::route('user.edit', $id)->with('user', $user)->with('message', array('type' => 'success', 'content' => 'Modify successfully'));

替换成

Notification::success('Modify successfully');return Redirect::route('user.edit', $id);

现在修改用户信息后提示成功的信息就能方便地显示出来:

简单的扩展包开发就完成了。

2.Artisan扩展开发

Artisan是Laravel中自带的命令行工具的名称,它提供了一些开发过程中有用的命令。我们可以编写自己的Artisan命令完成特定的功能,这里举一个开发导出用户数据的命令。首先我们创建一个新的命令类:

$ php artisan command:make ExportUsersCommand

执行完后我们会发现在app/commands生成了一个ExportUsersCommand.php的文件,这个就是我们自定义的命令类,然后我们需要注册命令,在app/start/artisan.php中增加:

Artisan::add(new ExportUsersCommand);

下面编写ExportUsersCommand类,把$name的值改为export:users,这个$name是命令的名称,把$description的值改为Export all users,这个是命令的描述,然后添加一个获取用户数据的方法:

protected function getUsersData(){ $users = User::all(); foreach ($users as $user) { $output[] = [$user->id, $user->email, $user->nickname, $user->is_admin, $user->block, $user->created_at]; } return $output;}

然后编写getArguments()和getOptions():

protected function getArguments(){    return array(        array('file', InputArgument::OPTIONAL, 'The output file path', null),    );}protected function getOptions(){    return array(        array('headers', null, InputOption::VALUE_NONE, 'Display headers?', null),    );}

getArguments与getOptions方法是用来接收要传入您的自定义命令的地方,这两个方法都会回传一组命令数组,并由数组清单所组成。

下面开始编写fire():

public function fire(){ $output_path = $this->argument('file'); $headers = ['ID', 'E-mail', 'NickName', 'is_admin', 'is_block', 'CreateDateTime']; $rows = $this->getUsersData(); if ($output_path) { $handle = fopen($output_path, 'w'); if ($this->option('headers')) { fputcsv($handle, $headers); } foreach ($rows as $row) { fputcsv($handle, $row); } fclose($handle); $this->info("Exported list to $output_path"); } else { $table = $this->getHelperSet()->get('table'); $table->setHeaders($headers)->setRows($rows); $table->render($this->getOutput()); }}

当自定义命令被执行时,将会调用fire方法,你可以在此加入任何的逻辑判断。

现在就可以测试我们自己开发的命令了,先执行:

$ php artisan export:users

执行后会在命令行终端输出用户列表,我们试试导出到一个文件:

$ php artisan export:users --headers users.csv

执行后终端会输出Exported list to users.csv,在项目根目录下会生成一个名为users.csv的文件,你可以用表格软件或者直接打开,里面存放的就是用户的数据列表。

3.自适应效果

让我们看下在低分辨率下的自适应效果

首页

 

文章内容页面 

登录页面

 

文章管理页面

 

编辑文章页面

 

4.小结

本节教程介绍了怎么进行扩展包和Artisan开发,本套教程也就此结束了,你可以继续完善这个博客,此教程仅仅只是做一个引入人,你完全可以用Laravel开发自己想要的网站,Laravel中的缓冲、Mail、本地化和队列等还没有提到,这就需要你自己去探索了,最后推荐一个开发环境Laravel Homestead,我们可以非常方便地在其中开发Laravel。

最终版代码下载:

$ git clone https://github.com/shiyanlou/laravel-blog-7-final.git

本文详细出处:http://www.shiyanlou.com/courses/123下载本文

显示全文
专题