Laravel 学习交流 QQ 群:375462817
本记录文档前言
Laravel 文档写的很好,只是新手看起来会有点吃力,需要结合经验和网上的文章,多读、细读才能更好的理解。多读、细读官方文档!!!本文类似于一个大纲,欲知其中详情,且去细读官方文档:Laravel 6.0 docs。
#########################################################################################
#########################################################################################
#########################################################################################
#########################################################################################
#########################################################################################
#########################################################################################
第一章:前言(一、发布注意事项。二、升级指导。三、贡献指南。四、api 文档。)
#########################################################################################
#########################################################################################
#########################################################################################
#########################################################################################
#########################################################################################
#########################################################################################
一、发布注意事项
Laravel 6.0 是 LTS 版本,生产日期,2019 年 09 月。提供两年的 bug 修复和三年的安全修复。非 LTS 版本,只提供六个月的 bug 修复和一年的安全修复。
二、升级指导
https://laravel.com/docs/6.0/upgrade
三、贡献指南
https://laravel.com/docs/6.0/contributions
四、api 文档
官方 api 文档地址:https://laravel.com/api/6.0/
#########################################################################################
#########################################################################################
#########################################################################################
#########################################################################################
#########################################################################################
#########################################################################################
第二章:开始(一、安装。二、配置。三、目录结构。四、homestead。五、Valet。六、部署。)
#########################################################################################
#########################################################################################
#########################################################################################
#########################################################################################
#########################################################################################
#########################################################################################
一、安装
服务器需求
PHP >= 7.2.0
BCMath PHP Extension
Ctype PHP Extension
JSON PHP Extension
Mbstring PHP Extension
OpenSSL PHP Extension
PDO PHP Extension
Tokenizer PHP Extension
XML PHP Extension
两种安装方式
composer global require "laravel/installer"
laravel new blog
// 无法指定版本composer create-project --prefer-dist laravel/laravel blog "6.0.*"
安装须知
- 根目录是
public
- 必须设置 web 服务器可读写
storage
和bootstrap/cache
目录及其子目录 - 在 web 服务器配置中设置优雅链接 (即去除
index.php
) php artisan key:generate
mv .env.example .env
web 服务器上的配置
# apache
# 打开 mod_rewrite 模块
# public/.htaccess
Options +FollowSymLinks -Indexes
RewriteEngine On
RewriteCond %{
HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{
HTTP:Authorization}]
RewriteCond %{
REQUEST_FILENAME} !-d
RewriteCond %{
REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
# nginx
location / {
try_files $uri $uri/ /index.php?$query_string;
}
二、配置
配置目录 config
环境配置
.env
文件内的变量会被系统级别或服务器级别的变量覆盖。- 有空格的值请用双引号包含起来
APP_NAME="My Application"
.env
文件内的变量通过env()
函数获取,config
目录下的变量通过config()
函数获取。- 在运行
PHPUnit
测试时或执行以--env=testing
为选项Artisan
命令时,.env.testing
会覆盖.env
文件中的值。
$environment = App::environment();
if (App::environment('local')) {
// 环境是 local
}
if (App::environment(['local', 'staging'])) {
// 环境是 local 或 staging...
}
隐藏 debug 页面中的环境变量
# config/app.php
return [
// ...
'debug_blacklist' => [
'_ENV' => [
'APP_KEY',
'DB_PASSWORD',
],
'_SERVER' => [
'APP_KEY',
'DB_PASSWORD',
],
'_POST' => [
'password',
],
],
];
操作配置、缓存配置
$value = config('app.timezone'); // 获取
config(['app.timezone' => 'America/Chicago']); // 设置
php artisan config:cache // 缓存(执行该命令后 env 函数将会失效)
php artisan config:clear // 清除
维护模式
维护模式 === 503 === Service Unavailable
php artisan down
php artisan down --message="Upgrading Database" --retry=60
// 优先加载:resources/views/errors/503.blade.php
# 5.5 版本的时候,尝试第二条命令的时候,你会发现并不能生效,一开始我也以为是个 bug,不知道更改没有
# 为此我还在 github 上 pull request
# 官方解释说你要自建模板 resources/views/errors/503.blade.php 去实现任何你想实现的功能。
# 我觉得这边做的不是很好,既然有这个命令选项,就应该实现对应的功能,
# 否则新手根据文档学习到的时候,会困惑为什么该指令的参数不能生效。
php artisan down --allow=127.0.0.1 --allow=192.168.0.0/16
php artisan up
当应用程序处于维护模式时,不会处理队列任务。退出维护模式后会继续处理。
三、目录结构
根目录下的各个目录
app
:应用程序核心目录,几乎项目所有的类都在这里。bootstrap
:包含框架启动文件app.php
,和启动时为了优化性能而生成的文件。config
:包含所有配置文件。最好是读一遍这些文件,了解你可以轻松配置哪些内容。database
:包含数据库填充、迁移、模型工厂文件。可以用作SQLite
数据库存放目录。public
:静态资源目录,并包含了首页文件index.php
。resource
:包含了未编译的源文件(模板、语言、资源)。routes
:包含了所有的路由定义。storage
:包含了编译好的模板文件,session 文件,缓存文件,日志等文件。tests
:包含了自动测试文件。运行测试命令php vendor/bin/phpunit
。vendor
:composer
依赖目录。
app
目录下的各个目录
app 目录下的很多目录是命令生成的。由 Composer 使用 PSR-4 自动加载标准自动加载。
查看生成命令:php artisan make:list
。
Broadcasting
:包含所有 broadcast channel 类。Console
:包含自定义的命令和用来注册命令、定义计划任务的内核文件。Events
:事件目录。Exceptions
:异常和异常处理目录。Http
:包含了控制器、中间件和表单请求。几乎所有请求的处理逻辑都被放在这里。Jobs
:储存队列任务。Listeners
:存储事件的监听。Mail
:存储邮件类目录。Notifications
:存放通知类。laravel 内置了很多驱动: email, Slack, SMS, database。Policies
:授权策略类目录。Providers
:包含了所有服务提供者。服务提供者通过在服务容器上绑定服务、注册事件或者执行其他任务来启动你的应用。Rules
:储存自定义验证规则对象。
routes
目录下的各个目录
web.php
内的路由将应用web
中间件组(功能:session 状态,CSRF 保护,cookie 加密等)。api.php
内的路由将应用api
中间件组(功能:访问速率控制等)。所有的请求将通过 token 认证,无 session 状态。consoles.php
定义了所有基于控制台命令的闭包。channels.php
注册了所有的事件广播频道。
四、Homestead(TODO)
本节介绍了 homestead
是什么,怎么用。
介绍
Homestead 是 Laravel 官方提供的 vagrant box。
vagrant 一个用来给虚拟机提供物品(box)的容器,放在容器(vagrant)里的东西被称作 box 。box 一般就是一个操作系统的镜像。
Homestead 提供了 ubantu、git、php、nginx、apache、mysql、mariadb、sqlite3、postgreSQL、composer、node(With Yarn, Bower, Grunt, and Gulp)、redis、memcached、beanstalkd、mailhog、elasticsearch、ngrok。
windows 需要在 BIOS 中开启硬件虚拟功能 (VT-x)。如果在 UEFI 上使用 Hyper-V,为了使用 VT-x 需要禁用 Hyper-V。
安装
- 安装虚拟机和 vagrant。
(建议使用 virtualbox,vmware 收费并需要购买插件,parallels 也需要插件,Hyper-V 有局限性)
vagrant 下载页
virtualbox 下载页 - 往 vagrant 里面放
laravel/homestead
box。
vagrant box add laravel/homestead
国内墙的厉害,需要下载下来再进行本地安装:
https://vagrantcloud.com/laravel/boxes/homestead/versions/x.x.x/providers/virtualbox.box
在上面链接中找到想要下载的版本,然后替换掉 x.x.x ,复制到迅雷中进行下载。
重命名为 larabox
vagrant box add laravel/homestead ./larabox
- 克隆仓库 laravel/homestead。(用来初始化 vagrant,配置 homestead box 的程序。)
a.git clone https://github.com/laravel/homestead.git ~/Homestead
b.cd ~/Homestead
c.git checkout v7.1.2
(切换到稳定版本)
d.bash init.sh
或者init.bat
(生成Homestead.yaml
文件)
配置(配置文件 Homestead.yaml)
指定虚拟机
可以是 virtualbox, vmware_fusion, vmware_workstation, parallels 或者 hyperv
provider: virtualbox
共享文件夹
folders
属性用于配置本地和homestead
环境的同步文件夹。
由于多站点或项目有太多文件而导致性能变差时候,可以设置不同的文件夹来同步不同的项目。
NFS
也可以用来优化性能,windows 不支持。使用NFS
时,安装vagrant-bindfs
插件可维护正确的文件和文件夹权限。
利用 options
键可以设置其他选项。
nginx 站点
homestead
使用sites
属性让你轻松配置nginx
域名。使用vagrant reload --provision
更新虚拟机中的nginx
配置。
配置好域名,记得在本地 hosts 文件添加解析记录。例如:192.168.10.10 homestead.test
。
启动和删除 box
# 修改 homestead.rb
# settings[“version”] ||= “>= 0”
# 找到 composer self-update 删除它
vagrant up
vagrant destroy --force
为每个项目安装 homestead
这样你就可以在其他项目目录内,通过 vagrant up 来进行该项目的工作。
composer require laravel/homestead --dev
// make 命令自动生成 Vagrantfile 和 Homestead.yaml
php vendor/bin/homestead make // linux & mac
vendor\\bin\\homestead make // windows
安装 mariadb
box: laravel/homestead
ip: "192.168.10.10"
memory: 2048
cpus: 4
provider: virtualbox
mariadb: true
安装 elasticsearch
需要指定版本,默认安装将创建一个名为 ‘homestead’ 的集群,确保你的虚拟机内存是elasticsearch
的两倍。
box: laravel/homestead
ip: "192.168.10.10"
memory: 4096
cpus: 4
provider: virtualbox
elasticsearch: 6
bash
命令别名
alias ..='cd ..' // 随后记得 vagrant reload --provision
日常用法
全局访问 homestead
mac 或 linux
function homestead() {
( cd ~/Homestead && vagrant $* )
}
windows
@echo off
set cwd=%cd%
set homesteadVagrant=C:\Homestead
cd /d %homesteadVagrant% && vagrant %*
cd /d %cwd%
set cwd=
set homesteadVagrant=
替换C:\Homestead
,再将脚本加入环境变量即可。
设置完成后可以在任何地方使用 homestead up
,homestead ssh
连接数据库
mysql 127.0.0.1 33060
postgreSQL 127.0.0.1 54320
在虚拟机里面连接数据库的端口还是默认值 3306
和 5432
。
账号密码:homestead / secret
添加多个网站
sites:
- map: homestead.test
to: /home/vagrant/code/Laravel/public
- map: another.test
to: /home/vagrant/code/another/public
192.168.10.10 homestead.test
192.168.10.10 another.test
添加 nginx 其他配置
sites:
- map: homestead.test
to: /home/vagrant/code/Laravel/public
params:
- key: FOO
value: BAR
配置时间任务
如果需要开启 artisan
命令schedule:run
一样的效果,配置如下
(schedule:run
命令的原理是每分钟都会去检查 App\Console\Kernel 类中是否有任务需要执行,有则执行。)
sites:
- map: homestead.test
to: /home/vagrant/code/Laravel/public
schedule: true
配置 Mailhog(.env)
Mailhog 用来捕获你的邮件,并检查它。你的邮件并不会真的发出去。
MAIL_DRIVER=smtp
MAIL_HOST=localhost
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
端口配置
默认:
SSH: 2222 → Forwards To 22
ngrok UI: 4040 → Forwards To 4040
HTTP: 8000 → Forwards To 80
HTTPS: 44300 → Forwards To 443
MySQL: 33060 → Forwards To 3306
PostgreSQL: 54320 → Forwards To 5432
Mailhog: 8025 → Forwards To 8025
自定义:
ports:
- send: 50000
to: 5000
- send: 7777
to: 777
protocol: udp
分享你的环境
vagrant share
但是如果Homestead.yaml
配置了多个站点,此命令不再支持。
解决方案,使用 homestead 内置命令:
vagrant ssh
share homestead.test
vagrant 天生就不安全,当你使用 share 命令,就会在互联网中暴露的你虚拟机。
切换 php 版本
只兼容 nginx
切换 web 服务器
apache 和 nginx 可以同时安装,但不可同时运行,原理应该是抢占 80 端口。
运行命令 flip
可以关闭其中一个,开启另一个。
配置网络接口
可以配置任意数量的接口:
networks:
- type: "private_network"
ip: "192.168.10.20"
想启用 桥接 接口,请配置 bridge
设置,并将网络类型更改为 public_network
:
networks:
- type: "public_network"
ip: "192.168.10.20"
bridge: "en1: Wi-Fi (AirPort)"
要启用 DHCP,只需从配置中删除 ip
选项:
networks:
- type: "public_network"
bridge: "en1: Wi-Fi (AirPort)"
更新 homestead
vagrant box update
git pull origin master
或者
vagrant box update
composer update # 确保 composer.json 包含 "laravel/homestead": "^7"
如果 windows 下符号链接不生效,添加以下代码块到
Vagrantfile
config.vm.provider "virtualbox" do |v|
v.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/v-root", "1"]
end
五、Valet
https://laravel.com/docs/6.0/valet
六、部署
本节介绍了几个部署要点。
nginx 部署
server {
listen 80;
server_name example.com;
root /example.com/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
index index.html index.htm index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico {
access_log off; log_not_found off; }
location = /robots.txt {
access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
部署优化
composer install --optimize-autoloader --no-dev
php artisan config:cache
php artisan route:cache
# 开启 OpCache
#########################################################################################
#########################################################################################
#########################################################################################
#########################################################################################
#########################################################################################
#########################################################################################
第三章:架构(一、生命周期。二、服务容器。三、服务提供者。四、facades。五、contracts。)
#########################################################################################
#########################################################################################
#########################################################################################
#########################################################################################
#########################################################################################
#########################################################################################
一、请求生命周期
本节主要概括了框架运行的生命周期。
- 所有请求必定首先通过
public/index.php
。 - 在上述这个文件中首先加载
composer
自动加载文件,然后从bootstrap/app.php
实例化一个服务容器(服务容器,顾名思义是一个容器,可以比作是一个药箱,药箱当然要放药了,药就是所谓的服务提供者。在启动时候当然不能把框架里的所有的药都加载进来,只能加载基础的药。所以这一步还加载了一些基础的服务提供者。)。 - 接下来,框架会根据请求类型传送请求至
app/Http/Kernel.php
或者app/Console/Kernel.php
。 app/Http/Kernel.php
扩展了Illuminate\Foundation\Http\Kernel
类,父类强制在处理请求前应该做哪些操作,操作内容都放到了bootstrappers
数组里面(配置错误处理、配置记录日志、检测应用环境、注册和启动服务提供者等)。子类在数组middleware
中规定了请求在被处理前必须经过的一些处理(读写session
、判断是否处于维护模式、验证 csrf 令牌等)。- 实例化
Http Kernel
,处理请求,返回响应内容。请求将作为参数传入handle
方法,返回值就是响应内容。
应用程序的所有服务提供程序都在 config/app.php
配置文件的 providers
数组中配置。首先,将在所有提供程序上调用register方法,然后,一旦所有提供程序都已注册,将调用 boot
方法。一旦应用程序被引导,Request
将被传递给 router
以进行分派。 router
会将请求分派给路由或控制器,以及运行任何路由特定的中间件。
二、服务容器
本节主要讲了服务容器中的绑定,解析,解析事件(类似于在药瓶中放药,拿药,拿药时会发生什么)。
如果不依赖任何接口,不需要指示容器如何构建这些对象,因为它可以使用反射自动解析这些对象。
绑定
基础绑定
$this->app->bind('HelpSpot\API', function ($app) {
return new HelpSpot\API($app->make('HttpClient'));
});
绑定单例
$this->app->singleton('HelpSpot\API', function ($app) {
return new HelpSpot\API($app->make('HttpClient'));
});
绑定实例
$api = new HelpSpot\API(new HttpClient);
$this->app->instance('HelpSpot\API', $api);
绑定实例时给定初始化数据
$this->app->when('App\Http\Controllers\UserController')
->needs('$variableName')
->give($value); // 利用上下文给绑定设置初始数据
绑定接口到实例
$this->app->bind(
'App\Contracts\EventPusher',
'App\Services\RedisEventPusher'
);
根据上下文提供不同的绑定
$this->app->when(PhotoController::class)
->needs(Filesystem::class)
->give(function () {
return Storage::disk('local');
});
$this->app->when(VideoController::class)
->needs(Filesys