以及对子查询的改进等,中文文档

  • 栏目:基础 时间:2020-05-06 20:56
<返回列表

Laravel 6 已于近日正式发布,此版本也是最新的 LTS 版本。据介绍,从 Laravel 6 开始,Laravel 框架将会使用语义化版本。新特性还包括对 Laravel Vapor 的支持,改进授权响应,引入任务中间件和惰性集合,以及对子查询的改进等。除此之外,还有许多其他的细节优化。

必备品
文档:Documentation
API: API Reference
视频:Laracasts
速查表:Laravel 5.1 LTS 速查表

  Laravel作为在国内国外都颇为流行的PHP框架,风格优雅,其拥有自己的一些特点,且也发布长期支持版(LTS)。

韦德体育 1

中文文档
Laravel学院 – Laravel 5.1 中文文档
Laravel中文网 – 由PHPHub站长驱动
Laravel中文网 – 由Bootstrap中文网站长驱动

 

Laravel 6.0 是新的 LTS 版本

根据官方提供的发布计划,Laravel 6 的 bug 修复会持续至 2021 年 9 月 3 日,安全修复则持续至 2022 年 9 月 3 日。上一个 LTS 版本是两年前发布的 Laravel 5.5,其安全修复会持续至 2020 年 8 月 30 日。

韦德体育 2

Laravel 5
Laravel 5 基本原则 – Laracasts
Laravel 5 新特性- Laracasts 以及 Matt Stauffer’s blog
发布说明 – Laravel.com 以及 Laravel News
升级指南 – Laravel.com 以及 Matt Stauffer
从零开始学习 Laravel 5 – Laracasts

****. 请求周期

语义化版本

Laravel 6 及未来更高版本均遵循语义化版本标准,也就是说 Laravel 的软件包会保持和 Laravel 一致的版本标准,但不会影响发布周期。

Lumen
介绍: Introduction (Laracasts)
文档:Documentation(中文)

  Laravel 采用了单一入口模式,应用的所有请求入口都是 public/index.php 文件。

改进授权响应

在旧版本中,为终端用户提供有关授权的自定义错误消息十分困难。Laravel 6 引入了 Gate::inspect 方法来提供授权策略响应:

$response = Gate::inspect('view', $flight);

if ($response->allowed()) {
    // User is authorized to view the flight...
}

if ($response->denied()) {
    echo $response->message();
}

代码片段
Laravel Cheat Sheet
Laravel Tricks
Laravel Recipies
代码片段

  1. 注册类文件自动加载器:Laravel通过composer进行依赖管理,并在bootstrap/autoload.php中注册了Composer Auto Loader (PSR-4),应用中类的命名空间将被映射到类文件实际路径,不再需要开发者手动导入各种类文件,而由自动加载器自行导入。因此,Laravel允许你在应用中定义的类可以自由放置在Composer Auto Loader能自动加载的任何目录下,但大多数时候还是建议放置在app目录下或app的某个子目录下。
  2. 创建服务容器:从 bootstrap/app.php 文件中取得 Laravel 应用实例 $app(服务容器)。
  3. 创建 HTTP / Console 内核传入的请求在HTTP / Console 内核中进行预处理。HTTP 内核继承自 IlluminateFoundationHttpKernel 类,其中注入了 $app 和 $router 两个实例,内核是完成应用引导、请求处理(包括通过Router转发请求等)的场所。HTTP Kernel 定义了一个 bootstrappers 数组,配置了环境变量加载、应用配置加载、错误处理,以及其他在请求被处理前需要完成的工作。
  4. 载入服务提供者至容器:在内核引导启动的过程中最重要的动作之一就是载入服务提供者到你的 $app (即所有的服务提供者都要挂载到服务容器下去执行),服务提供者负责引导启动框架的全部各种组件,例如数据库、队列、验证器以及路由组件。因为这些组件引导和配置了框架的各种功能,所以服务提供者是整个 Laravel 启动过程中最为重要的部分,所有的服务提供者都配置在 config/app.php 文件中的 providers 数组中。首先,所有提供者的 register 方法会被调用;一旦所有提供者注册完成,接下来,boot 方法将会被调用。
  5. 分发请求:一旦应用完成引导和所有服务提供者都注册完成,Request 将会移交给Router进行分发。在通过Router转发请求时,所有请求都必须先经过全局HTTP中间件栈的处理,再调度到Router并获得其回调,然后执行该回调。

    关于中间件:
    (1)中间件好比一个过滤层,多个中间件就是多个过滤层,且它们有先后顺序。
    (2)全局中间件可分发前执行,也可分发后执行;中间件组使用组key(如'web'、'api')来调用middleware(key)执行,中间件组仅仅是为了使一次将多个中间件指定给路由变得更加方便;路由中间件在(自定义)路由分发中或分发后执行,也是通过key(如'auth')来调用middleware(key)执行的。
    (3)你也可以自定义前置或后置中间件,它们的差别在于在请求执行前还是执行后执行自定义动作。

    namespace AppHttpMiddleware;
    
    use Closure;
    
    class AfterMiddleware
    {
        public function handle($request, Closure $next)
        {
            $response = $next($request);
    
            // Perform action
    
            return $response;
        }
    }
    

     

    (4)如果你想在内核 handle 和 内核 terminate 时使用同一个中间件实例,可使用容器的 singleton 方法向容器注册中间件。

  6. 发送响应并结束:由Response发送响应,然后由内核发出terminate,包括调用可终止的中间件(定义了terminate方法的全局HTTP中间件和路由中间件)、 $app 服务容器终止。

任务中间件

任务中间件(Job Middleware)支持在中间件中运行任务:

// Add a middleware method to a job class
public function middleware()
{
     return [new SomeMiddleware];
}

// Specify middleware when dispatching a job
SomeJob::dispatch()->through([new SomeMiddleware]);

此中间件可避免在任务的 handle() 方法中编写自定义逻辑,详情请查看 Job Middleware is Coming to Laravel 6。

相关包
Packagist
Laravel Collective
Packalyst
Cartalyst
Spatie

     

韦德体育 ,惰性集合

惰性集合(Lazy Collections)用于处理大量的数据集合,包括 Eloquent 模型集合。Laravel 6 新增 IlluminateSupportLazyCollection 类来处理大型数据集,它利用 PHP 的生成器降低了所需的内存。查看 Lazy Collections 文档以了解更多详细信息。

开发者工具
Generators – 为Laravel自动生成代码(Laravel 4)
Blacksmith – 灵活的代码生成工具(Laravel 4)
IDE Helper – 为IDE的自动完成功能生成帮助文件(Laravel 4 & Laravel 5)
Jigsaw – 使用Blade的静态站点生成器
Laravel 5 CRUD Generator – Laravel 5 CRUD 生成器
Laravel 5 Extended Generators – 扩展内置的文件生成器(Laravel 5)
Laravel API/Scaffold/CRUD Generator – API、CRUD、脚手架生成器
Laracogs – Laravel 工具集(命令、服务、门面、模板等)
Html Menu Generator for Laravel – Html导航菜单生成器
Laravel Testtools – Chrome扩展,用于生成Laravel集成测试

二. 服务容器和服务提供者

子查询功能增强

关于 Laravel 6 中的 Eloquent 子查询功能增强请点此查看详细信息。

调试 & 分析
Debug Bar – 在Laravel中集成PHP的调试条
Clockwork – 集成Clockwork的Chrome扩展用于调试和分析应用
Laravel 5 Log Viewer – 在浏览器中查看Laravel日志
LogViewer – Laravel 5 日志查看器
LERN – Laravel 5扩展包,用于将异常写入数据库并发送通知
Mail Preview – 在web浏览器或邮件客户端中预览发送的邮件
Laravel Query Tracer – 查看数据库查询在Laravel应用什么地方调用

  服务容器是 Laravel 管理类依赖和运行依赖注入的有力工具,在类中可通过 $this->app 来访问容器,在类之外通过 $app 来访问容器;服务提供者是 Laravel 应用程序引导启动的中心,关系到服务提供者自身、事件监听器、路由的启动运行。因为应用程序中注册的路由通过RouteServiceProvider实例来加载,而事件监听器在EventServiceProvider类中进行注册。在新创建的应用中,AppServiceProvider 文件中方法实现都是空的,这个提供者是你添加应用专属的引导和服务的最佳位置,当然,对于大型应用你可能希望创建几个服务提供者,每个都具有粒度更精细的引导。服务提供者在 config/app.php 配置文件中的providers数组中进行注册

Laravel UI

Laravel 5.x 版本提供的前端脚手架现已被提取到一个单独的 laravel/ui Composer 包中,开发者可实现 UI 脚手架与主框架的分离,并进行独立的版本迭代。

如果需要使用传统的 Bootstrap/Vue 脚手架,请运行以下命令:

composer require laravel/ui
php artisan ui vue --auth

认证 & 授权
Confide – 用户认证解决方案(Laravel 4)
Defender – 基于角色&权限的访问控制列表(ACL)解决方案(Laravel 5)
Entrust – 基于角色的权限系统(Laravel 5)
JWT Auth – JSON Web令牌认证API
Laravel Permission – 分配用户角色对应权限(Laravel 5.1.11)
Laravel Roles – 处理角色及权限的包(Laravel 5)
OAuth 2 Server Laravel – 封装 OAuth 2.0 认证服务器和资源服务器
OAuth 4 Laravel – OAuth客户端封装以便支持Facebook, Twitter, Google等社交网络(Laravel 4)
Sentinel – 框架未知的认证&授权系统
Socialite – 封装 Facebook, Google, Twitter等社交媒体认证
Socialite Providers – 为Socialite准备的超过100个认证提供者(第三方登录)
Google2FA —— Google双重认证模块
Laravel User Verification – 处理Laravel 5中的用户验证流程

<?php

namespace AppProviders;

use RiakConnection;
use IlluminateSupportServiceProvider;

class RiakServiceProvider extends ServiceProvider
{
    /**
     * 在容器中注册绑定
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton(Connection::class, function ($app) {
            return new Connection(config('riak'));
        });
    }
}

相关资源

(文/开源中国)    

其它有用的利器
Aimeos Laravel package – Laravel 电子商务扩展包
Artisan View – 通过Artisan管理Laravel项目的视图
Blogify - 添加博客功能到Laravel应用的扩展包
Bootstrapper – 创建Bootstrap 3标记的类集
Captcha – Laravel 5 验证码生成器
Collect – 在Laravel之外使用Collection
Datatable – 为jQuery数据表插件集成服务器端和客户端
Ekko – 自动高亮当前激活的导航菜单并应用Bootstrap样式
Eloquent Sluggable – 创建Eloquent模型小物件
HTML – Laravel官方HTML及表单构建器
Hyn/multi-tenant – 该扩展包用于支持多个站点基于同一个Laravel安装
Intervention Image – 图片处理库(创建、编辑、压缩图片)
Laravel 5 form builder – Laravel 5 表单构建器
laravel-5-markdown-editor – Laravel 5 Markdown编辑器
Laravel 5 UEditor – 百度编辑器集成到Laravel5(支持七牛云存储)
Laravel Administrator – Laravel后台管理
Laravel API Document Generator – Laravel API 文档生成器
Laravel Breadcrumbs – 创建及管理面包屑导航
Laravel Censor —— 用于在Laravel 5.1中编辑、替换视图中指定单词/字符的中间件
Laravel Datatable – jQuery数据表API(Laravel 4 & Laravel 5)
Laravel Dot Env Generator – 基于项目源码生成 .env.gen 文件
Laravel Emoji – Laravel表情扩展包
Laravel EnvProviders – 基于开发环境加载服务提供者
Laravel Excel – 导入导出Excel和CSV文件
Laravel Friendships – 让Eloquent模型插上管理朋友关系的翅膀
Laravel GeoIP – 基于网站访问用户的IP地址判断其地理位置
Laravel Hashids – 使用Hashids生成短小的、唯一的、非顺序的数字id
Laravel Installer – 让你像安装WordPress一样按照向导安装Laravel
Laravel Markdown – 封装CommonMark
Laravel MediaLibrary – Eloquent模型助手文件
Laravel Messenger – 在Laravel中创建用户消息系统
Laravel Pinyin – 基于词库的中文转拼音优质解决方案
Laravel Repositories– 在Laravel中使用Repository模式实现业务逻辑与数据访问的分离
Laravel Responsecache – 通过缓存整个响应加速Laravel应用
Laravel Settings – 对Laravel进行全局配置
Laravel Server Monitor – Laravel应用服务器监听命令
Laravel Sms – Laravel 短信发送扩展包
Laravel Snappy – 使用wkhtmltopdf将HTML转化为PDF生成器
Laravel Stapler – 基于ORM的文件上传管理器
Laravel Stats Tracker – 从请求中收集信息以验证和存储
Laravel Tail – Laravel 5 漏掉的tail命令
Laravel Test Factory Generator – 通过已存在的模型生成Laravel测试工厂类
Laravel Uuid – 基于RFC 4122标准生成UUID的Laravel包
Laravel Web Installer – 通过浏览器安装 Laravel 5.1
Latest Laravel – 每天准时更新的 Laravel 不同分支完整包
Listify – 添加分类/排序到任意Eloquent模型
noCAPTCHA – Google新的noCAPTCHA(reCAPTCHA)助手
Purifier – 集成Laravel和HTMLPurifier
Recaptcha – 验证码校验器(Laravel 5)
Revisionable – 创建Eloquent模型的历史版本
SEOTools – Laravel和Lumen的SEO工具包
Setting – 将配置信息持久化存储到JSON文件中
Simple QrCode – Laravel二维码生成器
Teamwork – 在一个邀请系统中用户与小组的关联
Validating – 用于Eloquent模型保存验证的Trait
VAT Calculator – 处理所有与欧盟MOSS增值税条例相关的麻烦事儿

  

Javascript
Laroute – 在JavaScript中生成Laravel路由URLs
PHP Vars to JavaScript Transformer – 在JavaScript中处理来自服务器端的字符串、数组、集合以及其它数据结构的数据
Javascript Validation – 使用验证规则、消息、表单请求和验证器在客户端验证表单而不需要编写任何JavaScript代码

三. 依赖注入

前端模板
AdminLTE Template For Laravel 5 – 将默认 Laravel 前端模板代码替换成 AdminLTE 和 Pratt 页面

  Laravel 实现依赖注入方式有两种:自动注入和主动注册。自动注入通过参数类型提示由服务容器自动注入实现;主动注册则需开发人员通过绑定机制来实现,即绑定服务提供者或类(参考:  )。

数据库,ORMS, 迁移 & 填充
Backup Manager – 在S3, Dropbox, SFTP中备份及取出数据库
Baum – 在Laravel中实现嵌套集合模式
ClosureTable – 在Laravel中实现闭包表模型
Doctrine DBAL – 数据迁移(migrate)时支持列的重命名操作(renameColumn)
Eloquence – 为Eloquent模型添加额外功能特性
iSeed – 从已有数据表中生成一个新的填充文件
Laravel Backup – 备份 Laravel 5 应用的包
Laravel Doctrine – Doctrine 2 ORM 实现
Laravel Flysystem – 从远程主机(AWS S3, Dropbox等)而非本地文件系统提取文件
Laravel MongoDB – 支持MongoDB的Eloquent模型及Query构造器
Laravel 5 Soft Cascade – 使用Laravel软删除功能实现级联删除和恢复
Migrations Generator – 从已有数据库中生成迁移
Sofa/Eloquence – Eloquent ORM 扩展
Tenanti – 群租数据库结构管理器
belongsToThrough – 逆向的远层一对多

  1. 绑定服务提供者或类:这种方式对依赖注入的实现可以非常灵活多样

    use IlluminateSupportFacadesStorage;
    use AppHttpControllersPhotoController;
    use AppHttpControllersVideoController;
    use IlluminateContractsFilesystemFilesystem;
    
    $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');
              });
    
  2. 参数类型声明:通过对类的构造器参数类型、类的方法参数类型、闭包的参数类型给出提示来实现

    <?php
    
    namespace AppHttpControllers;
    
    use AppUsersRepository 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');
    
            //
        }
    }
    
  3. 路由参数依赖:下边的示例使用 IlluminateHttpRequest 类型提示的同时还获取到路由参数id

    你的路由可能是这样定义的:
    Route::put('user/{id}', 'UserController@update');
    
    而控制器对路由参数id的依赖却可能是这样实现的:
    <?php
    
    namespace AppHttpControllers;
    
    use IlluminateHttpRequest;
    
    class UserController extends Controller
    {
        /**
         * 更新指定的用户。
         *
         * @param  Request  $request
         * @param  string  $id
         * @return Response
         */
        public function update(Request $request, $id)
        {
            //
        }
    }
    

     

搜索
Algolia Search – 集成 Algolia Search API到Laravel Eloquent ORM
Elasticquent – 为Eloquent模型准备的Elasticsearch
Laravel Search – Elasticsearch、Algolia以及 ZendSearch的统一API
Laravel Searchy – Laravel 搜索扩展包,让用户可以轻松进行精准匹配或模糊查询
SearchIndex – 在Algolia或Elasticsearch存储或获取对象数据
Searchable – 添加简单搜索功能到Eloquent模型的trait

**四. **Artisan Console 

APIs
APIGuard – 使用Laravel中的API键简单认证API
Dingo API – 在应用中构建RESTful APIs
Laravel CORS – 添加 CORS (Cross-Origin Resource Sharing) 头支持
Trucker – 匹配远程API资源 (通常是RESTful风格)
Laravel Fractal – 使用Fractal在Laravel和Lumen中输出复杂灵活的Ajax/RESTful结构数据

  Laravel利用PHP的CLI构建了强大的Console工具artisan,artisan几乎能够创建任何你想要的模板类以及管理配置你的应用,在开发和运维管理中扮演着极其重要的角色,artisan是Laravel开发不可或缺的工具。在Laravel根目录下运行:PHP artisan list可查看所有命令列表。用好artisan能极大地简化开发工作,并减少错误发生;另外,还可以编写自己的命令。下面列举部分比较常用的命令:

任务, 命令和调度
Dispatcher – 调度Artisan命令
Elixr – Node(NPM) 包用于运行Gulp任务(监控文件、运行测试、最小化CSS、组合脚本等等)
Envoy – SSH任务运行器

支付
Laravel Cashier – 为Stripe提供了平滑、优雅的接口实现订购支付功能(信用卡支付)
Omnipay for Laravel – 集成 Omnipay PHP支付处理库(含支付宝、银联支付、微信支付、Paypal、Stripe等)
Alipay – 支付宝SDK在Laravel 5中的封装

 

优化
Intervention Image Cache – 图片类的缓存扩展
Laravel HTMLMin – 最小化 blade/html/css/js

**五. 表单验证机制

本地化
Language Files – 支持37种语言的验证、分页以及提醒
Laravel Localization – 通过路由添加i18n支持
Laravel Translatable – 取出及保存可翻译的Eloquent模型类实例
Laravel Translator – 将Eloquent模型翻译到多种语言文件
Laravel Date – 基于Carbon的库,用于处理多语言日期格式
Laravel Langman – 从Artisan命令行管理语言文件

  表单验证在web开发中是不可或缺的,其重要性也不言而喻,也算是每个web框架的标配部件了。Laravel表单验证拥有标准且庞大的规则集,通过规则调用来完成数据验证,多个规则组合调用须以“|”符号连接,一旦验证失败将自动回退并可自动绑定视图。

模块化
Laravel 5 Modules – Laravel 5 中实现模块化开发

  下例中,附加bail规则至title属性,在第一次验证required失败后将立即停止验证;“.”语法符号在Laravel中通常表示嵌套包含关系,这个在其他语言或框架语法中也比较常见

第三方服务集成
Laravel Algolia – 连接 Algolia API
Laravel Analytics – 可配置的Laravel 5 包用于从Google Analytics获取页面浏览数或其他数据
Laravel DigitalOcean – 连接 DigitalOceanV2
Laravel Dropbox – 连接 Dropbox
Laravel Facebook – Laravel Facebook API
Laravel GitHub – 连接 PHP GitHub API
Laravel GitLab – 连接 GitLab API
Laravel Googletagmanager – 轻松设置并发送数据到 Google Tag Manager
Laravel Instagram – 连接 Instagram API
Laravel Newsletter – 使用Mailchimp发送时事通讯
Laravel Parse – 连接 PHP Parse SDK
Laravel Pusher – 连接 Pusher API
Laravel Pushwoosh – Pushwoosh API
Laravel Slack – 发动消息到Slack
Laravel Vimeo – 连接 Vimeo API
stormpath-laravel – 使用Laravel和Stormpath构建安全的Web应用
Laravel Wechat – 目前最优雅的微信公众平台 SDK
Laravel Wechat SDK – 另一个微信公众平台 Laravel SDK
AliyunOSS —— 阿里云 OSS 官方 SDK 的 Composer 封装,支持任何 PHP 项目,包括 Laravel、Symfony 等等
Laravel Qiniu —— Qiniu 云储存 Laravel 5 Storage版

$this->validate($request, [
    'title' => 'bail|required|unique:posts|max:255',
    'author.name' => 'required',
    'author.description' => 'required',
]);

开发环境
Homestead – Laravel官方Vagrant boxLaravel Homestead快速入门
在OSx and Linux上安装
在Windows上安装(TreeHouse)
在Windows上安装(Laragon)
在 Windows 上进行 Laravel Homestead 安装、配置及测试
在 Docker 中运行 Homestead

Laravel验证规则参考 http://d.laravel-china.org/docs/5.4/validation#可用的验证规则 ;另外,在Laravel开发中还可采用如下扩展规则:

Valet – Mac极简开发环境
LaraDock – 在Docker上运行Laravel(和Homestead类似但是使用Docker而不是Vagrant部署)
LaraEdit Docker – 在Docker容器中运行Homestead开发环境
通过Composer安装 LaravelWindows
Mac OSX 或 Linux
在Windows上安装Laravel 5.1.x(中文)

  1. 自定义FormRequest (须继承自 IlluminateFoundationHttpFormRequest )
  2. Validator::make()手动创建validator实例
  3. 创建validator实例验证后钩子
  4. 按条件增加规则
  5. 数组验证
  6. 自定义验证规则

主机
Forge – Linode和DigitalOcean上经优化的PHP服务器Forge中的服务器管理 (Laracasts)
让你的第一个站点在Laravel Forge中启动并运行 (Matt Stauffer)
ForgeRecipes

 

FortRabbit (视频)
PagodaBox (文档)
Heroku (教程)
IBM BlueMix (教程)
AWS Elastic Beanstalk(教程)

**六. 事件机制**

应用部署
Envoyer – 快速部署 PHP & Laravel 项目通过Envoyer进行部署 (Laracasts)

  Laravel事件机制是一种很好的应用解耦方式,因为一个事件可以拥有多个互不依赖的监听器。事件类 (Event) 类通常保存在 app/Events 目录下,而它们的监听类 (Listener) 类被保存在 app/Listeners 目录下,使用 Artisan 命令来生成事件和监听器时他们会被自动创建。

Rocketeer – 任务运行期及部署包

  1. 注册事件和监听器:EventServiceProvider的 listen 属性数组用于事件(键)到对应的监听器(值)的注册,然后运行 php artisan event:generate将自动生成EventServiceProvider中所注册的事件(类)模板和监听器模板,然后在此基础之上进行修改来实现完整事件和监听器定义;另外,你也可以在 EventServiceProvider 类的 boot 方法中通过注册闭包事件来实现
  2. 定义事件(类):事件(类)就是一个包含与事件相关信息数据的容器,不包含其它逻辑

     1 <?php
     2 
     3 namespace AppEvents;
     4 
     5 use AppOrder;
     6 use IlluminateQueueSerializesModels;
     7 
     8 class OrderShipped
     9 {
    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 }
    
  3. 定义监听器:事件监听器在 handle 方法中接受了事件实例作为参数

     1 <?php
     2 
     3 namespace AppListeners;
     4 
     5 use AppEventsOrderShipped;
     6 
     7 class SendShipmentNotification
     8 {
     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 }
    
  4. 停止事件传播:在监听器的 handle 方法中返回 false 来停止事件传播到其他的监听器

  5. 触发事件:调用 event 辅助函数可触发事件,事件将被分发到它所有已经注册的监听器上

     1 <?php
     2 
     3 namespace AppHttpControllers;
     4 
     5 use AppOrder;
     6 use AppEventsOrderShipped;
     7 use AppHttpControllersController;
     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 }
    
  6. 队列化事件监听器:如果监听器中需要实现一些耗时的任务,比如发送邮件或者进行 HTTP 请求,那把它放到队列中处理是非常有用的。在使用队列化监听器,须在服务器或者本地环境中配置队列并开启一个队列监听器,还要增加 ShouldQueue 接口到你的监听器类;如果你想要自定义队列的连接和名称,你可以在监听器类中定义 $connection 和 $queue 属性;如果队列监听器任务执行次数超过在工作队列中定义的最大尝试次数,监听器的 failed 方法将会被自动调用

     1 <?php
     2 
     3 namespace AppListeners;
     4 
     5 use AppEventsOrderShipped;
     6 use IlluminateContractsQueueShouldQueue;
     7 
     8 class SendShipmentNotification implements ShouldQueue
     9 {
    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 }
    
  7. 事件订阅者:事件订阅者允许在单个类中定义多个事件处理器,还应该定义一个 subscribe 方法,这个方法接受一个事件分发器的实例,通过调用事件分发器的 listen 方法来注册事件监听器,然后在 EventServiceProvider 类的 $subscribe 属性中注册订阅者

     1 <?php
     2 
     3 namespace AppListeners;
     4 
     5 class UserEventSubscriber
     6 {
     7     /**
     8      * 处理用户登录事件。
     9      */
    10     public function onUserLogin($event) {}
    11 
    12     /**
    13      * 处理用户注销事件。
    14      */
    15     public function onUserLogout($event) {}
    16 
    17     /**
    18      * 为订阅者注册监听器。
    19      *
    20      * @param  IlluminateEventsDispatcher  $events
    21      */
    22     public function subscribe($events)
    23     {
    24         $events->listen(
    25             'IlluminateAuthEventsLogin',
    26             'AppListenersUserEventSubscriber@onUserLogin'
    27         );
    28 
    29         $events->listen(
    30             'IlluminateAuthEventsLogout',
    31             'AppListenersUserEventSubscriber@onUserLogout'
    32         );
    33     }
    34 
    35 }
    

视频
英文
Laracasts
Coursecode (YouTube)
Tuts+
Udemy
Treehouse
Duilio Palacios
DevDojo
Amitav Roy
Lynda
Pluralsight
Laracademy

 

讨论
英文
Laracon US
Laracon EU
ArtisanConf

七. Eloquent 模型

书籍
Laravel: Code Bright
Laravel: From Apprentice To Artisan
Laravel Application Development Blueprints(10个小项目)
Laravel 4 Cookbook(Laravel的相关扩展知识)
Learning Laravel 4 Application Development(一个完整项目,适合有基础的看,有些地方有错误)

  Eloquent ORM 以ActiveRecord形式来和数据库进行交互,拥有全部的数据表操作定义,单个模型实例对应数据表中的一行

Laravel Application Development Cookbook
Building Web Applications Using Parse REST API
Laravel – My First Framework
Easy Laravel 5
Laravel 5 Essentials
Laravel 5.1 Beauty
Easy E-Commerce Using Laravel and Stripe
Design Patterns with PHP and Laravel
Laravel 5 Learn Easy
Mastering Laravel
How to Build Real-Time Laravel Apps with Pusher
Learning Laravel’s Eloquent
Laravel 5 Learn Easy
Laravel and AngularJS
Laravel 5 UnFolded
Laravel Collections Unraveled
Writing APIs With Lumen
The Laravel Survival Guide
Laraboot: Laravel 5 For Beginners

1 $flights = AppFlight::where('active', 1)
2                ->orderBy('name', 'desc')
3                ->take(10)
4                ->get(); 

代码库
原型项目
Laravel 5 Boilerplate —— 基于当前Laravel最新版本(Laravel 5.1.*)并集成Boilerplate的项目
Laravel 5 Angular Material Starter —— 这是一个Laravel 5.1和AngularJS的原型项目
Acacha adminlte-laravel
Laravel Hackathon Starter

  config/database.php中包含了模型的相关配置项。Eloquent 模型约定:

CMS
Bootstrap CMS —— Laravel 5.1驱动的功能强大的CMS
October —— 基于Laravel 5,致力于让开发工作变得简单的CMS
PyroCMS —— MVC架构的PHP内容管理系统,3.0以前基于CodeIgniter,目前基于Laravel 5.1
LavaLite —— 基于Laravel 5.1 & Bootstrap 3的内容管理系统
TypiCMS —— 基于 Laravel 5 构建的、支持多语言的内容管理系统
Laravel and AngularJS CMS —— 基于Laravel 5.1和AngularJS的CMS
Microweber —— 基于 Laravel 拖拽式生成 CMS 及在线商店利器
Asgard CMS
Coaster Cms
Larapress(基于Laravel 4)

  1. 数据表名:模型以单数形式命名(CamelCase),对应的数据表为蛇形复数名(snake_cases),模型的$table属性也可用来指定自定义的数据表名称
  2. 主键:模型默认以id为主键且假定id是一个递增的整数值,也可以通过$primaryKey来自定义;如果主键非递增数字值,应设置$incrementing = false
  3. 时间戳:模型会默认在你的数据库表有 created_at 和 updated_at 字段,设置$timestamps = false可关闭模型自动维护这两个字段;$dateFormat 属性用于在模型中设置自己的时间戳格式
  4. 数据库连接:模型默认会使用应用程序中配置的数据库连接,如果你想为模型指定不同的连接,可以使用 $connection 属性自定义
  5. 批量赋值:当用户通过 HTTP 请求传入了非预期的参数,并借助这些参数 create 方法更改了数据库中你并不打算要更改的字段,这时就会出现批量赋值(Mass-Assignment)漏洞,所以你需要先在模型上定义一个 $fillable(白名单,允许批量赋值字段名数组) 或 $guarded(黑名单,禁止批量赋值字段名数组)

    1 // 用属性取回航班,当结果不存在时创建它...
    2 $flight = AppFlight::firstOrCreate(['name' => 'Flight 10']);
    3 
    4 // 用属性取回航班,当结果不存在时实例化一个新实例...
    5 $flight = AppFlight::firstOrNew(['name' => 'Flight 10']);
    
  6. 模型软删除:如果模型有一个非空值 deleted_at,代表模型已经被软删除了。要在模型上启动软删除,则必须在模型上使用IlluminateDatabaseEloquentSoftDeletes trait 并添加 deleted_at 字段到你的模型 $dates 属性上和数据表中,通过调用trashed方法可查询模型是否被软删除

     1 <?php
     2 
     3 namespace App;
     4 
     5 use IlluminateDatabaseEloquentModel;
     6 use IlluminateDatabaseEloquentSoftDeletes;
     7 
     8 class Flight extends Model
     9 {
    10     use SoftDeletes;
    11 
    12     /**
    13      * 需要被转换成日期的属性。
    14      *
    15      * @var array
    16      */
    17     protected $dates = ['deleted_at'];
    18 }
    
  7. 查询作用域:Laravel允许对模型设定全局作用域和本地作用域(包括动态范围),全局作用域允许我们为模型的所有查询添加条件约束(定义一个实现 IlluminateDatabaseEloquentScope 接口的类),而本地作用域允许我们在模型中定义通用的约束集合(模型方法前加上一个 scope 前缀)。作用域总是返回查询构建器

     1 全局作用域定义:
     2 <?php
     3 
     4 namespace AppScopes;
     5 
     6 use IlluminateDatabaseEloquentScope;
     7 use IlluminateDatabaseEloquentModel;
     8 use IlluminateDatabaseEloquentBuilder;
     9 
    10 class AgeScope implements Scope
    11 {
    12     /**
    13      * 应用作用域
    14      *
    15      * @param  IlluminateDatabaseEloquentBuilder  $builder
    16      * @param  IlluminateDatabaseEloquentModel  $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 IlluminateDatabaseEloquentModel;
    31 
    32 class User extends Model
    33 {
    34     /**
    35      * 限制查询只包括受欢迎的用户。
    36      *
    37      * @return IlluminateDatabaseEloquentBuilder
    38      */
    39     public function scopePopular($query)
    40     {
    41         return $query->where('votes', '>', 100);
    42     }
    43 
    44     /**
    45      * 限制查询只包括活跃的用户。
    46      *
    47      * @return IlluminateDatabaseEloquentBuilder
    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 IlluminateDatabaseEloquentModel;
    61 
    62 class User extends Model
    63 {
    64     /**
    65      * 限制查询只包括指定类型的用户。
    66      *
    67      * @return IlluminateDatabaseEloquentBuilder
    68      */
    69     public function scopeOfType($query, $type)
    70     {
    71         return $query->where('type', $type);
    72     }
    73 }
    
  8. 隐藏和显示属性:模型 $hidden 属性用于隐藏属性和关联的输出, $visible 属性用于显示属性和关联的输出,另外makeVisible()还可用来临时修改可见性。当你要对关联进行隐藏时,需使用关联的方法名称,而不是它的动态属性名称

     1 <?php
     2 
     3 namespace App;
     4 
     5 use IlluminateDatabaseEloquentModel;
     6 
     7 class User extends Model
     8 {
     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();
    
  9. 访问器和修改器:访问器(getFooAttribute)和修改器(setFooAttribute)可以让你修改 Eloquent 模型中的属性或者设置它们的值,比如你想要使用 Laravel 加密器来加密一个被保存在数据库中的值,当你从 Eloquent 模型访问该属性时该值将被自动解密。访问器和修改器要遵循cameCase命名规范,修改器会设置值到 Eloquent 模型内部的 $attributes 属性上

     1 <?php
     2 
     3 namespace App;
     4 
     5 use IlluminateDatabaseEloquentModel;
     6 
     7 class User extends Model
     8 {
     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 = AppUser::find(1);
    2 $user->first_name = 'Sally';//将自动调用相应的修改器
    3 $firstName = $user->first_name;//将自动调用相应的访问器 
    
  10. 追加属性:在转换模型到数组或JSON时,你希望添加一个在数据库中没有对应字段的属性,首先你需要为这个值定义一个 访问器,然后添加该属性到改模型的 appends 属性中

     1 <?php
     2 
     3 namespace App;
     4 
     5 use IlluminateDatabaseEloquentModel;
     6 
     7 class User extends Model
     8 {
     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 }
    
  11. 属性类型转换:$casts 属性数组在模型中提供了将属性转换为常见的数据类型的方法,且键是那些需要被转换的属性名称,值则是代表字段要转换的类型。支持的转换的类型有:integer、real、float、double、string、boolean、object、array、collection、date、datetime、timestamp

     1 <?php
     2 
     3 namespace App;
     4 
     5 use IlluminateDatabaseEloquentModel;
     6 
     7 class User extends Model
     8 {
     9     /**
    10      * 应该被转换成原生类型的属性。
    11      *
    12      * @var array
    13      */
    14     protected $casts = [
    15         'is_admin' => 'boolean',//is_admin 属性以整数(0 或 1)被保存在我们的数据库中,把它转换为布尔值
    16     ];
    17 }
    
  12. 序列化: Laravel模型及关联可递归序列化成数组或JSON

     1 //单个模型实例序列化成数组
     2 $user = AppUser::with('roles')->first();
     3 return $user->toArray();
     4 //集合序列化成数组
     5 $users = AppUser::all();
     6 return $users->toArray();
     7 
     8 //单个模型实例序列化成JSON
     9 $user = AppUser::find(1);
    10 return $user->toJson();
    11 //直接进行string转换会将模型或集合序列化成JSON
    12 $user = AppUser::find(1);
    13 return (string) $user;
    14 //因此你可以直接从应用程序的路由或者控制器中返回 Eloquent 对象
    15 Route::get('users', function () {
    16     return AppUser::all();
    17 });
    
  13. 关联(方法)与动态属性:在 Eloquent 模型中,关联被定义成方法(methods),也可以作为强大的查询语句构造器

    1 $user->posts()->where('active', 1)->get();
    

    Eloquent 模型支持多种类型的关联:一对一、一对多、多对多、远层一对多、多态关联、多态多对多关联

    举个例子,一个 User 模型会关联一个 Phone 模型,一对一关联(hasOne)

     1 <?php
     2 
     3 namespace App;
     4 
     5 use IlluminateDatabaseEloquentModel;
     6 
     7 class User extends Model
     8 {
     9     /**
    10      * 获取与用户关联的电话号码
    11      */
    12     public function phone()
    13     {
    14         return $this->hasOne('AppPhone');
    15     }
    16 }
    

    动态属性允许你访问关联方法,使用 Eloquent 的动态属性来获取关联记录,如同他们是定义在模型中的属性

    1 $phone = User::find(1)->phone;
    

    Eloquent 会假设对应关联的外键名称是基于模型名称的。在这个例子里,它会自动假设 Phone 模型拥有 user_id 外键。如果你想要重写这个约定,则可以传入第二个参数到 hasOne 方法里

    1 return $this->hasOne('AppPhone', 'foreign_key');
    

    如果你想让关联使用 id 以外的值,则可以传递第三个参数至 hasOne 方法来指定你自定义的键

    1 return $this->hasOne('AppPhone', 'foreign_key', 'local_key');
    

    如果我们要在 Phone 模型上定义一个反向关联,此关联能够让我们访问拥有此电话的 User 模型。我们可以定义与 hasOne 关联相对应的 belongsTo 方法

     1 <?php
     2 
     3 namespace App;
     4 
     5 use IlluminateDatabaseEloquentModel;
     6 
     7 class Phone extends Model
     8 {
     9     /**
    10      * 获取拥有该电话的用户模型。
    11      */
    12     public function user()
    13     {
    14         return $this->belongsTo('AppUser');
    15     }
    16 } 
    
  14. 模型事件: Laravel为模型定义的事件包括creating, created, updating, updated, saving, saved, deleting, deleted, restoring, restored。 模型上定义一个 $events 属性

     1 <?php
     2 
     3 namespace App;
     4 
     5 use AppEventsUserSaved;
     6 use AppEventsUserDeleted;
     7 use IlluminateNotificationsNotifiable;
     8 use IlluminateFoundationAuthUser 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 <?php
     3 
     4 namespace AppObservers;
     5 
     6 use AppUser;
     7 
     8 class UserObserver
     9 {
    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 AppProviders;
    37 
    38 use AppUser;
    39 use AppObserversUserObserver;
    40 use IlluminateSupportServiceProvider;
    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.io —— Laravel开发者社区
Flarum —— 免费的、开源的、专注于简约的论坛系统,esoTalk和FluexBB的联合继承者
PHPHub —— 基于Laravel 4.2,积极向上的 PHP & Laravel 开发者社区

 

电商
Antvel —— 基于 Laravel 5.* 开发的开源电子商务项目

**八. Laravel的Restful风格**

项目管理
92five app —— 基于 Laravel框架 & Backbone JS 构建,是一个自托管的、基于web的项目管理应用
Scrumwala —— 基于Laravel5,项目管理应用

  一般认为Restful风格的资源定义不包含操作,但是在Laravel中操作(动词)也可作为一种资源来定义。下图是对Laravel中资源控制器操作原理的描述,可以看到,create、edit就直接出现在了URI中,它们是一种合法的资源。对于create和edit这两种资源的访问都采用GET方法来实现,第一眼看到顿感奇怪,后来尝试通过artisan console生成资源控制器,并注意到其对create、edit给出注释“ Show the form for ”字样,方知它们只是用来展现表单而非提交表单的。

博客
Wardrobe —— 专注于写作的最小化博客平台
Katana —— 静态站点/博客生成器
Laravel 5 Blog —— 基于 Laravel 5 开发的博客系统
0ez —— 基于Laravel的 轻博客系统

韦德体育 3

其他
Laravel.com —— Laravel官网源码
Laravel Tricks —— Laravel小技巧&小贴士
Invoice Ninja —— 基于Laravel构建的开源发票及时间跟踪应用
Paperwork —— 基于Laravel 4.X的开源的笔记&归档工具
Cachet —— 基于Laravel 5的开源的状态页系统
StyleCI —— 由 PHP CS Fixer开发,提供PHP代码风格持续集成服务
Podcastwala —— 基于Laravel 5,构建属于你自己的播客网站
Deployer —— 基于Laravel 5.1的、免费的、开源的PHP应用部署工具
RSS Monster —— 基于 Lumen 开发的 RSS 聚合器和阅读器
Koel —— 基于 Laravel 5.1 & Vue.js 开发的酷炫音乐流媒体应用
Attendize —— 基于 Laravel 框架开发的开源门票及活动管理应用
Laramap
Laravel.so

 

新闻
Laravel News (archive)
Laravel Weekly
Laravel 新闻

九. 扩展开发

播客
The Laravel Podcast
The Laravel News Podcast
The Laracasts Snippet
Larachat Live

  我们知道,Laravel本身是基于Composer管理的一个包,遵循Composer的相关规范,可以通过Composer来添加所依赖的其他Composer包,因此在做应用的扩展开发时,可以开发Composer包然后引入项目中即可;另外也可开发基于Laravel的专属扩展包。下面所讲的就是Laravel的专属扩展开发,最好的方式是使用 contracts ,而不是 facades,因为你开发的包并不能访问所有 Laravel 提供的测试辅助函数,模拟 contracts 要比模拟 facade 简单很多。

社区
中文
PHPHub
Laravel中文网问答社区
SegmentFault上Laravel问答归档
知乎Laravel话题
开源中国社区Laravel标签归档

其它
通过Laravel构建的站点及项目 – 通过Laravel构建的站点及项目展示
Larasites – 基于Laravel构建的网站
CodeCanyon – 支付脚本和插件
Laramap – Laravel开发者地图
Laravel Versions {x.y.z} – Laravel更新记录

上一篇:将调查谷歌的在线广告交易是否违反了《一般数据保护条例》,包括关注用户隐私的网页浏览器Brave在内的第三方机构 下一篇:微软确保 Go,改进的模块支持(准备成为Go

更多阅读

以及对子查询的改进等,中文文档

基础 2020-05-06
Laravel 6已于近日正式发布,此版本也是最新的LTS 版本。据介绍,从 Laravel 6 开始,Laravel框架将...
查看全文

微软确保 Go,改进的模块支持(准备成为

基础 2020-05-06
Go 1.13 发布了,该版本值得关注的改进包括: 2019年2月25日,Go编程语言团队发布Go 1.12。其中一...
查看全文

该版本的一些关键亮点包括,本文是有关

基础 2020-05-05
微软发布 VS Code 1.38,该版本的一些关键亮点包括: 英文:Martin Heller  译文:葡萄城控件 学习...
查看全文

友情链接: 网站地图

Copyright © 2015-2019 http://www.koi-bumi.com. 韦德体育有限公司 版权所有