“Laravel”的版本间的差异

来自tomtalk
跳转至: 导航搜索
上传文件
Tom讨论 | 贡献
model、service、repositories、provider
 
(未显示同一用户的48个中间版本)
第2行: 第2行:
  
 
<div id="indexContent">
 
<div id="indexContent">
[[入门教程]]
+
[[入门教程]] [[基本功能]] [[系统架构]] [[系统服务]]
 
</div>
 
</div>
  
第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
windows的安装步骤与Mac一样,只是电脑配置差异,有些问题要特别处理。
+
 
+
 
+
;在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>
  
 +
===通过Composer创建项目===
  
;运行composer install
+
或者,你还可以通过在终端中运行 create-project 命令来安装 Laravel:
  
正常启动Vagrant后,打开站点首页,报错,指示vendor目录下的文件找不到。
+
<source lang="bash">
 
+
composer create-project --prefer-dist laravel/laravel blog
 
+
;.ssh帐户可以注释掉
+
 
+
<source lang='text'>
+
authorize: ~/.ssh/id_rsa.pub
+
 
+
keys:
+
    - ~/.ssh/id_rsa
+
 
</source>
 
</source>
  
 +
===本地开发服务器===
  
;cpus设置
+
如果你在本地安装了 PHP,并且想使用 PHP 内置的开发服务器来为你的应用程序提供服务,那就使用 Artisan 命令 serve。这个命令会在 http://localhost:8000 上启动开发服务器:
  
i5CPU,双核四线程,跑了个负载。
+
<source lang="bash">
 
+
php artisan serve
<source lang='bash'>
+
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
+
 
</source>
 
</source>
  
从测试结果上看,cpus设为2运行效率最高。
+
当然,对于本地开发来说,最好的选择还是 Homestead和Valet。
  
=基本功能=
+
===Valet还是Homestead?===
  
==路由==
+
Laravel还提供了另一种本地开发环境Homestead。Homestead 和 Valet 的不同之处在于目标受众和对本地开发的方式。Homestead 提供了一个完整的、具有自动化的 Nginx 配置的 Ubuntu 虚拟机。如果你想要完全虚拟化的 Linux 开发环境或 Windows/Linux,Homestead 是一个不错的选择。
  
<source lang='php'>
+
Valet 仅支持 Mac,并要求你将 PHP 和数据库服务器直接安装到本地机器上。这可以很容易地通过使用 Homebrew 命令来实现,像 brew install php71 和 brew install mysql。Valet 提供了一个极快的、资源消耗最少本地开发环境,非常适合只需要 PHP/MySQL 并且不需要虚拟开发环境的开发人员。
// 简单路由
+
Route::get('/', function () {
+
    return view('welcome');
+
});
+
  
//为多重动作注册路由
+
=配置=
Route::match(['get', 'post'], '/get-post', function () {
+
    return 'get and post';
+
});
+
  
Route::any('foo', function () {
+
==.env 配置文件适用范围==
    return 'any foo ' . url('foo') . ' ' . url('router');
+
});
+
  
//路由参数
+
.env 文件主要的作用是存储环境变量,也就是会随着环境变化的东西,比如数据库的用户名、密码、缓存驱动、时区,还有静态文件的存储路径之类的;
Route::get('posts/{pid}/comments/{comment?}', function ($pId, $commentId = 'empty') {
+
    return "postId = $pId, comments = $commentId";
+
});
+
  
//正则表达式限制参数。也可为参数设定全局规则pattern filter。
+
因为这些信息应该是和环境绑定的,不应该随代码的更新而变化,所以一般不会把 .env 文件放到版本控制中;
Route::get('user/{id}/{name?}', function ($id, $name = 'empty') {
+
    return "userId = $id, name = $name";
+
})->where(['id' => '[0-9]?', 'name' => '[a-z]+']);
+
  
//命名路由
+
除了和环境绑定的环境变量,有时候一些安全系数比较高,不希望纳入版本控制的信息也会放进 .env 文件,比如第三方API的secret之类的;
Route::get('user/list', ['as' => 'userList', function () {
+
    return 'name router: ' . route('userList');
+
}]);
+
  
Route::get('user/info/{id?}', 'UserController@UserInfo')->name('userInfo');
+
==不太适用的内容==
  
//路由群组:中间件、命名空间、子域名、前缀
+
严格来说,传统的配置信息,比如上传文件的尺寸限制,或者一些算法的阈值之类的,其实不适合放到 .env 文件中,因为这些配置项是要和代码一同更新,且所有环境下应该都是一致的;
Route::group([
+
    /*'middleware' => 'auth',*/
+
    'namespace' => 'Member',
+
    'domain' => '{account}.tomtalk.net',
+
    'prefix' => 'member'], function () {
+
    Route::get('{id?}', 'MemberController@detail');
+
});
+
  
//CSRF保护:试了一下,还是不知道怎么用。
+
但我们也经常把这些配置项放进 .env (这大概不是什么好习惯),毕竟如果这些配置项很少的话,单独建一个配置文件也有些不值的感觉……
  
//路由模型绑定
+
==环境配置==
Route::get('user/model/{user}', 'UserController@UserModel')->name('userModel');
+
  
//请求方法伪造 - echo method_field('PUT')
+
所有 Laravel 框架的配置文件都放置在 config 目录下。
  
//抛出404错误 - abort(404)
+
Laravel 使用 Vance Lucas 的 DotEnv PHP 函数库来实现项目内环境变量的控制,在安装好的全新 Laravel 应用程序里,在根目录下会包含一个 .env.example 文件。
</source>
+
  
==中间件==
+
如果你通过 Composer 安装 Laravel,这个文件将自动被更名为 .env,否则你只能手动更改文件名。
  
HTTP中间件提供了一个方便的机制来过滤进入应用程序的HTTP请求。所有的中间件都放在app/Http/Middleware目录内。
+
当你的应用程序收到请求时,这个文件所有的变量都会被加载到 PHP 超级全局变量 $_ENV 里。你可以使用辅助函数 env 来获取这些变量的值。
  
 +
.env 文件不应该被提交到版本控制系统,因为每个开发人员或服务器在使用应用程序时,可能需要不同的环境配置。此外,在入侵者获得你的源代码控制仓库的访问权的情况下,这会成为一个安全隐患,因为任何敏感的凭据都被暴露了。
  
;创建一个中间件
+
不妨将 .env.example 文件放进你的应用程序,通过样本配置文件里的预设值,团队中的其他开发人员就可以清楚地知道,在运行你的应用程序时有哪些环境变量是必须有的。
  
<source lang='bash'>
+
=== .env 中的基本语法===
php artisan make:middleware OldMiddleware
+
</source>
+
  
<source lang='php'>
+
.env 中的数据按行划分, 每条数据占一行,数据之间可以有任意多的空行,读取时会自动去除前后空格。
public function handle($request, Closure $next)
+
{
+
    if ($request->input('age') <= 200) {
+
        return redirect('home');
+
    }
+
  
    return $next($request);
+
<source lang="bash">
}
+
KEY1=value1
 +
KEY2=value2
 +
KEY3=value3
 +
KEY4=value4
 
</source>
 
</source>
  
;前置中间件/后置中间件
+
如果 key 或者 value 中包含空格,就需要在两端加上双引号,比如这样:
  
<source lang='php'>
+
<source lang="bash">
public function handle($request, Closure $next)
+
"TEST KEY" = "test value"
{
+
    // 运行动作
+
 
+
    return $next($request);
+
}
+
 
+
public function handle($request, Closure $next)
+
{
+
    $response = $next($request);
+
 
+
    // 运行动作
+
 
+
    return $response;
+
}
+
 
</source>
 
</source>
  
 +
如果需要添加注释,可以使用#,比如这样:
  
;全局中间件
+
<source lang="bash">
 
+
#测试单行注释
若是希望每个HTTP请求都经过一个中间件,只要将中间件的类加入到app/Http/Kernel.php的$middleware属性清单列表中。
+
KEY=value #测试行末注释
 
+
 
+
;为路由指派中间件
+
 
+
 
+
;中间件参数
+
 
+
 
+
;Terminable中间件
+
 
+
有些时候中间件需要在HTTP响应被发送到浏览器之后才运行,例如,Laravel内置的「session」中间件存储的session数据是在响应被发送到浏览器之后才进行写入的。想要做到这一点,你需要定义中间件为「terminable」
+
 
+
==控制器==
+
 
+
===基础控制器===
+
 
+
<source lang='php'>
+
//一旦你指定了控制器路由的名称,则可以很容易地生成能实现该行为的URL。
+
$url = route('name');
+
 
+
//你也可以使用action辅助函数生成指向控制器行为的URL。
+
$url = action('FooController@method');
+
 
+
//你可以使用Route facade的currentRouteAction方法取到正在运行的控制器行为名称。
+
$action = Route::currentRouteAction();
+
 
</source>
 
</source>
  
===控制器中间件===
+
如果需要嵌套变量的话,也可以直接在 .env 中写, 借用官方的例子:
  
可将中间件指定给控制器路由,例如:
+
<source lang="bash">
 
+
BASE_DIR="/var/webroot/project-root"
<source lang='php'>
+
CACHE_DIR="${BASE_DIR}/cache"
Route::get('profile', [ 'middleware' => 'auth', 'uses' => 'UserController@showProfile' ]);
+
TMP_DIR="${BASE_DIR}/tmp"
 
</source>
 
</source>
  
不过,在控制器构造器中指定中间件会更为灵活。你可以很容易地将中间件指定给控制器。你甚至可以对中间件作出限制,仅将它提供给控制器类中的某些方法。
+
=== .env 可以存储的内容===
  
<source lang='php'>
+
前文说了,.env 是非常简单的配置文件,简单到什么程度呢?
class UserController extends Controller
+
{
+
    public function __construct()
+
    {
+
        $this->middleware('auth');
+
        $this->middleware('log', ['only' => ['fooAction', 'barAction']]);
+
        $this->middleware('subscribed', ['except' => ['fooAction', 'barAction']]);
+
    }
+
}
+
</source>
+
  
===RESTful资源控制器===
+
它只支持一维K/V格式的配置项,而且 key 和 value 都只能是字符串。
  
<source lang='php'>
+
那如果想存一个列表怎么办?
Route::resource('photos', 'PhotosController');
+
  
//部分资源路由
+
有的时候我们需要在配置文件里存一个列表,比如支付平台调用 webhook 的时候只会从固定的IP地址发起,那我们可能就会为了安全性,把这些IP地址放到一个白名单中,每次验证一下来源IP是否在名单列表之内;
Route::resource('photos', 'PhotosController', ['only' => ['index', 'show']]);
+
Route::resource('photos', 'PhotosController', ['except' => ['create', 'store', 'update', 'destroy']]);
+
  
//命名资源路由
+
像这种白名单列表有办法存到 .env 中么?
Route::resource('photos', 'PhotosController', ['names' => ['create' => 'photo.build']]);
+
  
//嵌套资源
+
只能说……不能直接存进去,因为 .env 很简单,它的 value 只能是字符串,不过我们可以尝试变通一下,使用一个连接符(比如半角逗号,)把白名单地址拼成一个字符串,使用时再分割开:
Route::resource('photos.comments', 'PhotoCommentController');
+
  
//附加资源控制器
+
<source lang="bash">
//如果想在资源控制器中默认的资源路由之外加入其它额外路由,则应该在调用Route::resource之前定义这些路由。否则,由resource方法定义的路由可能会不小心覆盖你附加的路由:
+
WHITE_LIST=192.168.0.1,192.168.0.2,192.168.0.3
Route::get('photos/popular', 'PhotosController@method');
+
Route::resource('photos', 'PhotosController');
+
 
+
//隐式控制器
+
Route::controller('users', 'UserController');
+
 
</source>
 
</source>
  
==请求==
+
==获取目前应用程序的环境==
  
===获取请求===
+
应用程序的当前环境是由 .env 文件中的 APP_ENV 变量所决定的。你可以通过 App facade 的 environment 方法来获取该值:
  
要通过依赖注入的方式获取HTTP请求的实例,就必须在控制器的构造器或方法中,使用Illuminate\Http\Request类型提示。
+
<source lang="php">
 
+
$environment = App::environment();
<source lang='php'>
+
use Illuminate\Http\Request;
+
 
+
class UserController extends Controller
+
{
+
    public function store(Request $request)
+
    {
+
        $name = $request->input('name');
+
        //
+
    }
+
}
+
 
</source>
 
</source>
  
如果控制器方法也有输入数据是从路由参数传入的,只需将路由参数置于其它依赖之后。
+
你也可以传递参数至 environment 方法来确认当前环境是否与参数相符合:
  
<source lang='php'>
+
<source lang="php">
public function update(Request $request, $id)
+
if (App::environment('local')) {
{
+
     // 环境是 local
     //
+
 
}
 
}
  
//基本请求信息
+
if (App::environment('local', 'staging')) {
$uri = $request->path();  //返回请求的URI
+
     // 环境是 local 或 staging...
$url = $request->url(); //获取完整的网址
+
 
+
//获取请求的方法
+
$method = $request->method();
+
if ($request->isMethod('post')) {
+
     //
+
 
}
 
}
 
</source>
 
</source>
  
===获取输入数据===
+
也可通过 app 辅助函数获取应用程序实例:
 
+
<source lang='php'>
+
$name = $request->input('name');
+
 
+
$name = $request->name; //使用属性访问用户输入
+
 
+
//你可以在input方法的第二个参数中传入一个默认值。当请求的输入数据不存在于此次请求时,就会返回默认值:
+
$name = $request->input('name', 'Sally');
+
 
+
//确认是否有输入值
+
if ($request->has('name')) {
+
    //
+
}
+
 
+
//获取所有输入数据
+
$input = $request->all();
+
 
+
//获取部分输入数据
+
$input = $request->only(['username', 'password']);
+
$input = $request->only('username', 'password');
+
$input = $request->except(['credit_card']);
+
$input = $request->except('credit_card');
+
 
+
//将输入数据闪存至Session
+
$request->flash();
+
$request->flashOnly('username', 'email');
+
$request->flashExcept('password');
+
 
+
//闪存输入数据至Session后重定向
+
return redirect('form')->withInput();
+
return redirect('form')->withInput($request->except('password'));
+
  
//获取旧输入数据
+
<source lang="php">
$username = $request->old('username');
+
$environment = app()->environment();
{{ old('username') }}
+
 
</source>
 
</source>
  
===Cookies===
+
==获取设置值==
  
<source lang='php'>
+
可以使用 config 辅助函数获取你的设置值,设置值可以通过「点」语法来获取,其中包含了文件与选项的名称。你也可以指定一个默认值,当该设置选项不存在时就会返回默认值:
$value = $request->cookie('name');
+
 
+
//将新的 Cookie 附加到响应
+
$response = new Illuminate\Http\Response('Hello World');
+
$response->withCookie(cookie('name', 'value', $minutes));
+
return $response;
+
  
//如果要创建一个可长期存在,为期五年的 cookie。
+
<source lang="php">
$response->withCookie(cookie()->forever('name', 'value'));
+
$value = config('app.timezone');
 +
config(['app.timezone' => 'America/Chicago']);
 
</source>
 
</source>
  
===上传文件===
+
== APP_ENV可以设置成哪些值?==
  
<source lang='php'>
+
* 开发: local
$file = $request->file('photo');
+
* 测试: testing
 +
* 预上线: staging
 +
* 正式环境: production
  
//确认上传的文件是否存在:
+
=Homestead=
if ($request->hasFile('photo')) {
+
    //
+
}
+
  
//确认上传的文件是否有效
+
https://phphub.org/topics/2 Laravel 的 Homestead 开发环境部署
if ($request->file('photo')->isValid()) {
+
    //
+
}
+
  
//移动上传的文件
+
这是两年前的旧文了,不知现在是否还有效。
$request->file('photo')->move($destinationPath);
+
$request->file('photo')->move($destinationPath, $fileName);
+
</source>
+
  
==blade模板==
+
设置数据库连接
  
所有 Blade 视图都会被编译缓存成普通的 PHP 代码,一直到它们被更改为止。这代表 Blade 基本不会对你的应用程序生成负担。
+
本机连接 vm 里 mysql 方法是:
  
<source lang='php'>
+
host: 127.0.0.1
@extends('layouts.master')
+
  
@section('title', 'LaravelExample')
+
port: 33060
  
@section('sidebar')
+
user: homestead
    @parent
+
  
    <div>
+
pass: secret
        sidebar
+
    </div>
+
@endsection
+
  
@section('content')
+
==Is Laravel really this slow?==
    <h3>变量的使用</h3>
+
    <p>目前的 UNIX 时间戳为 {{ $time }}。
+
    <p>目前的 UNIX 时间戳为 {{ time() }}。
+
    <p>目前的 UNIX 时间戳为 @{{ time() }}。
+
    <p>My name is {{ $name or 'Default' }}.
+
    <p>My name is {{ $html or 'html' }}.
+
    <p>My name is {!! $html or 'html' !!}.
+
  
    {{-- @符号如何显示 --}}
+
http://stackoverflow.com/questions/23283574/is-laravel-really-this-slow
  
    <h3>include</h3>
+
I just started using Laravel. I've barely written any code yet, but my pages are taking nearly a second to load!
    @include('usersList')
+
  
    <h3>each</h3>
+
;Reply 1
    @each('userInfo', $users, 'name')
+
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.
  
    <h3>自定义模板指令</h3>
+
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.
    @datetime(new Datetime())
+
@endsection
+
</source>
+
  
=系统架构=
+
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
  
<source lang='php'>
+
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
require __DIR__.'/../bootstrap/autoload.php';
+
  
$app = require_once __DIR__.'/../bootstrap/app.php';  //创建服务容器
+
To make http-response "Hello World":
  
/**
+
Golang with log handler stdout : 6000 rps
* 创建http核心(或者终端核心)。
+
* config/app.php
+
* 1、注册服务提供者
+
* 2、boot()
+
* 3、注册中间件
+
*/
+
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
+
  
/**
+
SpringBoot with Log Handler stdout: 3600 rps
* 1、路由分派
+
* 2、执行路由中间件
+
* 3、跳转到控制器
+
*/
+
$response = $kernel->handle(
+
    $request = Illuminate\Http\Request::capture()
+
);
+
  
$response->send();
+
Laravel 5 with off log :230 rps
  
$kernel->terminate($request, $response);
+
==Mac安装==
</source>
+
  
==应用程序结构==
+
http://laravel-china.org/docs/5.1/homestead 按开发文档步骤安装,比较顺利。
  
==服务提供者==
+
# 安装Virtual Box
 +
# 安装Vagrant
 +
# 下载本地Lavravl项目代码
 +
# 配置Homestead.yaml
 +
# vagrant up
 +
# vagrant reload --provision
 +
# vagrant destroy --force
  
服务提供者是所有Laravel应用程序启动的中心所在。包括你自己的应用程序,以及所有的Laravel核心服务,都是通过服务提供者启动的。
+
==Windows安装==
  
若你打开Laravel的config/app.php文件,你将会看到providers数组。这些都是你的应用程序会加载到的所有服务提供者类。当然,它们之中有很多属于「延迟」提供者,意味着除非真正需要它们所提供的服务,否则它们并不会在每一个请求中都被加载。
+
windows的安装步骤与Mac一样,只是电脑配置差异,有些问题要特别处理。
  
  
;注册方法
+
;在BIOS中,开启虚拟化。
  
如同之前提到的,在register方法中,你应该只将事物绑定至服务容器中。永远不要尝试在register方法中注册任何事件侦听器、路由或任何其它功能。否则的话,你可能会意外地使用到由尚未加载的服务提供者所提供的服务。
+
安装好Virtual Box、Vagrant,配置好Homestead.yaml后,vagrant up启动到一半不动了,直到超时退出。
  
  
;延迟提供者
+
;在配置文件夹和站点目录
  
若你的提供者仅在服务容器中注册绑定,你可以选择延缓其注册,直到真正需要其中已注册的绑定,延迟提供者加载可提高应用程序的性能。
+
folders的map和to,配置反了,启动时vagrant找不到github_projets目录。
  
要延迟提供者加载,可将defer属性设置为true,并定义一个provides方法。provides方法会返回提供者所注册的服务容器绑定。
+
<source lang='text'>
 +
folders:
 +
    - map: d:/github_projects
 +
      to: /home/github_projects
  
==服务容器==
+
sites:
 
+
    - map: laravel.example.com
在服务提供者中,你总是可以通过$this->app实例变量访问容器。
+
      to: /home/github_projects/LaravelExample/public
 
+
 
+
;绑定
+
 
+
# 绑定一个单例
+
# 绑定实例
+
# 绑定接口至实现
+
# 情境绑定
+
# 标记
+
 
+
 
+
;解析
+
 
+
有几种方式可以从容器中解析一些东西。
+
 
+
<source lang='php'>
+
$fooBar = $this->app->make('FooBar');
+
 
</source>
 
</source>
  
或者,你可以像数组一样从容器中进行访问,因为他实现了PHP的ArrayAccess接口:
 
  
<source lang='php'>
+
;运行composer install
$fooBar = $this->app['FooBar'];
+
</source>
+
  
 +
正常启动Vagrant后,打开站点首页,报错,指示vendor目录下的文件找不到。
  
;容器事件
 
  
每当服务容器解析一个对象时就会触发事件。你可以使用resolving方法监听这个事件。
+
;.ssh帐户可以注释掉
  
==Facades==
+
<source lang='text'>
 +
authorize: ~/.ssh/id_rsa.pub
  
Facades为应用程序的服务容器中可用的类提供了一个「静态」接口。Laravel本身附带许多的facades,甚至你可能在不知情的状况下已经在使用他们!Laravel「facades」作为在服务容器内基类的「静态代理」,拥有简洁、易表达的语法优点,同时维持着比传统静态方法更高的可测试性和灵活性。
+
keys:
 
+
    - ~/.ssh/id_rsa
<source lang='php'>
+
$user = Cache::get('user:'.$id);
+
 
</source>
 
</source>
  
如果我们查看Illuminate\Support\Facades\Cache类,你会发现没有静态方法get。
 
  
相反的,Cache facade继承了基底Facade类以及定义了getFacadeAccessor()方法。记住,这个方法的工作是返回服务容器绑定的名称。当用户在Cache facade上参考任何的静态方法,Laravel会从服务容器解析被绑定的cache以及针对对象运行请求的方法(在这个例子中是get)。
+
;cpus设置
  
==Contracts==
+
i5CPU,双核四线程,跑了个负载。
  
Laravel的Contracts是一组定义了框架核心服务的接口(php class interfaces)。例如:
+
<source lang='bash'>
 +
ab -c 50 -n 2000 http://laravel.example.com/
  
* Illuminate\Contracts\Queue\Queue contract 定义了队列任务所需要的方法
+
cpus: 1    75.99    72.95
* Illuminate\Contracts\Mail\Mailer contract 定义了寄送e-mail需要的方法
+
cpus: 2  111.95    114.54
 
+
cpus: 3  111.27    115.85
框架对于每个contract都有提供对应的实现。
+
cpus: 4    92.57    95.45
 
+
 
+
;Contracts Vs. Facades
+
 
+
Laravel的facades提供一个简单的方法来使用服务,而不需要使用类型提示和在服务容器之外解析contracts。然而,使用contracts可以明显地定义出类的依赖,对大部分应用进程而言,使用facade就足够了,然而,若你实在需要特别的低耦合,使用contracts可以做到这一点。
+
 
+
 
+
;简单性
+
 
+
当所有的Laravel服务都使用简洁的接口定义,就能够很容易决定一个服务需要提供的功能。可以将contracts视为说明框架特色的简洁文档。
+
 
+
除此之外,当依赖的接口足够简洁时,代码的可读性和可维护性大大提高。比起搜索一个大型复杂的类里有哪些可用的方法,你有一个简单,干净的接口可以参考。
+
 
+
=系统服务=
+
 
+
==事件==
+
 
+
Laravel事件提供了简单的侦听器实现,允许你订阅和监听事件,事件类通常被保存在app/Events目录下,而它们的侦听器被保存在app/Listeners目录下。
+
 
+
==错误与日志==
+
 
+
<source lang='php'>
+
//.env
+
APP_DEBUG=true
+
 
+
// bootstrap/app.php
+
$app->withFacades();
+
 
+
//引用Log
+
use Log;
+
 
+
// 8个日志级别
+
Log::emergency($error);
+
Log::alert($error);
+
Log::critical($error);
+
Log::error($error);
+
Log::warning($error);
+
Log::notice($error);
+
Log::info($error);
+
Log::debug($error);
+
 
</source>
 
</source>
  
==测试==
+
从测试结果上看,cpus设为2运行效率最高。
  
<source lang='php'>
+
==ngnix配置文件路径==
public function testTom()
+
{
+
    $response = $this->call('get', '/userInfo');
+
    $result = json_decode($response->original);
+
  
    $this->assertEquals(
+
<source lang="text">
        'Tom', $result->name
+
/etc/nginx
    );
+
}
+
 
</source>
 
</source>
  
==缓存==
+
=Swagger-php=
 
+
<source lang='php'>
+
use Cache;
+
 
+
if (Cache::has('key')) {
+
    $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
+
}
+
</source>
+
 
+
==session==
+
;session使用
+
<source lang='php'>
+
use Illuminate\Http\Request;
+
 
+
function blade(Request $request)
+
{
+
    //赋值
+
    session(['name'=> 'Tom']);
+
    $request->session()->put('name', 'Tom');
+
    $request->session()->push('students', 'Tom');
+
+
    //取值
+
    $name = session('name');
+
    $request->session()->get('students');
+
}
+
</source>
+
 
+
 
+
;Session store not set on request.
+
<source lang='php'>
+
// Kernel.php添加中间件
+
protected $middleware = [
+
    //...
+
    \Illuminate\Session\Middleware\StartSession::class,
+
    \Illuminate\View\Middleware\ShareErrorsFromSession::class,
+
];
+
</source>
+
  
 
=SwaggerLume=
 
=SwaggerLume=
第682行: 第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>
  
第700行: 第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跳转==
第712行: 第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面试可能会遇到的问题及答案