如何在 Laravel 5.1 中创建服务 Service Provider

本文由码农网 –
任琦磊原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划!

安装

Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式。

这是一份面向初学者的 Laravel 5.1 中构建 Service Provider 的教程。

Laravel框架使用 Composer
执行安装和依赖管理。如果还没有安装的话,现在就开始 安装 Composer 吧。

现在越来越多的网站采用 Markdown 来书写,该项目使用 Laravel
从头到尾实现一个支持 Markdown 的简易文章系统。

我在自己过去的博客中提到了我喜欢 Laravel
5.1 的架构,尤其是它引入了Service
Provider,从而使你模块化的构建应用成为了可能。应用的配置常常可能成为棘手的任务,完全取决于你正在使用的框架,但幸运的是,我们正在使用的 Laravel 让这件事变得相当简单。

安装Composer之后,你就可以通过命令行使用如下命令安装Laravel了:

  • 项目设计
  • 数据库设计
  • Laravel 项目创建与配置
  • Laravel artisan 创建模型、控制器
  • Laravel 安装 bootstrap
  • Laravel 视图:模板继承

图片 1

composer create-project laravel/laravel your-project-name或者,你可以从
Github仓库 下载。接下来,在 安装Composer 之后,在项目根目录下执行
composer install 命令。该命令将会下载以及安装框架的依赖组件。

图片 2此处输入图片的描述图片 3此处输入图片的描述

所以让我们开始创建一个用于演示的路由(route)。到 app/Http/routes.php中添加下面这条路由:

写入权限

实现 Markdown 首先我们至少需要一个文章系统,当然了评论也可以实现
Markdown

Route::resource('demo', 'DemoController');

安装完 Laravel ,你还需要为web服务器设置 app/storage
目录的写入权限。请参考 安装 一节以获取更多关于配置方面的信息。

原理都是相通的,只要我们提醒用户在输入数据的时候使用 Markdown
语法,然后将 Markdown
格式的内容保存到数据库,在需要显示的地方通过解析转换成 html 代码即可

通过使用 Route::resource,我们就获得了预定义好的 index,show,create,edit,update,store 和 destroy 路由。

目录结构

首先,进行需求分析:

为了实现良好的对称性,现在我们可以使用 artisan 命令行工具来为我们创建对应的控制器(controller)。键入如下指令:

安装完框架后,你需要熟悉一下该项目的目录结构。app 文件夹包含了一些例如
views ,controllers 和 models 目录。
程序中大部分代码将要存放这些目录下。你也可以查看一下 app/config
文件夹里一些配置项目。

一个简易的支持 Markdown 的文章系统应该大概包含下列功能:

php artisan make:controller DemoController

路由

  • 添加文章按钮
  • 新建文章表单/编辑文章表单
  • 文章展示列表
  • 支持 Markdown
  • 编辑器可以实时预览

让我们打开创建好的文件,将 index 方法修改为如下内容:

我们开始创建我们第一个路由。在 Laravel,简单路由的方法是闭包。打开
app/routes.php 文件加入如下代码:

界面设计

文章系统并不是重点,稍后我会直接给出代码,这里也就不专门设计了

主要留意一下编辑器的设计和 Markdown 的样式:

对于编辑器:网络上流行很多种富文本编辑器,比如

百度 UEditor

图片 4此处输入图片的描述

kindeditor

图片 5此处输入图片的描述

但是如果我们使用 markdown
就不必再使用如此复杂的富文本编辑器,因为这种方式移植性并不好

网络上也有一些简洁的 markdown 编辑器

比如 bootstrap Markdown 编辑器

图片 6此处输入图片的描述

因为我自己写 markdown
几乎很少用上面的那些按钮,用得最多的就是预览功能,所以本次实验我就直接手撸一个简易的附带预览的编辑器,如果你想用
bootstrap Markdown 按照他的文档安装即可

至于 Markdown 的样式设计就因人而异了,本次实验我直接借鉴了 GitHub 上的
Markdown 样式,你也可以根据自己喜好设计自己的样式代码

示意图:

图片 7此处输入图片的描述

说明:以下所有内容皆基于实验楼在线开发环境,如果在自己本地环境略微有些不同~

该项目还是需要用到一个文章系统系统,为了简化流程,我将该部分代码直接给出,只需要按照文档覆盖一下相关文件就好

public function index()
{
    return view('demo.index');
}

Route::get{ return ‘Users!’;});现在,你在 web 浏览器输入
/users,你应该会看到 Users! 输出。真棒!已经创建了你第一个路由。

重命名项目

首先我们先打开主文件夹,进入 Code 目录,将目录下的 myweb 文件夹重命名为
laravel-markdown(或者其他你喜欢的名字)

现在让我们继续在 app/Resources/views 目录下创建一个名为 Demo 的文件夹,并在文件夹中创建一个名为 index.blade.php 的视图(view)文件,内容如下:

路由也可以赋予控制器类。例如:

配置 nginx

打开命令行

sudo vim /etc/nginx/sites-available/default

修改相应代码

server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; #root /usr/share/nginx/html; #root /var/www/laravel/public; # 将下面一行中的 myweb 改为 laravel-markdown root /home/shiyanlou/Code/laravel-markdown/public; . . .

然后重启 nginx

sudo service nginx reload

打开浏览器,输入localhost看到如下界面说明配置成功,接下来我们将对这个
laravel-comment 项目进行开发

图片 8此处输入图片的描述

@extends('layouts.master')

@section('content')
<h1>Demo Page</h1>
@endsection

Route::get(‘users’, ‘UserController@getIndex’);该路由告知框架 /users
路由请求应该调用 UserController 类的 getIndex
方法。要查看更多关于路由控制器信息,查看 控制器文档 。

同步到 Git

cd ~/Code/laravel-markdowngit initgit add -Agit commit -m "Initial commit"// 然后在 Git 上创建远程库名字为 laravel-markdowngit remote add origin https://github.com/替换为你自己的git用户名/laravel-markdown.gitgit push -u origin master// 输入用户名密码后同步成功

这个例子中我们正在调用一个我已经在 layouts 文件夹中创建了的 master 页面master.blade.php。如果你的 master 用了另一个名字,那么这里你得替换掉。如果你没有 master 页面,那么就删掉第一行 extends 的全部内容,包括 @sectioin 申明。

创建视图

配置数据库

//打开 mysqlsudo service mysql start//连接 mysqlmysql -u root//创建数据库create database laravel_markdown;//退出 mysqlexit;

打开代码根目录下的 .env 文件,修改相应代码

...DB_CONNECTION=mysqlDB_HOST=127.0.0.1DB_DATABASE=laravel_markdownDB_USERNAME=rootDB_PASSWORD=...

注意:配置完之后每次重新打开环境都需要手动启动 mysql

bootstrap 是世界范围内使用最广泛的前端框架,使用 bootstrap
可以轻易编写出具有自适应功能的布局,并且包含了丰富的组件,也是 Laravel
默认集成的前端框架之一

假设你已经配置好了你的开发环境并解析了你的域名,那么当你访问路由yourapplication.com/demo,你应该可以看到内容 Demo
Page 了。

接下来,我们要创建视图来显示我们用户数据。视图以HTML代码存放在 app/views
文件夹。我们将存放两个视图文件到该文件夹:layout.blade.php 和
users.blade.php。首先,让我们先创建 layout.blade.php 文件:

SASS

打开 resources/asset/sass/app.sass 加载 bootstarp

@import "node_modules/bootstrap-sass/assets/stylesheets/bootstrap";

好的,那么现在就让我们来创建一个Service Provider。这个Service
Provider不会做太多特别有用的事情。它只是用来向你展示如何搭建它。

复制代码 代码如下:

Javascript

创建 resources/asset/js/app.js 添加如下代码

resources/asset/js/app.js

window.$ = window.jQuery = require;require('bootstrap-sass');

bootstrap 依赖 jquery,所以需要安装jquery

使用 npm 安装 jquery,在代码根目录下执行如下命令

npm install jquery --save

让我们在 app 目录下创建一个 Helpers 文件夹。然后在 Helpers 文件夹里,创建一个 Contracts 文件夹。在 Contracts 文件夹里,创建文件RocketShipContract.php 并写入下面的内容:

Laravel Quickstart

@yield

接着, 我们创建 users.blade.php 视图:

复制代码 代码如下:@extends

@section Users!@stop

这里的语法可能让你感到陌生。因为我们使用的是 Laravel
模板系统:Blade。Blade
非常快,因为仅使用了少量的正则表达式来为你的模板编译成原始PHP代码。Blade提供强大的功能,例如模板继承,还有一些常用的PHP控制结构语法糖,例如
if 和 for。 查看 Blade 文档 了解更多。

现在我们有了我们视图,让我们返回 /users 路由。我们用视图来替代返回
Users!:

复制代码 代码如下:Route::get{ return
View::make;

漂亮!现在你成功创建了继承至layout的视图。接下来,让我们开始数据库层。

创建迁移

要创建表来保存我们数据,我们将使用 Laravel
迁移系统。迁移描述数据库的改变,这让分享给他们团队成员非常简单。

首先,我们配置数据库连接。你可以在 app/config/database.php
文件配置所有数据库连接信息。默认,Laravel 被配置为使用 SQLite,并且一个
SQLite 数据库存放在 app/database 目录。你可以将数据库配置文件的 driver
选项修改为 mysql 并且配置 mysql 连接信息。

接下来,要创建迁移,我们将使用 Artisan
CLI。在项目根目录中,在终端中执行以下命令:

复制代码 代码如下:php artisan
migrate:make create_users_table

然后,找到生成的迁移文件 app/database/migrations
目录。该文件包含了一个包含两个方法: up 和 down 的类。在 up
方法,你要指名数据库表的修改,在 down 方法中你只需要移除它。

复制代码 代码如下:public function up(){
Schema::create(‘users’, function { $table->increments;
$table->string; $table->string; $table->timestamps;}

public function down(){ Schema::drop;}

然后,我们在项目根目录中使用终端运行 migrate 命令来执行迁移:

复制代码 代码如下:php artisan migrate

如果你想回滚迁移,你可以执行 migrate:rollback
命令。现在我们已经有了数据库表,让我们让添加一些数据!

Eloquent ORM

Laravel 提供非常棒的 ORM:Eloquent。如果你使用过 Ruby on Rails
框架,你会发现 Eloquent 很相似,因为它遵循数据库交互的 ActiveRecord ORM
风格。

首先,让我们来定义个模型。ELoquent
模型可以用来查询相关数据表,以及表内的某一行。别着急,我们很快会谈及!模型通常存放在
app/models 目录。让我们在该目录定义个 User.php 模型,如:

复制代码 代码如下:class User extends
Eloquent {}

注意我们并没有告诉 Eloquent 使用哪个表。Eloquent 有多种约定,
一个是使用模型的复数形式作为模型的数据库表。非常方便!

使用你喜欢的数据库管理工具,插入几行数据到 users 表,我们将使用 Eloquent
取得它们并传递到视图中。

现在我们修改我们 /users 路由如下:

复制代码 代码如下:Route::get{ $users =
User::all();

return View::make->with;

让我们来看看该路由。首先,User 模型的 all 方法将会从 users
表中取得所有记录。接下来,我们通过 with 方法将这些记录传递到视图。with
方法接受一个键和一个值,那么该值就可以在视图中使用了。

激动啊。现在我们准备将用户显示在我们视图!

显示数据

现在我们视图中已经可以访问 users 类,我们可以如下显示它们:

复制代码 代码如下:@extends

@section @foreach

{{ $user->name }}

@endforeach@stop

你可以发现没有找到 echo 语句。当使用 Blade
时,你可以使用两个花括号来输出数据。非常简单,你现在应该可以通过 /users
路由来查看到用户姓名作为响应输出。

这仅仅是开始。在本系列教程中,你已经了解了 Laravel
基础部分,但是还有更让人兴奋的东西要学。继续阅读该文档并且深入Eloquent和Blade这些强大的特性。或者你对队列
和 单元测试 感兴趣。或许是你想了解IoC Container, 选择权在于你!

配置 gulpfile 并编译

更改根目录下的 gulpfile.js 配置文件

var elixir = require('laravel-elixir');elixir(function { mix.sass('app.scss') .browserify;});

然后在代码根目录下执行 gulp 编译 bootstrap

<?php

namespace AppHelpersContracts;

Interface RocketShipContract
{

    public function blastOff();

}

基础视图

在resources/views 目录下创建一个文件夹 layouts ,在 layouts 下创建一个
app.blade.php

在app.blade.php 中加入如下代码

resources/views/layouts/app.blade.php

<!DOCTYPE html><html lang="en"><head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- CSRF Token --> <meta name="csrf-token" content="{{ csrf_token() }}"> <title>@yield('title', '无标题') - Laravel Markdown</title> <!-- 加载 CSS --> <link href="/css/app.css" rel="stylesheet"></head><body> <!-- bootstrap 导航条 --> <nav > <div > <!-- Brand and toggle get grouped for better mobile display --> <div > <button type="button" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> Toggle navigation    </button> <!-- LOGO 首页跳转按钮 --> <a href="{{%20route%20}}">Laravel Markdown</a> </div> <!-- Collect the nav links, forms, and other content for toggling --> <div > <ul > <!-- 导航按钮 此网站不需要 --> <!-- <li><a href="#">Link</a></li> --> </ul> </div> </div> </nav> <!-- bootstrap 容器 --> <div > <!-- 显示提示消息 --> @include('shared.messages') <!-- 网站主体内容 --> @yield('content') </div> <!-- 加载 CSS --> <script src="/js/app.js"></script> @yield</body></html>

然后重命名 welcome.blade.php 为 home.blade.php 并重写代码继承基础模板

resources/views/home.blade.php

@extends('layouts.app')@section('title', 'home')@section('content')<a style="margin-bottom:20px" href="{{%20route('articles.create')%20}}">+ New Article</a>@forelse($articles as $article)<div > <div > <h3 ><a href="{{%20route('articles.show',%20$article->id)%20}}">{{ $article->title }}</a></h3> </div> <div > <p> {{ $article->created_at }}</p> <p>{{ $article->intro}}</p> </div></div>@endforeach@endsection

之后需要修改 routes.php 文件

app/Http/routes.php

<?phpRoute::get('/', function () { return view;});

然后在resources/views/ 目录下创建一个文件夹 articles
,在该文件夹中创建三个文件:create.blade.php 和 show.blade.php

然后分别填入下列代码:

resources/views/articles/create.blade.php

@extends('layouts.app')@section('title', 'New Article')@section('content')<div > <div > <div > <h3>Create an article</h3> @include('shared.errors') {{--新增文章表单--}} <form action="{{ route('articles.store') }}" method="post" enctype="multipart/form-data"> {{ csrf_field() }} <input type="text" name="title" placeholder="click here to input the title" style="margin-bottom: 20px;"> <input type="text" name="intro" placeholder="click here to input the introduction" style="margin-bottom: 20px;"> <textarea name="content" rows="20" style="width:100%;" placeholder="please input with markdown"></textarea> <button type="submit" >Create</button> </form> </div> </div></div>@endsection

resources/views/articles/show.blade.php

@extends('layouts.app')@section('title', $article->title)@section('content')<div > <div > <h3>{{ $article->title }}</h3>  {{ $article->created_at }} </div> <div style="padding:20px;"> <div > {{ $article->content }} </div> </div></div>@endsection

最后在resources/views 目录下创建一个文件夹 shared ,在 shared 下创建一个
messages.blade.php 和 一个 errors.blade.php
分别用来显示闪现消息和错误信息

resources/views/shared/messages.blade.php

@foreach (['danger', 'warning', 'success', 'info'] as $msg) @if->has <div > <p > {{ session()->get }} </p> </div> @endif@endforeach

resources/views/shared/errors.blade.php

@if (count > 0) <div > <ul> @foreach($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div>@endif

正如你所知,接口(interface)是一种用来强化架构的契约(contract)。为了定义类的接口,它必须包含名为 blastOff 的公共函数(public
function)。

路由、模型、控制器

修改 routes.php 文件

app/Http/routes.php

<?phpRoute::get('/', function () { $articles = AppArticle::all(); return view('home', compact('articles'));})->name;//文章资源路由Route::resource('articles','ArticlesController');

在根目录下执行 php artisan make:model Article 创建模型

然后修改 Article.php

app/Article.php

<?phpnamespace App;use IlluminateDatabaseEloquentModel;class Article extends Model{ //可写字段 protected $fillable = ['title', 'intro', 'content'];}

在根目录下执行 php artisan make:migration create_articles_table
–create=articles 创建迁移文件

然后修改该迁移文件

database/migrations/XXXX_create_articles_table.php

<?phpuse IlluminateDatabaseSchemaBlueprint;use IlluminateDatabaseMigrationsMigration;class CreateArticlesTable extends Migration{ /** * Run the migrations. * * @return void */ public function up() { Schema::create('articles', function (Blueprint $table) { $table->increments; $table->string; $table->string; $table->text('content')->nullable(); $table->timestamps; } /** * Reverse the migrations. * * @return void */ public function down() { Schema::drop('articles'); }}

在根目录执行 php artisan migrate 数据库迁移

在根目录下执行 php artisan make:controller ArticlesController –plain
创建控制器

然后修改 ArticlesController.php

app/Http/Controllers/ArticlesController.php

<?phpnamespace AppHttpControllers;use IlluminateHttpRequest;use AppHttpRequests;use AppHttpControllersController;use AppArticle;class ArticlesController extends Controller{ public function create() { return view('articles.create'); } public function store(Request $request) { $this->validate($request, [ 'title' => 'required|max:50', 'intro' => 'max:150', ]); $article = Article::create([ 'title' => $request->title, 'intro' => $request->intro, 'content' => $request->content, ]); session()->flash('success', 'create successful'); return redirect()->route; } public function show { $article = Article::findOrFail; return view('articles.show', compact('article')); }}

所以为什么要费力地创建一个契约呢?其实,Laravel 有一个神奇的功能是你可以类型提示契约,Service
Provider会返回一个受它约束的具体类的实例。这实现了无与伦比的灵活性和松耦合的结构,因为你的工作将可以轻松地通过一行代码来完成。我们即将看到这是如何工作的。

样式

在 resources/assets/app.sass 中添加如下代码

.z-panel{ margin-bottom: 20px; border: 1px solid #e2e1e1; font-size: 14px; .z-panel-header{ padding: 8px 15px; border-bottom: 1px solid #eeeeee; background-color: #F8F8F8; text-align: center; color: gray; } .z-panel-body{ background-color: white; hr{ margin-top: 10px; margin-bottom: 10px; } ul{ padding: 0; margin: 0; list-style: none; text-align: left; li{ padding: 10px; border-bottom: 1px solid #eeeeee; display:block; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; } } } .z-panel-footer{ background-color: #F8F8F8; text-align: right; padding: 8px 15px; color: gray; }}

然后在根目录执行 gulp 编译

首先,让我们创建一个具体类。在 app/Helpers 文件夹中,创建RocketShip.php,代码如下:

预览

打开浏览器,访问localhost,看到如下界面则搭建成功:

图片 9此处输入图片的描述

我们可以尝试创建几篇文章

图片 10此处输入图片的描述图片 11此处输入图片的描述图片 12此处输入图片的描述

这里我书写了一些 markdown 格式的文字,可以看到没有任何格式

在下一次实验将实现 Markdown

本次实验比较简单,都是一些基础操作,可能比较繁琐

基础操作应该多加练习,能够达到速度快,时间短,逻辑清晰就算完美了~~

将代码同步到 Git 上

git add -Agit commit -m "finish basic mvc"git push
  • Composer 组件开发
  • Markdown 相关知识
  • blade 模板渲染
  • AJAX

这一节的内容,由于篇幅有限,点击【Laravel 5.1 实现 Markdown
编辑器】即可马上进行查看了~

<?php

namespace appHelpers;

use AppHelpersContractsRocketShipContract;

class RocketShip implements RocketShipContract
{

    public function blastOff()
    {

        return 'Houston, we have ignition';

    }

}

你可以看到我们的具体类没有做很多事,但我们则对如何配合在一起更感兴趣。你可以自己决定你想给你的应用提供什么服务。

好的,现在我们要来创建一个符合契约和具体类的Service
Provider了。在命令行中键入下面的指令:

php artisan make:provider RocketShipServiceProvider

回车确认,它就会为你创建好一个类。

新文件位于 app/Providers。前往这个文件,修改为如下内容:

<?php

namespace AppProviders;

use IlluminateSupportServiceProvider;
use AppHelpersRocketLauncher;

class RocketShipServiceProvider extends ServiceProvider
{
    protected $defer = true;

    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind('AppHelpersContractsRocketShipContract', function(){

            return new RocketShip();

        });
    }

    /**
     * Get the services provided by the provider.
     *
     * @return array
     */
    public function provides()
    {
        return ['AppHelpersContractsRocketShipContract'];
    }

}

让我们看一下这一段:

<?php

namespace AppProviders;

use IlluminateSupportServiceProvider;
use AppHelpersRocketShip;

class RocketShipServiceProvider extends ServiceProvider
{

简单粗暴。我们有了命名空间,use 申明和 class 申明。当你创建Service
Provider时,你要导入(import)具体类,像这里我在 use 申明中导入了 RocketShip。

接下来是:

protected $defer = true;

属性 $defer 设置为 true 代表这个类只有在必要的时候才会被加载,这样应用可以更高效地运行。

接下来我们有一个 boot 函数,这只是个空的存根,我们不会对它做任何配置。

然后,我们有 register 方法:

/**
 * Register the application services.
 *
 * @return void
 */
public function register()
{
    $this->app->bind('AppHelpersContractsRocketShipContract', function(){

        return new RocketShip();

    });
}

你可以看到我们正在使用绑定方法来将契约和具体类绑定到一起。这是就是Service
Provider定义具体类方法的地方。所以你可以很便捷地调整你想要绑定的类。之后我们会看到这如何起效。

最后,我们有 provides 方法:

/**
     * Get the services provided by the provider.
     *
     * @return array
     */
    public function provides()
    {
        return ['AppHelpersContractsRocketShipContract'];
    }

}

如果你把属性 $defer 设为 true 的话你就会需要这个方法了。

不管怎么说,这是一个相当简单的类,只是涵盖了部分的精华。

好,接下来我们需要告诉我们的应用来找到这个类,我们通过把它添加到config/app.php 中的 providers 数组来实现。

/*
         * Application Service Providers...
         */

        AppProvidersAppServiceProvider::class,
        AppProvidersEventServiceProvider::class,
        AppProvidersRouteServiceProvider::class,
        AppProvidersRocketShipServiceProvider::class,

这里包含了一些其它的Provider作为参考,你可以看到我们的Provider在最后一行。保存完你就可以离开这里继续后面的了。

我们来修改一下 DemoController 的 index 方法:

public function index(RocketShipContract $rocketship)
{
        $boom = $rocketship->blastOff();

        return view('demo.index', compact('boom'));
}

所以在这里,我们键入 RocketShipContract 并传递给实例变量 $rocketship。Laravel 通过Service
Provider获知你其实想要的是 RocketShip 类,因为你在服务提供者里把它和契约绑定了。是不是很酷?

然后我们简单地调用 blastoff 方法并把它赋值给一个要传递向视图的变量。让我们来修改一下视图:

@extends('layouts.master')

@section('content')

    {{ $boom }}

@endsection

你可以看到我正在使用 blade 打印变量。所以浏览器中应该可以看到:

Houston, we have ignition.

所以现在为了更简单的描述能实现什么,我们可以在 Helpers 文件夹中创建第二个具体类。我们把它命名为 RocketLauncher.php,内容如下:

<?php

namespace appHelpers;

use AppHelpersContractsRocketShipContract;

class RocketLauncher implements RocketShipContract
{

    public function blastOff()
    {

        return 'Houston, we have launched!';

    }

}

你可以发现这个我们的 RocketShip 类很像,只是 blastoff 方法略有不同。所以我们在Service
Provider的 register 方法中修改其中一行代码来实现它:

public function register()
    {
        $this->app->bind('AppHelpersContractsRocketShipContract', function(){

            return new RocketLauncher();

        });
    }

还包括 use 申明:

use AppHelpersRocketLauncher;

根据上面的简单变动,我们现在有了基于契约约束的不同的实现,所以浏览器里的结果也会产生相应变化。

尽管我们为了这个教程只是做了一个超级无聊的例子,你还是可以通过它看到这个架构的好处。通过编写一个契约而不是一个具体类,我们给自己提供了一种更灵活和简单的而方法来管理代码。

这里有一些“陷阱”你需要注意。你没法直接重命名一个Service
Provider,而是需要删除它并通过 artisan 新建一个,因为创建时其它地方也会有一些不被注意的改动。这很可能与自动加载(autoload)有关。如果你发生了这类问题,你可以尝试在命令行运行 composer
dump-autoload。如果仍不起作用,那就还是删除文件并重新创建吧。

另一件事是务必在最后一步才把Service
Provider添加到 config/app.php。如果里面配置了一个并不存在的类估计 artisan 会崩溃。

Laravel 框架拥有完善的文档,你可以在这里阅读更多关于 Laravel Service
Provider 的内容。

我希望你能享受这个教程并觉得它有价值。点击页面来阅读全部的教程。如果可以,请评论、分享和点赞,谢谢!

我没有捐款按钮,但如果你愿意支持我的工作或学习更多 Laravel 的知识,你可以通过购买我的书来实现,《Laraboot:
laravel 5* For
Beginners》,非常感谢。

发表评论

电子邮件地址不会被公开。 必填项已用*标注