“Laravel”的版本间的差异

来自tomtalk
跳转至: 导航搜索
基本功能
Tom讨论 | 贡献
model、service、repositories、provider
 
(未显示同一用户的46个中间版本)
第14行: 第14行:
 
# 能显示Laravel文字,说明安装成功。
 
# 能显示Laravel文字,说明安装成功。
  
=Homestead=
+
Laravel利用Composer来管理依赖。所以,在使用Laravel之前,请确保你的机器上安装了Composer。
  
https://phphub.org/topics/2 Laravel 的 Homestead 开发环境部署
+
===通过Laravel 安装器===
  
这是两年前的旧文了,不知现在是否还有效。
+
首先,使用 Composer 下载 Laravel 安装程序:
  
==Mac安装==
+
<source lang="bash">
 +
composer global require "laravel/installer"
 +
</source>
  
http://laravel-china.org/docs/5.1/homestead 按开发文档步骤安装,比较顺利。
+
确保 $HOME/.composer/vendor/bin 目录(或你的操作系统的等效目录)已经放在你的环境变量 $PATH 中,以便系统可以找到 laravel 的可执行文件。
  
# 安装Virtual Box
+
安装之后, laravel new 命令会在你指定的目录中创建一个新的 Laravel 项目。例如,laravel new blog 命令会创建一个名为 blog 的目录,其中包含所有已经安装好的 Laravel 的依赖项:
# 安装Vagrant
+
# 下载本地Lavravl项目代码
+
# 配置Homestead.yaml
+
# vagrant up
+
# vagrant reload --provision
+
# vagrant destroy --force
+
  
==Windows安装==
+
<source lang="bash">
 +
laravel new blog
 +
</source>
  
windows的安装步骤与Mac一样,只是电脑配置差异,有些问题要特别处理。
+
===通过Composer创建项目===
  
 +
或者,你还可以通过在终端中运行 create-project 命令来安装 Laravel:
  
;在BIOS中,开启虚拟化。
+
<source lang="bash">
 +
composer create-project --prefer-dist laravel/laravel blog
 +
</source>
  
安装好Virtual Box、Vagrant,配置好Homestead.yaml后,vagrant up启动到一半不动了,直到超时退出。
+
===本地开发服务器===
  
 +
如果你在本地安装了 PHP,并且想使用 PHP 内置的开发服务器来为你的应用程序提供服务,那就使用 Artisan 命令 serve。这个命令会在 http://localhost:8000 上启动开发服务器:
  
;在配置文件夹和站点目录
+
<source lang="bash">
 +
php artisan serve
 +
</source>
  
folders的map和to,配置反了,启动时vagrant找不到github_projets目录。
+
当然,对于本地开发来说,最好的选择还是 Homestead和Valet。
  
<source lang='text'>
+
===Valet还是Homestead?===
folders:
+
    - map: d:/github_projects
+
      to: /home/github_projects
+
  
sites:
+
Laravel还提供了另一种本地开发环境Homestead。Homestead 和 Valet 的不同之处在于目标受众和对本地开发的方式。Homestead 提供了一个完整的、具有自动化的 Nginx 配置的 Ubuntu 虚拟机。如果你想要完全虚拟化的 Linux 开发环境或 Windows/Linux,Homestead 是一个不错的选择。
    - map: laravel.example.com
+
      to: /home/github_projects/LaravelExample/public
+
</source>
+
  
 +
Valet 仅支持 Mac,并要求你将 PHP 和数据库服务器直接安装到本地机器上。这可以很容易地通过使用 Homebrew 命令来实现,像 brew install php71 和 brew install mysql。Valet 提供了一个极快的、资源消耗最少本地开发环境,非常适合只需要 PHP/MySQL 并且不需要虚拟开发环境的开发人员。
  
;运行composer install
+
=配置=
  
正常启动Vagrant后,打开站点首页,报错,指示vendor目录下的文件找不到。
+
==.env 配置文件适用范围==
  
 +
.env 文件主要的作用是存储环境变量,也就是会随着环境变化的东西,比如数据库的用户名、密码、缓存驱动、时区,还有静态文件的存储路径之类的;
  
;.ssh帐户可以注释掉
+
因为这些信息应该是和环境绑定的,不应该随代码的更新而变化,所以一般不会把 .env 文件放到版本控制中;
  
<source lang='text'>
+
除了和环境绑定的环境变量,有时候一些安全系数比较高,不希望纳入版本控制的信息也会放进 .env 文件,比如第三方API的secret之类的;
authorize: ~/.ssh/id_rsa.pub
+
  
keys:
+
==不太适用的内容==
    - ~/.ssh/id_rsa
+
</source>
+
  
 +
严格来说,传统的配置信息,比如上传文件的尺寸限制,或者一些算法的阈值之类的,其实不适合放到 .env 文件中,因为这些配置项是要和代码一同更新,且所有环境下应该都是一致的;
  
;cpus设置
+
但我们也经常把这些配置项放进 .env (这大概不是什么好习惯),毕竟如果这些配置项很少的话,单独建一个配置文件也有些不值的感觉……
  
i5CPU,双核四线程,跑了个负载。
+
==环境配置==
  
<source lang='bash'>
+
所有 Laravel 框架的配置文件都放置在 config 目录下。
ab -c 50 -n 2000 http://laravel.example.com/
+
  
cpus: 1    75.99    72.95
+
Laravel 使用 Vance Lucas 的 DotEnv PHP 函数库来实现项目内环境变量的控制,在安装好的全新 Laravel 应用程序里,在根目录下会包含一个 .env.example 文件。
cpus: 2  111.95    114.54
+
cpus: 3  111.27    115.85
+
cpus: 4    92.57    95.45
+
</source>
+
  
从测试结果上看,cpus设为2运行效率最高。
+
如果你通过 Composer 安装 Laravel,这个文件将自动被更名为 .env,否则你只能手动更改文件名。
  
=系统架构=
+
当你的应用程序收到请求时,这个文件所有的变量都会被加载到 PHP 超级全局变量 $_ENV 里。你可以使用辅助函数 env 来获取这些变量的值。
  
==请求生命周期==
+
.env 文件不应该被提交到版本控制系统,因为每个开发人员或服务器在使用应用程序时,可能需要不同的环境配置。此外,在入侵者获得你的源代码控制仓库的访问权的情况下,这会成为一个安全隐患,因为任何敏感的凭据都被暴露了。
  
<source lang='php'>
+
不妨将 .env.example 文件放进你的应用程序,通过样本配置文件里的预设值,团队中的其他开发人员就可以清楚地知道,在运行你的应用程序时有哪些环境变量是必须有的。
require __DIR__.'/../bootstrap/autoload.php';
+
  
$app = require_once __DIR__.'/../bootstrap/app.php';  //创建服务容器
+
=== .env 中的基本语法===
  
/**
+
.env 中的数据按行划分, 每条数据占一行,数据之间可以有任意多的空行,读取时会自动去除前后空格。
* 创建http核心(或者终端核心)。
+
* config/app.php
+
* 1、注册服务提供者
+
* 2、boot()
+
* 3、注册中间件
+
*/
+
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
+
  
/**
+
<source lang="bash">
* 1、路由分派
+
KEY1=value1
* 2、执行路由中间件
+
KEY2=value2
* 3、跳转到控制器
+
KEY3=value3
*/
+
KEY4=value4
$response = $kernel->handle(
+
</source>
    $request = Illuminate\Http\Request::capture()
+
);
+
  
$response->send();
+
如果 key 或者 value 中包含空格,就需要在两端加上双引号,比如这样:
  
$kernel->terminate($request, $response);
+
<source lang="bash">
 +
"TEST KEY" = "test value"
 
</source>
 
</source>
  
==应用程序结构==
+
如果需要添加注释,可以使用#,比如这样:
  
==服务提供者==
+
<source lang="bash">
 +
#测试单行注释
 +
KEY=value #测试行末注释
 +
</source>
  
服务提供者是所有Laravel应用程序启动的中心所在。包括你自己的应用程序,以及所有的Laravel核心服务,都是通过服务提供者启动的。
+
如果需要嵌套变量的话,也可以直接在 .env 中写, 借用官方的例子:
  
若你打开Laravel的config/app.php文件,你将会看到providers数组。这些都是你的应用程序会加载到的所有服务提供者类。当然,它们之中有很多属于「延迟」提供者,意味着除非真正需要它们所提供的服务,否则它们并不会在每一个请求中都被加载。
+
<source lang="bash">
 +
BASE_DIR="/var/webroot/project-root"
 +
CACHE_DIR="${BASE_DIR}/cache"
 +
TMP_DIR="${BASE_DIR}/tmp"
 +
</source>
  
 +
=== .env 可以存储的内容===
  
;注册方法
+
前文说了,.env 是非常简单的配置文件,简单到什么程度呢?
  
如同之前提到的,在register方法中,你应该只将事物绑定至服务容器中。永远不要尝试在register方法中注册任何事件侦听器、路由或任何其它功能。否则的话,你可能会意外地使用到由尚未加载的服务提供者所提供的服务。
+
它只支持一维K/V格式的配置项,而且 key 和 value 都只能是字符串。
  
 +
那如果想存一个列表怎么办?
  
;延迟提供者
+
有的时候我们需要在配置文件里存一个列表,比如支付平台调用 webhook 的时候只会从固定的IP地址发起,那我们可能就会为了安全性,把这些IP地址放到一个白名单中,每次验证一下来源IP是否在名单列表之内;
  
若你的提供者仅在服务容器中注册绑定,你可以选择延缓其注册,直到真正需要其中已注册的绑定,延迟提供者加载可提高应用程序的性能。
+
像这种白名单列表有办法存到 .env 中么?
  
要延迟提供者加载,可将defer属性设置为true,并定义一个provides方法。provides方法会返回提供者所注册的服务容器绑定。
+
只能说……不能直接存进去,因为 .env 很简单,它的 value 只能是字符串,不过我们可以尝试变通一下,使用一个连接符(比如半角逗号,)把白名单地址拼成一个字符串,使用时再分割开:
  
==服务容器==
+
<source lang="bash">
 +
WHITE_LIST=192.168.0.1,192.168.0.2,192.168.0.3
 +
</source>
  
在服务提供者中,你总是可以通过$this->app实例变量访问容器。
+
==获取目前应用程序的环境==
  
 +
应用程序的当前环境是由 .env 文件中的 APP_ENV 变量所决定的。你可以通过 App facade 的 environment 方法来获取该值:
  
;绑定
+
<source lang="php">
 +
$environment = App::environment();
 +
</source>
  
# 绑定一个单例
+
你也可以传递参数至 environment 方法来确认当前环境是否与参数相符合:
# 绑定实例
+
# 绑定接口至实现
+
# 情境绑定
+
# 标记
+
  
 +
<source lang="php">
 +
if (App::environment('local')) {
 +
    // 环境是 local
 +
}
  
;解析
+
if (App::environment('local', 'staging')) {
 +
    // 环境是 local 或 staging...
 +
}
 +
</source>
  
有几种方式可以从容器中解析一些东西。
+
也可通过 app 辅助函数获取应用程序实例:
  
<source lang='php'>
+
<source lang="php">
$fooBar = $this->app->make('FooBar');
+
$environment = app()->environment();
 
</source>
 
</source>
  
或者,你可以像数组一样从容器中进行访问,因为他实现了PHP的ArrayAccess接口:
+
==获取设置值==
  
<source lang='php'>
+
可以使用 config 辅助函数获取你的设置值,设置值可以通过「点」语法来获取,其中包含了文件与选项的名称。你也可以指定一个默认值,当该设置选项不存在时就会返回默认值:
$fooBar = $this->app['FooBar'];
+
 
 +
<source lang="php">
 +
$value = config('app.timezone');
 +
config(['app.timezone' => 'America/Chicago']);
 
</source>
 
</source>
  
 +
== APP_ENV可以设置成哪些值?==
  
;容器事件
+
* 开发: local
 +
* 测试: testing
 +
* 预上线: staging
 +
* 正式环境: production
  
每当服务容器解析一个对象时就会触发事件。你可以使用resolving方法监听这个事件。
+
=Homestead=
  
==Facades==
+
https://phphub.org/topics/2 Laravel 的 Homestead 开发环境部署
  
Facades为应用程序的服务容器中可用的类提供了一个「静态」接口。Laravel本身附带许多的facades,甚至你可能在不知情的状况下已经在使用他们!Laravel「facades」作为在服务容器内基类的「静态代理」,拥有简洁、易表达的语法优点,同时维持着比传统静态方法更高的可测试性和灵活性。
+
这是两年前的旧文了,不知现在是否还有效。
  
<source lang='php'>
+
设置数据库连接
$user = Cache::get('user:'.$id);
+
</source>
+
  
如果我们查看Illuminate\Support\Facades\Cache类,你会发现没有静态方法get。
+
本机连接 vm 里 mysql 方法是:
  
相反的,Cache facade继承了基底Facade类以及定义了getFacadeAccessor()方法。记住,这个方法的工作是返回服务容器绑定的名称。当用户在Cache facade上参考任何的静态方法,Laravel会从服务容器解析被绑定的cache以及针对对象运行请求的方法(在这个例子中是get)。
+
host: 127.0.0.1
  
==Contracts==
+
port: 33060
  
Laravel的Contracts是一组定义了框架核心服务的接口(php class interfaces)。例如:
+
user: homestead
  
* Illuminate\Contracts\Queue\Queue contract 定义了队列任务所需要的方法
+
pass: secret
* Illuminate\Contracts\Mail\Mailer contract 定义了寄送e-mail需要的方法
+
  
框架对于每个contract都有提供对应的实现。
+
==Is Laravel really this slow?==
  
 +
http://stackoverflow.com/questions/23283574/is-laravel-really-this-slow
  
;Contracts Vs. Facades
+
I just started using Laravel. I've barely written any code yet, but my pages are taking nearly a second to load!
  
Laravel的facades提供一个简单的方法来使用服务,而不需要使用类型提示和在服务容器之外解析contracts。然而,使用contracts可以明显地定义出类的依赖,对大部分应用进程而言,使用facade就足够了,然而,若你实在需要特别的低耦合,使用contracts可以做到这一点。
+
;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.
  
当所有的Laravel服务都使用简洁的接口定义,就能够很容易决定一个服务需要提供的功能。可以将contracts视为说明框架特色的简洁文档。
+
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":
  
Laravel事件提供了简单的侦听器实现,允许你订阅和监听事件,事件类通常被保存在app/Events目录下,而它们的侦听器被保存在app/Listeners目录下。
+
Golang with log handler stdout : 6000 rps
  
==错误与日志==
+
SpringBoot with Log Handler stdout: 3600 rps
  
<source lang='php'>
+
Laravel 5 with off log :230 rps
//.env
+
APP_DEBUG=true
+
  
// bootstrap/app.php
+
==Mac安装==
$app->withFacades();
+
  
//引用Log
+
http://laravel-china.org/docs/5.1/homestead 按开发文档步骤安装,比较顺利。
use Log;
+
  
// 8个日志级别
+
# 安装Virtual Box
Log::emergency($error);
+
# 安装Vagrant
Log::alert($error);
+
# 下载本地Lavravl项目代码
Log::critical($error);
+
# 配置Homestead.yaml
Log::error($error);
+
# vagrant up
Log::warning($error);
+
# vagrant reload --provision
Log::notice($error);
+
# vagrant destroy --force
Log::info($error);
+
Log::debug($error);
+
</source>
+
  
==测试==
+
==Windows安装==
  
<source lang='php'>
+
windows的安装步骤与Mac一样,只是电脑配置差异,有些问题要特别处理。
public function testTom()
+
{
+
    $response = $this->call('get', '/userInfo');
+
    $result = json_decode($response->original);
+
  
    $this->assertEquals(
+
 
        'Tom', $result->name
+
;在BIOS中,开启虚拟化。
     );
+
 
}
+
安装好Virtual Box、Vagrant,配置好Homestead.yaml后,vagrant up启动到一半不动了,直到超时退出。
 +
 
 +
 
 +
;在配置文件夹和站点目录
 +
 
 +
folders的map和to,配置反了,启动时vagrant找不到github_projets目录。
 +
 
 +
<source lang='text'>
 +
folders:
 +
     - map: d:/github_projects
 +
      to: /home/github_projects
 +
 
 +
sites:
 +
    - map: laravel.example.com
 +
      to: /home/github_projects/LaravelExample/public
 
</source>
 
</source>
  
==缓存==
 
  
<source lang='php'>
+
;运行composer install
use Cache;
+
  
if (Cache::has('key')) {
+
正常启动Vagrant后,打开站点首页,报错,指示vendor目录下的文件找不到。
    $coupon_total = Cache::get('key');
+
} else {
+
    $rs = Coupon_api::instance()->total();
+
  
    if ($rs['status']) {
 
        $coupon_total = $rs['data']['total_amount'];
 
    }
 
  
    Cache::put('key', $coupon_total, 5); //5 minutes
+
;.ssh帐户可以注释掉
}
+
 
 +
<source lang='text'>
 +
authorize: ~/.ssh/id_rsa.pub
 +
 
 +
keys:
 +
    - ~/.ssh/id_rsa
 
</source>
 
</source>
  
==session==
 
;session使用
 
<source lang='php'>
 
use Illuminate\Http\Request;
 
  
function blade(Request $request)
+
;cpus设置
{
+
 
    //赋值
+
i5CPU,双核四线程,跑了个负载。
    session(['name'=> 'Tom']);
+
 
    $request->session()->put('name', 'Tom');
+
<source lang='bash'>
    $request->session()->push('students', 'Tom');
+
ab -c 50 -n 2000 http://laravel.example.com/
+
 
    //取值
+
cpus: 1    75.99     72.95
     $name = session('name');
+
cpus: 2  111.95    114.54
     $request->session()->get('students');
+
cpus: 3  111.27    115.85
}
+
cpus: 4    92.57     95.45
 
</source>
 
</source>
  
 +
从测试结果上看,cpus设为2运行效率最高。
  
;Session store not set on request.
+
==ngnix配置文件路径==
<source lang='php'>
+
 
// Kernel.php添加中间件
+
<source lang="text">
protected $middleware = [
+
/etc/nginx
    //...
+
    \Illuminate\Session\Middleware\StartSession::class,
+
    \Illuminate\View\Middleware\ShareErrorsFromSession::class,
+
];
+
 
</source>
 
</source>
 +
 +
=Swagger-php=
  
 
=SwaggerLume=
 
=SwaggerLume=
第357行: 第360行:
 
<source lang="bash">
 
<source lang="bash">
 
composer global require "laravel/lumen-installer=~1.0"
 
composer global require "laravel/lumen-installer=~1.0"
 +
# or
 +
composer global require "laravel/lumen-installer"
 
</source>
 
</source>
  
第375行: 第380行:
 
<source lang="text">
 
<source lang="text">
 
Lumen (5.2.8) (Laravel Components 5.2.*)
 
Lumen (5.2.8) (Laravel Components 5.2.*)
 +
</source>
 +
 +
==Creating custom helpers==
 +
 +
Add the helpers.php file to your composer.json autoload files.
 +
 +
<source lang="php">
 +
"autoload": {
 +
    "classmap": [
 +
        "database"
 +
    ],
 +
    "psr-4": {
 +
        "Tasky\\": "app/"
 +
    },
 +
    "files": [
 +
        "app/Support/helpers.php"
 +
    ]
 +
},
 +
</source>
 +
 +
<source lang="text">
 +
$ composer dumpautoload
 
</source>
 
</source>
  
 
=base64=
 
=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日
 +
 +
==获取版本号==
 +
 +
<source lang='php'>
 +
$app->get('/', function () use ($app) {
 +
    return $app->version();
 +
});
 +
</source>
  
 
==指定302跳转==
 
==指定302跳转==
第387行: 第437行:
 
return redirect('/userInfo', 302); //默认为301
 
return redirect('/userInfo', 302); //默认为301
 
</source>
 
</source>
 +
 +
==laravel 怎么截取字符串多余的用省略号表示?==
 +
 +
<source lang='php'>
 +
str_limit($value, $limit = 100, $end = '...');
 +
</source>
 +
 +
==查找关联是否存在==
 +
 +
<source lang='php'>
 +
$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);
 +
</source>
 +
 +
==查看Laravel版本号的三种方法==
 +
 +
1. PHP artisan --version
 +
 +
2. vim vendor/laravel/framework/src/Illuminate/Foundation/Application.php
 +
 +
3. 可以写在路由里。5.4版本的路由文件夹是routes。我们可以写在routes\web.php里。
 +
<source lang='php'>
 +
Route::get('laravel-version', function(){
 +
    $laravel = app();
 +
    return "Your Laravel version is ".$laravel::VERSION;
 +
});
 +
</source>
 +
 +
==Laravel Debugbar调试器==
 +
 +
Debugbar package是Barry vd. Heuvel写的一个包,实现在开发过程中快速轻松地查看应用程序信息的功能。安装简单和功能强大,已经成为Laravel开发过程中的不可或缺的包之一。
 +
 +
安装极为简单。
 +
 +
<source lang="bash">
 +
composer require barryvdh/laravel-debugbar
 +
</source>
 +
 +
==Laravel 5.4新兵Dusk==
 +
 +
===Laravel 应用测试的背景===
 +
 +
首先,简单回顾一下:虽然每个人在讨论测试时使用的语言有点不同,但都一致认为单元测试是负责测试隔离开来的小块的代码 ,例如在一个类中的一个方法。而应用测试,与集成测试类似,用来测试整个应用程序作为一个整体。
 +
 +
自从 Jeffrey Way 的 Integrated 成为 Laravel 5.1 核心,我们便获得了 ->visit() 、->get() 、->see() 等方法去描述一个浏览器访问网站的行动。而这确实改变了我们编写的应用程序测试的能力,简单地写个例子:
 +
 +
<source lang="bash">
 +
/** @test */
 +
public function cta_link_functions()
 +
{
 +
    $this->visit('/sales-page')
 +
        ->click('Try it now!')
 +
        ->see('Sign up for trial')
 +
        ->onPage('trial-signup');
 +
}
 +
</source>
 +
 +
对后台而言,它就等于一个 PHP 的启动请求,通过我们的应用程序传递这个请求,去抓取 DOM,然后提出更多的请求,直到整条代码链完成。 从而做到在不需要浏览器的情况下去模拟浏览器的行为。
 +
 +
===传统测试方式带来的问题===
 +
 +
但如果应用程序的功能依赖了 JavaScript,那该怎么办?毕竟这不是一个真正的浏览器,难以要求它去注意到你的 JavaScript。
 +
 +
随着时间的推移,在 Laravel 应用程序中使用和测试 JavaScript 组件的愿望不断增多,对于 Laravel 提供的工具无法测试大部分应用程序的不满也越来越多。
 +
 +
==重要概念及应用==
 +
 +
===facade、helper===
 +
 +
===model、service、repositories、provider===
 +
 +
<source lang='php'
 +
$user->getOriginal('gender');  //修改器取出原始值
 +
</source>
 +
 +
==在.env文件中使用变量==
 +
 +
在编辑配置文件 .env 时,下面的情况:
 +
 +
<source lang="bash">
 +
MAIL_USERNAME=hello@laravel-news.com
 +
MAIL_FROM_ADDRESS=hello@laravel-news.com
 +
 +
# 等同于
 +
 +
MAIL_USERNAME=hello@laravel-news.com
 +
MAIL_FROM_ADDRESS=${MAIL_USERNAME}
 +
</source>
 +
 +
${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错误处理框架,有一个漂亮拉风的错误页面。
  
 
=技术文章收藏=
 
=技术文章收藏=
 +
 +
[https://laravel-china.org/articles/6735/laravel-csrf-attack-and-defense Laravel - CSRF 攻击与防御]
 +
 +
[http://9iphp.com/web/php/php-datetime-package-carbon.html 日期及时间处理包Carbon在Laravel中的简单使用]
  
 
[https://phphub.org/topics/2020 十个Laravel5程序优化技巧]
 
[https://phphub.org/topics/2020 十个Laravel5程序优化技巧]
  
[http://phphub.laravel-china.org/topics/2018 如何查看 Laravel 5 的所有数据库请求]
+
[http://phphub.laravel-china.org/topics/2018 如何查看Laravel 5的所有数据库请求]
 +
 
 +
[https://laravel-china.org/articles/4805/in-laravel-your-most-commonly-used-extensions-pack 在Laravel中你最常用的扩展包]
 +
 
 +
[https://laravel-china.org/articles/4630/wake-up-and-smell-the-coffee-maintenance-of-large-php-applications-is-not-simple 维护大型PHP应用程序不简单!]
 +
 
 +
[https://laravel-china.org/articles/6111/travis-ci-series-automated-deployment-blog Travis CI系列:自动化部署博客]
 +
 
 +
[https://laravel-china.org/topics/5158/use-docker-to-integrate-laravel-to-improve-team-development-efficiency 運用Docker整合Laravel提升團隊開發效率]
 +
 
 +
[https://laravel-china.org/articles/6201/questions-and-answers-that-laravel-and-phper-interviews-may-encounter Laravel、PHPer面试可能会遇到的问题及答案]

2018年9月5日 (三) 08:41的最后版本

目录

起步

安装

  1. 下载Laravel一键安装包。
  2. 配置Web服务器虚拟主机。
  3. 将网站根目录配置为laravel5/public。
  4. 能显示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 按开发文档步骤安装,比较顺利。

  1. 安装Virtual Box
  2. 安装Vagrant
  3. 下载本地Lavravl项目代码
  4. 配置Homestead.yaml
  5. vagrant up
  6. vagrant reload --provision
  7. 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错误处理框架,有一个漂亮拉风的错误页面。

技术文章收藏

Laravel - CSRF 攻击与防御

日期及时间处理包Carbon在Laravel中的简单使用

十个Laravel5程序优化技巧

如何查看Laravel 5的所有数据库请求

在Laravel中你最常用的扩展包

维护大型PHP应用程序不简单!

Travis CI系列:自动化部署博客

運用Docker整合Laravel提升團隊開發效率

Laravel、PHPer面试可能会遇到的问题及答案