Laravel
目录
目录
起步
安装
- 下载Laravel一键安装包。
- 配置Web服务器虚拟主机。
- 将网站根目录配置为laravel5/public。
- 能显示Laravel文字,说明安装成功。
Laravel利用Composer来管理依赖。所以,在使用Laravel之前,请确保你的机器上安装了Composer。
通过Laravel 安装器
首先,使用 Composer 下载 Laravel 安装程序:
composer global require "laravel/installer"
确保 $HOME/.composer/vendor/bin 目录(或你的操作系统的等效目录)已经放在你的环境变量 $PATH 中,以便系统可以找到 laravel 的可执行文件。
安装之后, laravel new 命令会在你指定的目录中创建一个新的 Laravel 项目。例如,laravel new blog 命令会创建一个名为 blog 的目录,其中包含所有已经安装好的 Laravel 的依赖项:
laravel new blog
通过Composer创建项目
或者,你还可以通过在终端中运行 create-project 命令来安装 Laravel:
composer create-project --prefer-dist laravel/laravel blog
本地开发服务器
如果你在本地安装了 PHP,并且想使用 PHP 内置的开发服务器来为你的应用程序提供服务,那就使用 Artisan 命令 serve。这个命令会在 http://localhost:8000 上启动开发服务器:
php artisan serve
当然,对于本地开发来说,最好的选择还是 Homestead和Valet。
Valet还是Homestead?
Laravel还提供了另一种本地开发环境Homestead。Homestead 和 Valet 的不同之处在于目标受众和对本地开发的方式。Homestead 提供了一个完整的、具有自动化的 Nginx 配置的 Ubuntu 虚拟机。如果你想要完全虚拟化的 Linux 开发环境或 Windows/Linux,Homestead 是一个不错的选择。
Valet 仅支持 Mac,并要求你将 PHP 和数据库服务器直接安装到本地机器上。这可以很容易地通过使用 Homebrew 命令来实现,像 brew install php71 和 brew install mysql。Valet 提供了一个极快的、资源消耗最少本地开发环境,非常适合只需要 PHP/MySQL 并且不需要虚拟开发环境的开发人员。
配置
.env 配置文件适用范围
.env 文件主要的作用是存储环境变量,也就是会随着环境变化的东西,比如数据库的用户名、密码、缓存驱动、时区,还有静态文件的存储路径之类的;
因为这些信息应该是和环境绑定的,不应该随代码的更新而变化,所以一般不会把 .env 文件放到版本控制中;
除了和环境绑定的环境变量,有时候一些安全系数比较高,不希望纳入版本控制的信息也会放进 .env 文件,比如第三方API的secret之类的;
不太适用的内容
严格来说,传统的配置信息,比如上传文件的尺寸限制,或者一些算法的阈值之类的,其实不适合放到 .env 文件中,因为这些配置项是要和代码一同更新,且所有环境下应该都是一致的;
但我们也经常把这些配置项放进 .env (这大概不是什么好习惯),毕竟如果这些配置项很少的话,单独建一个配置文件也有些不值的感觉……
环境配置
所有 Laravel 框架的配置文件都放置在 config 目录下。
Laravel 使用 Vance Lucas 的 DotEnv PHP 函数库来实现项目内环境变量的控制,在安装好的全新 Laravel 应用程序里,在根目录下会包含一个 .env.example 文件。
如果你通过 Composer 安装 Laravel,这个文件将自动被更名为 .env,否则你只能手动更改文件名。
当你的应用程序收到请求时,这个文件所有的变量都会被加载到 PHP 超级全局变量 $_ENV 里。你可以使用辅助函数 env 来获取这些变量的值。
.env 文件不应该被提交到版本控制系统,因为每个开发人员或服务器在使用应用程序时,可能需要不同的环境配置。此外,在入侵者获得你的源代码控制仓库的访问权的情况下,这会成为一个安全隐患,因为任何敏感的凭据都被暴露了。
不妨将 .env.example 文件放进你的应用程序,通过样本配置文件里的预设值,团队中的其他开发人员就可以清楚地知道,在运行你的应用程序时有哪些环境变量是必须有的。
.env 中的基本语法
.env 中的数据按行划分, 每条数据占一行,数据之间可以有任意多的空行,读取时会自动去除前后空格。
KEY1=value1 KEY2=value2 KEY3=value3 KEY4=value4
如果 key 或者 value 中包含空格,就需要在两端加上双引号,比如这样:
"TEST KEY" = "test value"
如果需要添加注释,可以使用#,比如这样:
#测试单行注释 KEY=value #测试行末注释
如果需要嵌套变量的话,也可以直接在 .env 中写, 借用官方的例子:
BASE_DIR="/var/webroot/project-root" CACHE_DIR="${BASE_DIR}/cache" TMP_DIR="${BASE_DIR}/tmp"
.env 可以存储的内容
前文说了,.env 是非常简单的配置文件,简单到什么程度呢?
它只支持一维K/V格式的配置项,而且 key 和 value 都只能是字符串。
那如果想存一个列表怎么办?
有的时候我们需要在配置文件里存一个列表,比如支付平台调用 webhook 的时候只会从固定的IP地址发起,那我们可能就会为了安全性,把这些IP地址放到一个白名单中,每次验证一下来源IP是否在名单列表之内;
像这种白名单列表有办法存到 .env 中么?
只能说……不能直接存进去,因为 .env 很简单,它的 value 只能是字符串,不过我们可以尝试变通一下,使用一个连接符(比如半角逗号,)把白名单地址拼成一个字符串,使用时再分割开:
WHITE_LIST=192.168.0.1,192.168.0.2,192.168.0.3
获取目前应用程序的环境
应用程序的当前环境是由 .env 文件中的 APP_ENV 变量所决定的。你可以通过 App facade 的 environment 方法来获取该值:
$environment = App::environment();
你也可以传递参数至 environment 方法来确认当前环境是否与参数相符合:
if (App::environment('local')) { // 环境是 local } if (App::environment('local', 'staging')) { // 环境是 local 或 staging... }
也可通过 app 辅助函数获取应用程序实例:
$environment = app()->environment();
获取设置值
可以使用 config 辅助函数获取你的设置值,设置值可以通过「点」语法来获取,其中包含了文件与选项的名称。你也可以指定一个默认值,当该设置选项不存在时就会返回默认值:
$value = config('app.timezone'); config(['app.timezone' => 'America/Chicago']);
APP_ENV可以设置成哪些值?
- 开发: local
- 测试: testing
- 预上线: staging
- 正式环境: production
Homestead
https://phphub.org/topics/2 Laravel 的 Homestead 开发环境部署
这是两年前的旧文了,不知现在是否还有效。
设置数据库连接
本机连接 vm 里 mysql 方法是:
host: 127.0.0.1
port: 33060
user: homestead
pass: secret
Is Laravel really this slow?
http://stackoverflow.com/questions/23283574/is-laravel-really-this-slow
I just started using Laravel. I've barely written any code yet, but my pages are taking nearly a second to load!
- Reply 1
Laravel is not actually that slow. 500-1000ms is absurd; I got it down to 20ms in debug mode.
The problem was Vagrant/VirtualBox + shared folders. I didn't realize they incurred such a performance hit. I guess because Laravel has so many dependencies (loads ~280 files) and each of those file reads is slow, it adds up really quick.
kreeves pointed me in the right direction, this blog post describes a new feature in Vagrant 1.5 that lets you rsync your files into the VM rather than using a shared folder.
There's no native rsync client on Windows, so you'll have to use cygwin. Install it, and make sure to check off Net/rsync. Add C:\cygwin64\bin to your paths.
- Reply 2
From my Hello World contest, Which one is Laravel? I think you can guess. I used docker container for the test and here is the results
To make http-response "Hello World":
Golang with log handler stdout : 6000 rps
SpringBoot with Log Handler stdout: 3600 rps
Laravel 5 with off log :230 rps
Mac安装
http://laravel-china.org/docs/5.1/homestead 按开发文档步骤安装,比较顺利。
- 安装Virtual Box
- 安装Vagrant
- 下载本地Lavravl项目代码
- 配置Homestead.yaml
- vagrant up
- vagrant reload --provision
- vagrant destroy --force
Windows安装
windows的安装步骤与Mac一样,只是电脑配置差异,有些问题要特别处理。
- 在BIOS中,开启虚拟化。
安装好Virtual Box、Vagrant,配置好Homestead.yaml后,vagrant up启动到一半不动了,直到超时退出。
- 在配置文件夹和站点目录
folders的map和to,配置反了,启动时vagrant找不到github_projets目录。
folders: - map: d:/github_projects to: /home/github_projects sites: - map: laravel.example.com to: /home/github_projects/LaravelExample/public
- 运行composer install
正常启动Vagrant后,打开站点首页,报错,指示vendor目录下的文件找不到。
- .ssh帐户可以注释掉
authorize: ~/.ssh/id_rsa.pub keys: - ~/.ssh/id_rsa
- cpus设置
i5CPU,双核四线程,跑了个负载。
ab -c 50 -n 2000 http://laravel.example.com/ cpus: 1 75.99 72.95 cpus: 2 111.95 114.54 cpus: 3 111.27 115.85 cpus: 4 92.57 95.45
从测试结果上看,cpus设为2运行效率最高。
ngnix配置文件路径
/etc/nginx
Swagger-php
SwaggerLume
https://github.com/DarkaOnLine/SwaggerLume
一、安装swagger包
composer require "darkaonline/swagger-lume 1.*"
二、为swagger配置lumen
// bootstrap/app.php $app->withFacades(); // add this line before Register Container Bindings section: $app->configure('swagger-lume'); // add this line in Register Service Providers section: $app->register(\SwaggerLume\ServiceProvider::class);
三、配置及生成swagger
php artisan swagger-lume:publish-config (config/swagger-lume.php) php artisan swagger-lume:publish php artisan swagger-lume:generate
四、指定swagger路由
//config/swagger-lume.php 'routes' => [ 'api' => 'api-docs', // from 'api/documentation' 'docs' => 'docs', ],
五、设置自动更新文档
//config/swagger-lume.php 'generate_always' => env('SWAGGER_GENERATE_ALWAYS', true),
如果不设置,要手动执行swagger-lume:generate命令,文档才能看到最新变化。
Lumen
安装
安装composer
从 https://getcomposer.org/download/ 上下载安装文件。
利用Composer下载Lumen安装器
composer global require "laravel/lumen-installer=~1.0" # or composer global require "laravel/lumen-installer"
安装时包名写错了,留下包痕迹清除不了,把composer卸载,重新安装后,才能用正确的包名安装lumen。
创建Lumen运用程序
通过lumen new命令就能在你指定的目录中创建一个干净的Lumen应用程序骨架了。
lumen new app_name
部署到Web服务器
Lumen 几乎不需要任何配置就能开箱即用。你能立即开始你的编码工作了!
Lumen (5.2.8) (Laravel Components 5.2.*)
Creating custom helpers
Add the helpers.php file to your composer.json autoload files.
"autoload": { "classmap": [ "database" ], "psr-4": { "Tasky\\": "app/" }, "files": [ "app/Support/helpers.php" ] },
$ composer dumpautoload
base64
Repository模式
为了保持代码的整洁性和可读性,使用Repository Pattern 是非常有用的。使用repositories使我们的Controller层不再那么啰嗦、更加解耦和易读。
杂项
Laravel的历史版本
- Laravel 1 2011年6月9日
- Laravel 2 2011年11月24日
- Laravel 3 2012年2月22日
- Laravel 4 2013年5月28日
- Laravel 5.1 LTS 2015年6月9日
- Laravel 5.2 2015年12月21日
- Laravel 5.5 LTS 2017年8月30日
获取版本号
$app->get('/', function () use ($app) { return $app->version(); });
指定302跳转
use Illuminate\Http\RedirectResponse; return redirect('/userInfo', 302); //默认为301
laravel 怎么截取字符串多余的用省略号表示?
str_limit($value, $limit = 100, $end = '...');
查找关联是否存在
$orders = Product_order::whereHas('user', function ($query) use ($name) { if ($name !== '') { $query->where('username', 'like', "%{$name}%"); } })->with('product')->where(function ($query) use ($order_number) { if ($order_number !== '') { $query->where('order_number', 'like', "%{$order_number}%"); } })->orderBy('id', 'desc')->paginate(10);
查看Laravel版本号的三种方法
1. PHP artisan --version
2. vim vendor/laravel/framework/src/Illuminate/Foundation/Application.php
3. 可以写在路由里。5.4版本的路由文件夹是routes。我们可以写在routes\web.php里。
Route::get('laravel-version', function(){ $laravel = app(); return "Your Laravel version is ".$laravel::VERSION; });
Laravel Debugbar调试器
Debugbar package是Barry vd. Heuvel写的一个包,实现在开发过程中快速轻松地查看应用程序信息的功能。安装简单和功能强大,已经成为Laravel开发过程中的不可或缺的包之一。
安装极为简单。
composer require barryvdh/laravel-debugbar
Laravel 5.4新兵Dusk
Laravel 应用测试的背景
首先,简单回顾一下:虽然每个人在讨论测试时使用的语言有点不同,但都一致认为单元测试是负责测试隔离开来的小块的代码 ,例如在一个类中的一个方法。而应用测试,与集成测试类似,用来测试整个应用程序作为一个整体。
自从 Jeffrey Way 的 Integrated 成为 Laravel 5.1 核心,我们便获得了 ->visit() 、->get() 、->see() 等方法去描述一个浏览器访问网站的行动。而这确实改变了我们编写的应用程序测试的能力,简单地写个例子:
/** @test */ public function cta_link_functions() { $this->visit('/sales-page') ->click('Try it now!') ->see('Sign up for trial') ->onPage('trial-signup'); }
对后台而言,它就等于一个 PHP 的启动请求,通过我们的应用程序传递这个请求,去抓取 DOM,然后提出更多的请求,直到整条代码链完成。 从而做到在不需要浏览器的情况下去模拟浏览器的行为。
传统测试方式带来的问题
但如果应用程序的功能依赖了 JavaScript,那该怎么办?毕竟这不是一个真正的浏览器,难以要求它去注意到你的 JavaScript。
随着时间的推移,在 Laravel 应用程序中使用和测试 JavaScript 组件的愿望不断增多,对于 Laravel 提供的工具无法测试大部分应用程序的不满也越来越多。
重要概念及应用
facade、helper
model、service、repositories、provider
getOriginal('gender'); //修改器取出原始值
在.env文件中使用变量
在编辑配置文件 .env 时,下面的情况:
MAIL_USERNAME=hello@laravel-news.com MAIL_FROM_ADDRESS=hello@laravel-news.com # 等同于 MAIL_USERNAME=hello@laravel-news.com MAIL_FROM_ADDRESS=${MAIL_USERNAME}
${MAIL_USERNAME}表示取得MAIL_USERNAME字段的值,也就是说MAIL_USERNAME可以作为变量那样用。这样一来,碰到配置文件中有一样内容的地方,从此以后修改一处就OK了。
Lumen 5.2 中配置邮件
https://laravel-china.org/topics/1974
Laravel 5.5 LTS
距离上一代 LTS (即 5.1)感觉已经好遥远了呢!
- Laravel Horizon ,它为Laravel Redis队列提供了一个漂亮的仪表板和代码驱动的配置系统。Horizon的仪表板是一个Vue单页应用,可以使用命令composer require laravel/horizon直接安装进已有的应用中。它提供队列工作负载、最近作业、失败作业、作业重试、吞吐量和运行时指标、进程计数的实时显示。
- 我们再熟悉不过的PHP错误处理框架,有一个漂亮拉风的错误页面。