Laravel 6.0

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
两种安装方式
  1. composer global require "laravel/installer"
    laravel new blog // 无法指定版本
  2. composer create-project --prefer-dist laravel/laravel blog "6.0.*"
安装须知
  1. 根目录是public
  2. 必须设置 web 服务器可读写storagebootstrap/cache目录及其子目录
  3. 在 web 服务器配置中设置优雅链接 (即去除index.php
  4. php artisan key:generate
  5. 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

环境配置
  1. .env 文件内的变量会被系统级别或服务器级别的变量覆盖。
  2. 有空格的值请用双引号包含起来 APP_NAME="My Application"
  3. .env 文件内的变量通过env()函数获取,config目录下的变量通过config()函数获取。
  4. 在运行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

当应用程序处于维护模式时,不会处理队列任务。退出维护模式后会继续处理。

三、目录结构

根目录下的各个目录
  1. app:应用程序核心目录,几乎项目所有的类都在这里。
  2. bootstrap:包含框架启动文件 app.php,和启动时为了优化性能而生成的文件。
  3. config:包含所有配置文件。最好是读一遍这些文件,了解你可以轻松配置哪些内容。
  4. database:包含数据库填充、迁移、模型工厂文件。可以用作 SQLite 数据库存放目录。
  5. public:静态资源目录,并包含了首页文件 index.php
  6. resource:包含了未编译的源文件(模板、语言、资源)。
  7. routes:包含了所有的路由定义。
  8. storage:包含了编译好的模板文件,session 文件,缓存文件,日志等文件。
  9. tests:包含了自动测试文件。运行测试命令 php vendor/bin/phpunit
  10. vendorcomposer 依赖目录。
app目录下的各个目录

app 目录下的很多目录是命令生成的。由 Composer 使用 PSR-4 自动加载标准自动加载。
查看生成命令:php artisan make:list

  1. Broadcasting:包含所有 broadcast channel 类。
  2. Console:包含自定义的命令和用来注册命令、定义计划任务的内核文件。
  3. Events:事件目录。
  4. Exceptions:异常和异常处理目录。
  5. Http:包含了控制器、中间件和表单请求。几乎所有请求的处理逻辑都被放在这里。
  6. Jobs:储存队列任务。
  7. Listeners:存储事件的监听。
  8. Mail:存储邮件类目录。
  9. Notifications:存放通知类。laravel 内置了很多驱动: email, Slack, SMS, database。
  10. Policies:授权策略类目录。
  11. Providers:包含了所有服务提供者。服务提供者通过在服务容器上绑定服务、注册事件或者执行其他任务来启动你的应用。
  12. Rules:储存自定义验证规则对象。
routes目录下的各个目录
  1. web.php内的路由将应用 web 中间件组(功能:session 状态,CSRF 保护,cookie 加密等)。
  2. api.php内的路由将应用 api 中间件组(功能:访问速率控制等)。所有的请求将通过 token 认证,无 session 状态。
  3. consoles.php定义了所有基于控制台命令的闭包。
  4. 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。

安装
  1. 安装虚拟机和 vagrant。
    (建议使用 virtualbox,vmware 收费并需要购买插件,parallels 也需要插件,Hyper-V 有局限性)
    vagrant 下载页
    virtualbox 下载页
  2. 往 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

  1. 克隆仓库 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 uphomestead ssh

连接数据库

mysql 127.0.0.1 33060
postgreSQL 127.0.0.1 54320
在虚拟机里面连接数据库的端口还是默认值 33065432
账号密码: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。)

#########################################################################################
#########################################################################################
#########################################################################################
#########################################################################################
#########################################################################################
#########################################################################################

一、请求生命周期

本节主要概括了框架运行的生命周期。

  1. 所有请求必定首先通过 public/index.php
  2. 在上述这个文件中首先加载 composer 自动加载文件,然后从 bootstrap/app.php 实例化一个服务容器(服务容器,顾名思义是一个容器,可以比作是一个药箱,药箱当然要放药了,药就是所谓的服务提供者。在启动时候当然不能把框架里的所有的药都加载进来,只能加载基础的药。所以这一步还加载了一些基础的服务提供者。)。
  3. 接下来,框架会根据请求类型传送请求至 app/Http/Kernel.php 或者 app/Console/Kernel.php
  4. app/Http/Kernel.php扩展了Illuminate\Foundation\Http\Kernel类,父类强制在处理请求前应该做哪些操作,操作内容都放到了 bootstrappers数组里面(配置错误处理、配置记录日志、检测应用环境、注册和启动服务提供者等)。子类在数组middleware中规定了请求在被处理前必须经过的一些处理(读写session、判断是否处于维护模式、验证 csrf 令牌等)。
  5. 实例化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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值