仿站建设公司注册网上申请网址
仿站建设,公司注册网上申请网址,曹鹏wordpress教程,南京建设项目环评公示期网站转载自http://www.cnblogs.com/XiongMaoMengNan/p/6644892.htmlLaravel作为在国内国外都颇为流行的PHP框架#xff0c;风格优雅#xff0c;其拥有自己的一些特点。 一. 请求周期 Laravel 采用了单一入口模式#xff0c;应用的所有请求入口都是 public/index.php 文件。 注册… 转载自http://www.cnblogs.com/XiongMaoMengNan/p/6644892.html Laravel作为在国内国外都颇为流行的PHP框架风格优雅其拥有自己的一些特点。 一. 请求周期 Laravel 采用了单一入口模式应用的所有请求入口都是 public/index.php 文件。 注册类文件自动加载器Laravel通过composer进行依赖管理并在bootstrap/autoload.php中注册了Composer Auto Loader (PSR-4)应用中类的命名空间将被映射到类文件实际路径不再需要开发者手动导入各种类文件而由自动加载器自行导入。因此Laravel允许你在应用中定义的类可以自由放置在Composer Auto Loader能自动加载的任何目录下但大多数时候还是建议放置在app目录下或app的某个子目录下创建服务容器从 bootstrap/app.php 文件中取得 Laravel 应用实例 $app (服务容器)创建 HTTP / Console 内核传入的请求会被发送给 HTTP 内核或者 console 内核进行处理HTTP 内核继承自 Illuminate\Foundation\Http\Kernel 类。它定义了一个 bootstrappers 数组数组中的类在请求真正执行前进行前置执行这些引导程序配置了错误处理日志记录检测应用程序环境以及其他在请求被处理前需要完成的工作HTTP 内核同时定义了一个 HTTP 中间件列表所有的请求必须在处理前通过这些中间件处理 HTTP session 的读写判断应用是否在维护模式 验证 CSRF token 等等载入服务提供者至容器在内核引导启动的过程中最重要的动作之一就是载入服务提供者到你的应用服务提供者负责引导启动框架的全部各种组件例如数据库、队列、验证器以及路由组件。因为这些组件引导和配置了框架的各种功能所以服务提供者是整个 Laravel 启动过程中最为重要的部分所有的服务提供者都配置在 config/app.php 文件中的 providers 数组中。首先所有提供者的 register 方法会被调用一旦所有提供者注册完成接下来boot 方法将会被调用分发请求一旦应用完成引导和所有服务提供者都注册完成Request 将会移交给路由进行分发。路由将分发请求给一个路由或控制器同时运行路由指定的中间件 二. 服务容器和服务提供者 服务容器是 Laravel 管理类依赖和运行依赖注入的有力工具在类中可通过 $this-app 来访问容器在类之外通过 $app 来访问容器服务提供者是 Laravel 应用程序引导启动的中心关系到服务提供者自身、事件监听器、路由以及中间件的启动运行。应用程序中注册的路由通过RouteServiceProvider实例来加载事件监听器在EventServiceProvider类中进行注册中间件又称路由中间件在app/Http/Kernel.php类文件中注册调用时与路由进行绑定。在新创建的应用中AppServiceProvider 文件中方法实现都是空的这个提供者是你添加应用专属的引导和服务的最佳位置当然对于大型应用你可能希望创建几个服务提供者每个都具有粒度更精细的引导。服务提供者在 config/app.php 配置文件中的providers数组中进行注册 ?phpnamespace App\Providers;use Riak\Connection;
use Illuminate\Support\ServiceProvider;class RiakServiceProvider extends ServiceProvider
{/*** 在容器中注册绑定** return void*/public function register(){$this-app-singleton(Connection::class, function ($app) {return new Connection(config(riak));});}
} 三. 依赖注入 Laravel 实现依赖注入方式有两种自动注入和主动注册。自动注入通过参数类型提示由服务容器自动注入实现主动注册则需开发人员通过绑定机制来实现即绑定服务提供者或类参考 http://d.laravel-china.org/docs/5.4/container 。 绑定服务提供者或类这种方式对依赖注入的实现可以非常灵活多样 use Illuminate\Support\Facades\Storage;
use App\Http\Controllers\PhotoController;
use App\Http\Controllers\VideoController;
use Illuminate\Contracts\Filesystem\Filesystem;$this-app-when(PhotoController::class)-needs(Filesystem::class)-give(function () {return Storage::disk(local);});$this-app-when(VideoController::class)-needs(Filesystem::class)-give(function () {return Storage::disk(s3);}); 参数类型声明通过对类的构造器参数类型、类的方法参数类型、闭包的参数类型给出提示来实现 ?phpnamespace App\Http\Controllers;use App\Users\Repository as UserRepository;class UserController extends Controller
{/*** user repository 实例。*/protected $users;/*** 控制器构造方法。** param UserRepository $users* return void*/public function __construct(UserRepository $users){$this-users $users;}/*** 储存一个新用户。** param Request $request* return Response*/public function store(Request $request){$name $request-input(name);//}
} 路由参数依赖下边的示例使用 Illuminate\Http\Request 类型提示的同时还获取到路由参数id 你的路由可能是这样定义的
Route::put(user/{id}, UserControllerupdate);而控制器对路由参数id的依赖却可能是这样实现的
?phpnamespace App\Http\Controllers;use Illuminate\Http\Request;class UserController extends Controller
{/*** 更新指定的用户。** param Request $request* param string $id* return Response*/public function update(Request $request, $id){//}
} 四. Artisan Console Laravel利用PHP的CLI构建了强大的Console工具artisanartisan几乎能够创建任何你想要的模板类以及管理配置你的应用在开发和运维管理中扮演着极其重要的角色artisan是Laravel开发不可或缺的工具。在Laravel根目录下运行PHP artisan list可查看所有命令列表。用好artisan能极大地简化开发工作并减少错误发生的可能另外还可以编写自己的命令。下面列举部分比较常用的命令 启用维护模式php artisan down --messageUpgrading Database --retry60关闭维护模式php artisan up生成路由缓存php artisan route:cache清除路由缓存php artisan route:clear数据库迁移 Migrationsphp artisan make:migration create_users_table --createusers创建资源控制器php artisan make:controller PhotoController --resource --modelPhoto创建模型及迁移php artisan make:model User -m 五. 表单验证机制 表单验证在web开发中是不可或缺的其重要性也不言而喻也算是每个web框架的标配部件了。Laravel表单验证拥有标准且庞大的规则集通过规则调用来完成数据验证多个规则组合调用须以“|”符号连接一旦验证失败将自动回退并可自动绑定视图。 下例中附加bail规则至title属性在第一次验证required失败后将立即停止验证“.”语法符号在Laravel中通常表示嵌套包含关系这个在其他语言或框架语法中也比较常见 $this-validate($request, [title bail|required|unique:posts|max:255,author.name required,author.description required,
]); Laravel验证规则参考 http://d.laravel-china.org/docs/5.4/validation#可用的验证规则 另外在Laravel开发中还可采用如下扩展规则 自定义FormRequest (须继承自 Illuminate\Foundation\Http\FormRequest )Validator::make()手动创建validator实例创建validator实例验证后钩子按条件增加规则数组验证自定义验证规则 六. 事件机制 Laravel事件机制是一种很好的应用解耦方式因为一个事件可以拥有多个互不依赖的监听器。事件类 (Event) 类通常保存在 app/Events 目录下而它们的监听类 (Listener) 类被保存在 app/Listeners 目录下使用 Artisan 命令来生成事件和监听器时他们会被自动创建。 注册事件和监听器EventServiceProvider的 listen 属性数组用于事件键到对应的监听器值的注册然后运行 php artisan event:generate将自动生成EventServiceProvider中所注册的事件(类)模板和监听器模板然后在此基础之上进行修改来实现完整事件和监听器定义另外你也可以在 EventServiceProvider 类的 boot 方法中通过注册闭包事件来实现定义事件(类)事件(类)就是一个包含与事件相关信息数据的容器不包含其它逻辑 1 ?php2 3 namespace App\Events;4 5 use App\Order;6 use Illuminate\Queue\SerializesModels;7 8 class OrderShipped9 {
10 use SerializesModels;
11
12 public $order;
13
14 /**
15 * 创建一个事件实例。
16 *
17 * param Order $order
18 * return void
19 */
20 public function __construct(Order $order)
21 {
22 $this-order $order;
23 }
24 } 定义监听器事件监听器在 handle 方法中接受了事件实例作为参数 1 ?php2 3 namespace App\Listeners;4 5 use App\Events\OrderShipped;6 7 class SendShipmentNotification8 {9 /**
10 * 创建事件监听器。
11 *
12 * return void
13 */
14 public function __construct()
15 {
16 //
17 }
18
19 /**
20 * 处理事件
21 *
22 * param OrderShipped $event
23 * return void
24 */
25 public function handle(OrderShipped $event)
26 {
27 // 使用 $event-order 来访问 order ...
28 }
29 } 停止事件传播在监听器的 handle 方法中返回 false 来停止事件传播到其他的监听器触发事件调用 event 辅助函数可触发事件事件将被分发到它所有已经注册的监听器上 1 ?php2 3 namespace App\Http\Controllers;4 5 use App\Order;6 use App\Events\OrderShipped;7 use App\Http\Controllers\Controller;8 9 class OrderController extends Controller
10 {
11 /**
12 * 将传递过来的订单发货。
13 *
14 * param int $orderId
15 * return Response
16 */
17 public function ship($orderId)
18 {
19 $order Order::findOrFail($orderId);
20
21 // 订单的发货逻辑...
22
23 event(new OrderShipped($order));
24 }
25 } 队列化事件监听器如果监听器中需要实现一些耗时的任务比如发送邮件或者进行 HTTP 请求那把它放到队列中处理是非常有用的。在使用队列化监听器须在服务器或者本地环境中配置队列并开启一个队列监听器还要增加 ShouldQueue 接口到你的监听器类如果你想要自定义队列的连接和名称你可以在监听器类中定义 $connection 和 $queue 属性如果队列监听器任务执行次数超过在工作队列中定义的最大尝试次数监听器的 failed 方法将会被自动调用 1 ?php2 3 namespace App\Listeners;4 5 use App\Events\OrderShipped;6 use Illuminate\Contracts\Queue\ShouldQueue;7 8 class SendShipmentNotification implements ShouldQueue9 {
10 /**
11 * 队列化任务使用的连接名称。
12 *
13 * var string|null
14 */
15 public $connection sqs;
16
17 /**
18 * 队列化任务使用的队列名称。
19 *
20 * var string|null
21 */
22 public $queue listeners;
23
24 public function failed(OrderShipped $event, $exception)
25 {
26 //
27 }
28 } 事件订阅者事件订阅者允许在单个类中定义多个事件处理器还应该定义一个 subscribe 方法这个方法接受一个事件分发器的实例通过调用事件分发器的 listen 方法来注册事件监听器然后在 EventServiceProvider 类的 $subscribe 属性中注册订阅者 1 ?php2 3 namespace App\Listeners;4 5 class UserEventSubscriber6 {7 /**8 * 处理用户登录事件。9 */
10 public function onUserLogin($event) {}
11
12 /**
13 * 处理用户注销事件。
14 */
15 public function onUserLogout($event) {}
16
17 /**
18 * 为订阅者注册监听器。
19 *
20 * param Illuminate\Events\Dispatcher $events
21 */
22 public function subscribe($events)
23 {
24 $events-listen(
25 Illuminate\Auth\Events\Login,
26 App\Listeners\UserEventSubscriberonUserLogin
27 );
28
29 $events-listen(
30 Illuminate\Auth\Events\Logout,
31 App\Listeners\UserEventSubscriberonUserLogout
32 );
33 }
34
35 } 七. Eloquent 模型 Eloquent ORM 以ActiveRecord形式来和数据库进行交互拥有全部的数据表操作定义单个模型实例对应数据表中的一行 1 $flights App\Flight::where(active, 1)
2 -orderBy(name, desc)
3 -take(10)
4 -get(); config/database.php中包含了模型的相关配置项。Eloquent 模型约定 数据表名模型以单数形式命名(CamelCase)对应的数据表为蛇形复数名(snake_cases)模型的$table属性也可用来指定自定义的数据表名称主键模型默认以id为主键且假定id是一个递增的整数值也可以通过来自定义如果主键非递增数字值应设置primaryKey来自定义如果主键非递增数字值应设置incrementing false时间戳模型会默认在你的数据库表有 created_at 和 updated_at 字段设置可关闭模型自动维护这两个字段timestampsfalse可关闭模型自动维护这两个字段dateFormat 属性用于在模型中设置自己的时间戳格式数据库连接模型默认会使用应用程序中配置的数据库连接如果你想为模型指定不同的连接可以使用 $connection 属性自定义批量赋值当用户通过 HTTP 请求传入了非预期的参数并借助这些参数 create 方法更改了数据库中你并不打算要更改的字段这时就会出现批量赋值Mass-Assignment漏洞所以你需要先在模型上定义一个 白名单允许批量赋值字段名数组或fillable(白名单允许批量赋值字段名数组)或guarded(黑名单禁止批量赋值字段名数组) 1 // 用属性取回航班当结果不存在时创建它...
2 $flight App\Flight::firstOrCreate([name Flight 10]);
3
4 // 用属性取回航班当结果不存在时实例化一个新实例...
5 $flight App\Flight::firstOrNew([name Flight 10]); 模型软删除如果模型有一个非空值 deleted_at代表模型已经被软删除了。要在模型上启动软删除则必须在模型上使用Illuminate\Database\Eloquent\SoftDeletes trait 并添加 deleted_at 字段到你的模型 $dates 属性上和数据表中通过调用trashed方法可查询模型是否被软删除 1 ?php2 3 namespace App;4 5 use Illuminate\Database\Eloquent\Model;6 use Illuminate\Database\Eloquent\SoftDeletes;7 8 class Flight extends Model9 {
10 use SoftDeletes;
11
12 /**
13 * 需要被转换成日期的属性。
14 *
15 * var array
16 */
17 protected $dates [deleted_at];
18 } 查询作用域Laravel允许对模型设定全局作用域和本地作用域(包括动态范围)全局作用域允许我们为模型的所有查询添加条件约束(定义一个实现 Illuminate\Database\Eloquent\Scope 接口的类)而本地作用域允许我们在模型中定义通用的约束集合(模型方法前加上一个 scope 前缀)。作用域总是返回查询构建器 1 全局作用域定义2 ?php3 4 namespace App\Scopes;5 6 use Illuminate\Database\Eloquent\Scope;7 use Illuminate\Database\Eloquent\Model;8 use Illuminate\Database\Eloquent\Builder;9
10 class AgeScope implements Scope
11 {
12 /**
13 * 应用作用域
14 *
15 * param \Illuminate\Database\Eloquent\Builder $builder
16 * param \Illuminate\Database\Eloquent\Model $model
17 * return void
18 */
19 public function apply(Builder $builder, Model $model)
20 {
21 return $builder-where(age, , 200);
22 }
23 }
24
25 本地作用域
26 ?php
27
28 namespace App;
29
30 use Illuminate\Database\Eloquent\Model;
31
32 class User extends Model
33 {
34 /**
35 * 限制查询只包括受欢迎的用户。
36 *
37 * return \Illuminate\Database\Eloquent\Builder
38 */
39 public function scopePopular($query)
40 {
41 return $query-where(votes, , 100);
42 }
43
44 /**
45 * 限制查询只包括活跃的用户。
46 *
47 * return \Illuminate\Database\Eloquent\Builder
48 */
49 public function scopeActive($query)
50 {
51 return $query-where(active, 1);
52 }
53 }
54
55 动态范围
56 ?php
57
58 namespace App;
59
60 use Illuminate\Database\Eloquent\Model;
61
62 class User extends Model
63 {
64 /**
65 * 限制查询只包括指定类型的用户。
66 *
67 * return \Illuminate\Database\Eloquent\Builder
68 */
69 public function scopeOfType($query, $type)
70 {
71 return $query-where(type, $type);
72 }
73 } 隐藏和显示属性模型 属性用于隐藏属性和关联的输出hidden属性用于隐藏属性和关联的输出visible 属性用于显示属性和关联的输出另外makeVisible()还可用来临时修改可见性。当你要对关联进行隐藏时需使用关联的方法名称而不是它的动态属性名称 1 ?php2 3 namespace App;4 5 use Illuminate\Database\Eloquent\Model;6 7 class User extends Model8 {9 /**
10 * 在数组中可见的属性。
11 *
12 * var array
13 */
14 protected $visible [first_name, last_name];
15 }
16 ?
17
18 //makeVisible()用来临时修改可见性
19 return $user-makeVisible(attribute)-toArray(); 访问器和修改器访问器(getFooAttribute)和修改器(setFooAttribute)可以让你修改 Eloquent 模型中的属性或者设置它们的值比如你想要使用 Laravel 加密器来加密一个被保存在数据库中的值当你从 Eloquent 模型访问该属性时该值将被自动解密。访问器和修改器要遵循cameCase命名规范修改器会设置值到 Eloquent 模型内部的 $attributes 属性上 1 ?php2 3 namespace App;4 5 use Illuminate\Database\Eloquent\Model;6 7 class User extends Model8 {9 /**
10 * 获取用户的名字。
11 *
12 * param string $value
13 * return string
14 */
15 public function getFirstNameAttribute($value)
16 {
17 return ucfirst($value);
18 }
19
20 /**
21 * 设定用户的名字。
22 *
23 * param string $value
24 * return void
25 */
26 public function setFirstNameAttribute($value)
27 {
28 $this-attributes[first_name] strtolower($value);
29 }
30 } 而对于访问器与修改器的调用将是模型对象自动进行的 1 $user App\User::find(1);
2 $user-first_name Sally;//将自动调用相应的修改器
3 $firstName $user-first_name;//将自动调用相应的访问器 追加属性在转换模型到数组或JSON时你希望添加一个在数据库中没有对应字段的属性首先你需要为这个值定义一个 访问器然后添加该属性到改模型的 appends 属性中 1 ?php2 3 namespace App;4 5 use Illuminate\Database\Eloquent\Model;6 7 class User extends Model8 {9 /**
10 * 访问器被附加到模型数组的形式。
11 *
12 * var array
13 */
14 protected $appends [is_admin];
15
16 /**
17 * 为用户获取管理者的标记。
18 *
19 * return bool
20 */
21 public function getIsAdminAttribute()
22 {
23 return $this-attributes[admin] yes;
24 }
25 } 属性类型转换$casts 属性数组在模型中提供了将属性转换为常见的数据类型的方法且键是那些需要被转换的属性名称值则是代表字段要转换的类型。支持的转换的类型有integer、real、float、double、string、boolean、object、array、collection、date、datetime、timestamp 1 ?php2 3 namespace App;4 5 use Illuminate\Database\Eloquent\Model;6 7 class User extends Model8 {9 /**
10 * 应该被转换成原生类型的属性。
11 *
12 * var array
13 */
14 protected $casts [
15 is_admin boolean,//is_admin 属性以整数0 或 1被保存在我们的数据库中把它转换为布尔值
16 ];
17 } 序列化 Laravel模型及关联可递归序列化成数组或JSON 1 //单个模型实例序列化成数组2 $user App\User::with(roles)-first();3 return $user-toArray();4 //集合序列化成数组5 $users App\User::all();6 return $users-toArray();7 8 //单个模型实例序列化成JSON9 $user App\User::find(1);
10 return $user-toJson();
11 //直接进行string转换会将模型或集合序列化成JSON
12 $user App\User::find(1);
13 return (string) $user;
14 //因此你可以直接从应用程序的路由或者控制器中返回 Eloquent 对象
15 Route::get(users, function () {
16 return App\User::all();
17 }); 关联(方法)与动态属性在 Eloquent 模型中关联被定义成方法methods也可以作为强大的查询语句构造器 1 $user-posts()-where(active, 1)-get(); Eloquent 模型支持多种类型的关联一对一、一对多、多对多、远层一对多、多态关联、多态多对多关联 举个例子一个 User 模型会关联一个 Phone 模型一对一关联(hasOne) 1 ?php2 3 namespace App;4 5 use Illuminate\Database\Eloquent\Model;6 7 class User extends Model8 {9 /**
10 * 获取与用户关联的电话号码
11 */
12 public function phone()
13 {
14 return $this-hasOne(App\Phone);
15 }
16 } 动态属性允许你访问关联方法使用 Eloquent 的动态属性来获取关联记录如同他们是定义在模型中的属性 1 $phone User::find(1)-phone; Eloquent 会假设对应关联的外键名称是基于模型名称的。在这个例子里它会自动假设 Phone 模型拥有 user_id 外键。如果你想要重写这个约定则可以传入第二个参数到 hasOne 方法里 1 return $this-hasOne(App\Phone, foreign_key); 如果你想让关联使用 id 以外的值则可以传递第三个参数至 hasOne 方法来指定你自定义的键 1 return $this-hasOne(App\Phone, foreign_key, local_key); 如果我们要在 Phone 模型上定义一个反向关联此关联能够让我们访问拥有此电话的 User 模型。我们可以定义与 hasOne 关联相对应的 belongsTo 方法 1 ?php2 3 namespace App;4 5 use Illuminate\Database\Eloquent\Model;6 7 class Phone extends Model8 {9 /**
10 * 获取拥有该电话的用户模型。
11 */
12 public function user()
13 {
14 return $this-belongsTo(App\User);
15 }
16 } 模型事件 Laravel为模型定义的事件包括creating, created, updating, updated, saving, saved, deleting, deleted, restoring, restored。 模型上定义一个 $events 属性 1 ?php2 3 namespace App;4 5 use App\Events\UserSaved;6 use App\Events\UserDeleted;7 use Illuminate\Notifications\Notifiable;8 use Illuminate\Foundation\Auth\User as Authenticatable;9
10 class User extends Authenticatable
11 {
12 use Notifiable;
13
14 /**
15 * 模型的时间映射。
16 *
17 * var array
18 */
19 protected $events [
20 saved UserSaved::class,
21 deleted UserDeleted::class,
22 ];
23 } 如果你在一个给定的模型中监听许多事件也可使用观察者将所有监听器变成一个类类的一个方法就是一个事件监听器 1 定义观察者2 ?php3 4 namespace App\Observers;5 6 use App\User;7 8 class UserObserver9 {
10 /**
11 * 监听用户创建的事件。
12 *
13 * param User $user
14 * return void
15 */
16 public function created(User $user)
17 {
18 //
19 }
20
21 /**
22 * 监听用户删除事件。
23 *
24 * param User $user
25 * return void
26 */
27 public function deleting(User $user)
28 {
29 //
30 }
31 }
32
33 注册观察者
34 ?php
35
36 namespace App\Providers;
37
38 use App\User;
39 use App\Observers\UserObserver;
40 use Illuminate\Support\ServiceProvider;
41
42 class AppServiceProvider extends ServiceProvider
43 {
44 /**
45 * 运行所有应用.
46 *
47 * return void
48 */
49 public function boot()
50 {
51 User::observe(UserObserver::class);
52 }
53
54 /**
55 * 注册服务提供.
56 *
57 * return void
58 */
59 public function register()
60 {
61 //
62 }
63 } 八. Laravel的Restful风格 一般认为Restful风格的资源定义不包含操作但是在Laravel中操作(动词)也可作为一种资源来定义。下图是对Laravel中资源控制器操作原理的描述可以看到create、edit就直接出现在了URI中它们是一种合法的资源。对于create和edit这两种资源的访问都采用GET方法来实现第一眼看到顿感奇怪后来尝试通过artisan console生成资源控制器并注意到其对create、edit给出注释“ Show the form for ”字样方知它们只是用来展现表单而非提交表单的。 九. 扩展开发 我们知道Laravel本身是基于Composer管理的一个包遵循Composer的相关规范可以通过Composer来添加所依赖的其他Composer包因此在做应用的扩展开发时可以开发Composer包然后引入项目中即可另外也可开发基于Laravel的专属扩展包。下面所讲的就是Laravel的专属扩展开发最好的方式是使用 contracts 而不是 facades因为你开发的包并不能访问所有 Laravel 提供的测试辅助函数模拟 contracts 要比模拟 facade 简单很多。 服务提供者服务提供者是你的扩展包与 Laravel 连接的重点须定义自己的服务提供者并继承自 Illuminate\Support\ServiceProvider 基类路由若要为你的扩展包定义路由只需在包的服务提供者的 boot 方法中传递 routes 文件路径到 loadRoutesFrom 方法即可 1 /**
2 * 在注册后进行服务的启动。
3 *
4 * return void
5 */
6 public function boot()
7 {
8 $this-loadRoutesFrom(__DIR__./path/to/routes.php);
9 } 配置文件你可以选择性地将扩展包的配置文件发布(publishes)到应用程序本身的config目录上或者合并(mergeConfigFrom)到应用程序里的副本配置文件中但不应在配置文件中定义闭包函数当执行 config:cache Artisan命令时它们将不能正确地序列化 1 /**2 * 在注册后进行服务的启动。3 *4 * 用户使用 vendor:publish 命令可将扩展包的文件将会被复制到指定的位置上。5 *6 * return void7 */8 public function boot()9 {
10 $this-publishes([
11 __DIR__./path/to/config/courier.php config_path(courier.php),
12 ]);
13 }
14
15 $value config(courier.option);//只要你的配置文件被发布就可以如其它配置文件一样被访问
16
17 /**
18 * 或者选择性在容器中注册绑定。
19 *
20 * 此方法仅合并配置数组的第一级。如果您的用户部分定义了多维配置数组则不会合并缺失的选项
21 *
22 * return void
23 */
24 public function register()
25 {
26 $this-mergeConfigFrom(
27 __DIR__./path/to/config/courier.php, courier
28 );
29 } 数据库迁移如果你的扩展包包含数据库迁移需要使用 loadMigrationsFrom 方法告知 Laravel 如何去加载它们。在运行 php artisan migrate 命令时它们就会自动被执行不需要把它们导出到应用程序的 database/migrations 目录 1 /**
2 * 在注册后进行服务的启动。
3 *
4 * return void
5 */
6 public function boot()
7 {
8 $this-loadMigrationsFrom(__DIR__./path/to/migrations);
9 } 语言包如果你的扩展包里面包含了本地化则可以使用 loadTranslationsFrom 方法来告知 Laravel 该如何加载它们。下例假设你的包名称为courier 1 /**2 * 在注册后进行服务的启动。3 *4 * return void5 */6 public function boot()7 {8 $this-loadTranslationsFrom(__DIR__./path/to/translations, courier);9
10 //如果不想发布语言包至应用程序的 resources/lang/vendor 目录请注销对$this-publishes()调用。运行 Laravel 的 vendor:publish Artisan 命令可将扩展包的语言包复制到指定的位置上
11 $this-publishes([
12 __DIR__./path/to/translations resource_path(lang/vendor/courier),
13 ]);
14 }
15
16 echo trans(courier::messages.welcome);//扩展包翻译参照使用了双分号 package::file.line 语法 视图若要在 Laravel 中注册扩展包 视图则必须告诉 Laravel 你的视图位置loadViewsFrom 方法允许传递视图模板路径与扩展包名称两个参数。需要特别指出的是当你使用 loadViewsFrom 方法时Laravel 实际上为你的视图注册了两个位置一个是应用程序的 resources/views/vendor 目录另一个是你所指定的目录。Laravel会先检查 resources/views/vendor 目录是否存在待加载视图如果不存在才会从指定的目录去加载这个方法可以让用户很方便的自定义或重写扩展包视图。 1 /**2 * 在注册后进行服务的启动。3 *4 * return void5 */6 public function boot()7 {8 $this-loadViewsFrom(__DIR__./path/to/views, courier);9
10 //若要发布扩展包的视图至 resources/views/vendor 目录则必须使用服务提供者的 publishes 方法。运行 Laravel 的 vendor:publish Artisan 命令时扩展包的视图将会被复制到指定的位置上
11 $this-publishes([
12 __DIR__./path/to/views resource_path(views/vendor/courier),
13 ]);
14 }
15
16 //扩展包视图参照使用了双分号 package::view 语法
17 Route::get(admin, function () {
18 return view(courier::admin);
19 }); 命令使用 commands 方法给扩展包注册 Artisan 命令命令的定义要遵循Laravel Artisan 命令规范 1 /**2 * 在注册后进行服务的启动。3 *4 * return void5 */6 public function boot()7 {8 if ($this-app-runningInConsole()) {9 $this-commands([
10 FooCommand::class,
11 BarCommand::class,
12 ]);
13 }
14 } 公用 Assets你可以发布像 JavaScript、CSS 和图片这些资源文件到应用程序的 public 目录上。当用户执行 vendor:publish 命令时您的 Assets 将被复制到指定的发布位置。由于每次更新包时通常都需要覆盖资源因此您可以使用 --force 标志php artisan vendor:publish --tagpublic --force 1 /**2 * 在注册后进行服务的启动。3 *4 * return void5 */6 public function boot()7 {8 $this-publishes([9 __DIR__./path/to/assets public_path(vendor/courier),
10 ], public);
11 } 发布群组文件你可能想让用户不用发布扩展包的所有资源文件只需要单独发布扩展包的配置文件即可通过在调用 publishes 方法时使用标签来实现 1 /**2 * 在注册后进行服务的启动。3 *4 * return void5 */6 public function boot()7 {8 $this-publishes([9 __DIR__./../config/package.php config_path(package.php)
10 ], config);
11
12 $this-publishes([
13 __DIR__./../database/migrations/ database_path(migrations)
14 ], migrations);
15 } 对于上例运行命令 php artisan vendor:publish --tagconfig 时将忽略掉migrations部 转载于:https://www.cnblogs.com/xuqp/p/7285161.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/89759.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!