安装
环境要求
PHP版本 >= 5.6.4
PHP扩展:OpenSSL
PHP扩展:PDO
PHP扩展:Mbstring
PHP扩展:Tokenizer
PHP扩展:XML
安装
composer create-project --prefer-dist laravel/laravel blog
composer create-project --prefer-dist laravel/laravel blog 5.3.*
应用key
php artisan key:generate
伪静态
如果Laravel自带的.htaccess文件不起作用,试试将其中内容做如下替换:
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
Nginx
如果你使用的是Nginx,使用如下站点配置指令就可以支持URL美化:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
配置
.env
通过 App 门面 的 environment 方法来访问其值:
$environment = App::environment();
访问配置值
$value = config('app.timezone');
设置配置值
config(['app.timezone' => 'America/Chicago']);
配置缓存
为了给应用加速,你可以使用 Artisan 命令 config:cache 将所有配置文件的配置缓存到单个文件里,这将会将所有配置选项合并到单个文件从而可以被框架快速加载。
应用一旦上线,就要运行一次 php artisan config:cache,但是在本地开发时,没必要经常运行该命令,因为配置值经常需要改变。
如果在部署过程中执行 config:cache 命令,确保只在配置文件中调用了 env 方法。
维护模式
当你的应用处于维护模式时,所有对应用的请求都会返回同一个自定义视图。这一机制在对应用进行升级或者维护时,使得“关闭”站点变得轻而易举。对维护模式的判断代码位于应用默认的中间件栈中,如果应用处于维护模式,则状态码为 503 的 MaintenanceModeException 将会被抛出。
要开启维护模式,只需执行 Artisan 命令 down 即可:
php artisan down
还可以提供 message 和 retry 选项给 down 命令。message的值用于显示和记录自定义消息,而retry的值用于设置HTTP请求头的Retry-After:
php artisan down --message="Upgrading Database" --retry=60
要关闭维护模式,对应的 Artisan 命令是 up:
php artisan up
维护模式响应模板
默认的维护模式响应视图模板是 resources/views/errors/503.blade.php,如果需要的话你可以修改这个视图文件。
维护模式 & 队列
当你的站点处于维护模式中时,所有的队列任务都不会执行;当应用退出维护模式这些任务才会被继续正常处理。
维护模式的替代方案
由于维护模式命令的执行需要几秒时间,你可以考虑使用 Envoyer 实现 0 秒下线作为替代方案。
目录结构
1、简介
Laravel 应用默认的目录结构试图为不管是大型应用还是小型应用提供一个好的起点,当然,你可以自己按照喜好重新组织应用目录结构,Laravel 对类在何处被加载没有任何限制——只要 Composer 可以自动载入它们即可。
Models目录在哪里?
许多初学者都会困惑 Laravel 为什么没有 models 目录,我可以负责任的告诉大家,这是故意的。因为models 这个词对不同人而言有不同的含义,容易造成歧义,有些开发者认为应用的模型指的是业务逻辑,另外一些人则认为模型指的是与关联数据库的交互。
正是因为这个原因,我们默认将 Eloquent 的模型直接放置到 app 目录下,从而允许开发者自行选择放置的位置。
2、根目录
App目录
app 目录包含了应用的核心代码,此外你为应用编写的代码绝大多数也会放到这里;
Bootstrap目录
bootstrap 目录包含了少许文件,用于框架的启动和自动载入配置,还有一个 cache 文件夹用于包含框架为提升性能所生成的文件,如路由和服务缓存文件;
Config目录
config 目录包含了应用所有的配置文件,建议通读一遍这些配置文件以便熟悉所有配置项;
Database目录
database 目录包含了数据迁移及填充文件,如果你喜欢的话还可以将其作为 SQLite 数据库存放目录;
Public目录
public 目录包含了入口文件 index.php 和前端资源文件(图片、JavaScript、CSS等);
Resources目录
resources 目录包含了视图文件及原生资源文件(LESS、SASS、CoffeeScript),以及本地化语言文件;
Routes目录
routes 目录包含了应用的所有路由定义。Laravel默认提供了三个路由文件:web.php、api.php和console.php。
web.php 文件包含的路由都会应用web中间件组,具备Session、CSRF防护以及Cookie加密功能,如果应用无需提供无状态的、RESTful风格的API,所有路由都会定义在web.php文件。
api.php 文件包含的路由应用了api中间件组,具备频率限制功能,这些路由是无状态的,所以请求通过这些路由进入应用需要通过token进行认证并且不能访问Session状态。
console.php 文件用于定义所有基于闭包的控制台命令,每个闭包都被绑定到一个控制台命令并且允许与命令行IO方法进行交互,尽管这个文件并不定义HTTP路由,但是它定义了基于控制台的应用入口(路由)。
Storage目录
storage 目录包含了编译过的Blade模板、基于文件的session、文件缓存,以及其它由框架生成的文件,该目录被细分为成app、framework和logs子目录,app目录用于存放应用要使用的文件,framework目录用于存放框架生成的文件和缓存,最后,logs目录包含应用的日志文件;
storage/app/public 目录用于存储用户生成的文件,比如可以被公开访问的用户头像,要达到被访问的目的,你还需要在public目录下生成一个软连接 storage 指向这个目录。你可以通过 php artisan storage:link 命令生成这个软链接。
Tests目录
tests 目录包含自动化测试,其中已经提供了一个开箱即用的PHPUnit示例;每一个测试类都要以 Test 开头,你可以通过 phpunit 或 php vendor/bin/phpunit 命令来运行测试。
Vendor目录
vendor目录包含所有Composer依赖。
3、App目录
应用的核心代码位于 app 目录下,默认情况下,该目录位于命名空间 App 下, 并且被 Composer 通过 PSR-4自动载入标准 自动加载。
app 目录下包含多个子目录,如Console、Http、Providers等。Console和Http目录提供了进入应用核心的API,HTTP协议和CLI是和应用进行交互的两种机制,但实际上并不包含应用逻辑。换句话说,它们只是两个向应用发布命令的方式。Console目录包含了所有的Artisan命令,Http目录包含了控制器、中间件和请求等。
其他目录会在你通过 Artisan 命令 make 生成相应类的时候生成到 app 目录下。例如,app/Jobs 目录直到你执行 make:job 命令生成任务类时才会出现在 app 目录下。
注意:app 目录中的很多类都可以通过 Artisan 命令生成,要查看所有有效的命令,可以在终端中运行php artisan list make命令。
Console目录
Console 目录包含应用所有自定义的 Artisan 命令,这些命令类可以使用 make:command 命令生成。该目录下还有 Console Kernel 类,在这里可以注册自定义的 Artisan 命令以及定义调度任务。
Events目录
这个目录默认不存在,但是可以通过 event:generate 和 make:event 命令创建。该目录用于存放事件类。事件类用于告知应用其他部分某个事件发生并提供灵活的、解耦的处理机制。
Exceptions目录
Exceptions 目录包含应用的异常处理器,同时还是处理应用抛出的任何异常的好地方。如果你想要自定义异常如何记录异常或渲染,需要修改 Handler 类。
Http目录
Http 目录包含了控制器、中间件以及表单请求等,几乎所有进入应用的请求处理都在这里进行。
Jobs目录
该目录默认不存在,可以通过执行 make:job 命令生成,Jobs目录用于存放队列任务,应用中的任务可以被推送到队列,也可以在当前请求生命周期内同步执行。同步执行的任务有时也被看作命令,因为它们实现了命令模式。
Listeners目录
这个目录默认不存在,可以通过执行 event:generate 和 make:listener 命令创建。Listeners 目录包含处理事件的类(事件监听器),事件监听器接收一个事件并提供对该事件发生后的响应逻辑,例如,UserRegistered 事件可以被 SendWelcomeEmail 监听器处理。
Mail目录
这个目录默认不存在,但是可以通过执行 make:mail 命令生成,Mail 目录包含邮件发送类,邮件对象允许你在一个地方封装构建邮件所需的所有业务逻辑,然后使用 Mail::send 方法发送邮件。
Notifications目录
这个目录默认不存在,你可以通过执行 make:notification 命令创建, Notifications 目录包含应用发送的所有通知,比如事件发生通知。Laravel 的通知功能将通知发送和通知驱动解耦,你可以通过邮件,也可以通过Slack、短信或者数据库发送通知。
Policies目录
这个目录默认不存在,你可以通过执行 make:policy 命令来创建, Policies 目录包含了所有的授权策略类,策略用于判断某个用户是否有权限去访问指定资源。更多详情,请查看授权文档。
Providers目录
Providers 目录包含应用的所有服务提供者。服务提供者在启动应用过程中绑定服务到容器、注册事件以及执行其他任务以为即将到来的请求处理做准备。
在新安装的 Laravel 应用中,该目录已经包含了一些服务提供者,你可以按需添加自己的服务提供者到该目录。
一次请求的生命周期
生命周期概览
第一件事
Laravel 应用的所有请求入口都是 public/index.php 文件,所有请求都会被 web 服务器(Apache/Nginx)导向这个文件。 index.php 文件包含的代码并不多,但是,这里是加载框架其它部分的起点。
index.php 文件载入 Composer 生成的自动加载设置,然后从 bootstrap/app.php 脚本获取 Laravel 应用实例,Laravel 的第一个动作就是创建服务容器实例。
HTTP/Console 内核
接下来,请求被发送到 HTTP 内核或 Console 内核,这取决于进入应用的请求类型。这两个内核是所有请求都要经过的中央处理器,现在,就让我们聚焦在位于 app/Http/Kernel.php 的 HTTP 内核。
HTTP 内核继承自 Illuminate\Foundation\Http\Kernel 类,该类定义了一个 bootstrappers 数组,这个数组中的类在请求被执行前运行,这些 bootstrappers 配置了错误处理、日志、检测应用环境以及其它在请求被处理前需要执行的任务。
HTTP 内核还定义了一系列所有请求在处理前需要经过的 HTTP 中间件,这些中间件处理 HTTP 会话的读写、判断应用是否处于维护模式、验证 CSRF 令牌等等。
HTTP 内核的标志性方法 handle 处理的逻辑相当简单:获取一个 Request,返回一个 Response,把该内核想象作一个代表整个应用的大黑盒子,输入 HTTP 请求,返回 HTTP 响应。
服务提供者
内核启动过程中最重要的动作之一就是为应用载入服务提供者,应用的所有服务提供者都被配置在 config/app.php 配置文件的 providers 数组中。首先,所有提供者的 register 方法被调用,然后,所有提供者被注册之后,boot 方法被调用。
服务提供者负责启动框架的所有各种各样的组件,比如数据库、队列、验证器,以及路由组件等,正是因为他们启动并配置了框架提供的所有特性,服务提供者是整个 Laravel 启动过程中最重要的部分。
分发请求
一旦应用被启动并且所有的服务提供者被注册,Request 将会被交给路由器进行分发,路由器将会分发请求到路由或控制器,同时运行所有路由指定的中间件。
聚焦服务提供者
服务提供者是启动 Laravel 应用中最关键的部分,应用实例被创建后,服务提供者被注册,请求被交给启动后的应用进行处理,整个过程就是这么简单!
对 Laravel 应用如何通过服务提供者构建和启动有一个牢固的掌握非常有价值,当然,应用默认的服务提供者存放在 app/Providers 目录下。
默认情况下,AppServiceProvider 是空的,这里是添加自定义启动和服务容器绑定的最佳位置,当然,对大型应用,你可能希望创建多个服务提供者,每一个都有着更加细粒度的启动。