From 696b09de4eb3b58cb1592cd18dc316a85bb7a668 Mon Sep 17 00:00:00 2001
From: jaywcjlove <398188662@qq.com>
Date: Tue, 22 Nov 2022 13:30:48 +0800
Subject: [PATCH] feat: add laravel.md #166
---
README.md | 1 +
docs/laravel.md | 1838 ++++++++++++++++++++++++++++++++++++
scripts/assets/laravel.svg | 3 +
scripts/js/main.js | 2 +-
4 files changed, 1843 insertions(+), 1 deletion(-)
create mode 100644 docs/laravel.md
create mode 100644 scripts/assets/laravel.svg
diff --git a/README.md b/README.md
index 13f3710..21eeba0 100644
--- a/README.md
+++ b/README.md
@@ -52,6 +52,7 @@ Quick Reference
[Julia](./docs/julia.md)
[Kotlin](./docs/kotlin.md)
[LaTeX](./docs/latex.md)
+[Laravel 8](./docs/laravel.md)
[Markdown](./docs/markdown.md)
[MySQL](./docs/mysql.md)
[MATLAB](./docs/matlab.md)
diff --git a/docs/laravel.md b/docs/laravel.md
new file mode 100644
index 0000000..2c1b24c
--- /dev/null
+++ b/docs/laravel.md
@@ -0,0 +1,1838 @@
+Laravel 8 备忘清单
+===
+
+Laravel 8 备忘清单是最好的 Laravel 代码段和备忘清单参考
+
+入门
+----
+
+### Artisan
+
+
+```bash
+# 5.1.11 新增:http://laravel.com/docs/authorization#creating-policies
+$ php artisan make:policy PostPolicy
+# 显示给定命令的帮助
+$ php artisan --help 或 -h
+# 不输出任何信息
+$ php artisan --quiet 或 -q
+# 显示此应用程序版本
+$ php artisan --version 或 -V
+# 不要问任何互动问题
+$ php artisan --no-interaction OR -n
+# 强制 ANSI 输出
+$ php artisan --ansi
+# 禁用 ANSI 输出
+$ php artisan --no-ansi
+# 命令应运行的环境
+$ php artisan --env
+# -v|vv|vvv 增加消息的详细程度:1 表示正常输出,2 表示更详细的输出,3 表示调试
+$ php artisan --verbose
+# 删除编译的类文件
+$ php artisan clear-compiled
+# 显示当前框架环境
+$ php artisan env
+# 显示命令的帮助
+$ php artisan help
+# 列出命令
+$ php artisan list
+# 与您的应用程序交互
+$ php artisan tinker
+# 将应用程序置于维护模式
+$ php artisan down
+# 使应用程序退出维护模式
+$ php artisan up
+# 优化框架以获得更好的性能
+# --force 强制写入已编译的类文件
+# --psr 不要优化 Composer dump-autoload
+$ php artisan optimize [--force] [--psr]
+# 在 PHP 开发服务器上提供应用程序
+$ php artisan serve
+# 更改默认端口
+$ php artisan serve --port 8080
+# 让它在本地主机之外工作
+$ php artisan serve --host 0.0.0.0
+# 设置应用命名空间
+$ php artisan app:name namespace
+# 刷新过期的密码重置令牌
+$ php artisan auth:clear-resets
+# 刷新应用程序缓存
+$ php artisan cache:clear
+# 为缓存数据库表创建迁移
+$ php artisan cache:table
+# 创建缓存文件以加快配置加载
+$ php artisan config:cache
+# 删除配置缓存文件
+$ php artisan config:clear
+# 在节目中
+$exitCode = Artisan::call('config:cache');
+# 用记录播种数据库
+# --class 根播种器的类名(默认值:"DatabaseSeeder")
+# --database 种子的数据库连接
+# --force 强制操作在生产中运行
+$ php artisan db:seed [--class[="..."]] [--database[="..."]] [--force]
+
+# 根据注册生成缺失的事件和处理程序
+$ php artisan event:generate
+
+# 创建一个新的命令处理程序类
+# --command 处理程序处理的命令类
+$ php artisan handler:command [--command="..."] name
+# 创建一个新的事件处理程序类
+# --event 处理程序处理的事件类
+# --queued 表示事件处理程序应该排队
+$ php artisan handler:event [--event="..."] [--queued] name
+
+# 设置应用程序密钥
+$ php artisan key:generate
+
+# 默认情况下,这会创建一个不会推送到队列的自我处理命令
+# 传递 --handler 标志以生成处理程序,传递 --queued 标志以使其排队
+$ php artisan make:command [--handler] [--queued] name
+# 创建一个新的 Artisan 命令
+# --command 应分配的终端命令。 (默认值:“命令:名称”)
+make:console [--command[="..."]] name
+# 创建一个新的足智多谋的控制器
+# --plain 生成一个空的控制器类
+$ php artisan make:controller [--plain] name
+$ php artisan make:controller App\\Admin\\Http\\Controllers\\DashboardController
+# 创建一个新的事件类
+$ php artisan make:event name
+# 新建一个中间件类
+$ php artisan make:middleware name
+# 创建一个新的迁移文件
+# --create 要创建的表
+# --table 要迁移的表
+$ php artisan make:migration [--create[="..."]] [--table[="..."]] name
+# 创建一个新的 Eloquent 模型类
+$ php artisan make:model name
+# 创建一个新的服务提供者类
+$ php artisan make:provider name
+# 新建一个表单请求类
+$ php artisan make:request name
+# 数据库迁移
+# --database 要使用的数据库连接
+# --force 强制操作在生产中运行
+# --path 要执行的迁移文件的路径
+# --pretend 转储将要运行的 SQL 查询
+# --seed 指示是否应重新运行种子任务
+$ php artisan migrate [--database[="..."]] [--force] [--path[="..."]] [--pretend] [--seed]
+# 创建迁移存储库
+$ php artisan migrate:install [--database[="..."]]
+# 创建一个新的迁移文件
+# --seeder 根播种机的类名。
+$ php artisan migrate:refresh [--database[="..."]] [--force] [--seed] [--seeder[="..."]]
+# 回滚所有数据库迁移
+# --pretend 转储将要运行的 SQL 查询。
+$ php artisan migrate:reset [--database[="..."]] [--force] [--pretend]
+# 回滚上次数据库迁移
+$ php artisan migrate:rollback [--database[="..."]] [--force] [--pretend]
+# 显示上/下迁移列表
+$ php artisan migrate:status
+# 为队列作业数据库表创建迁移
+$ php artisan queue:table
+# 收听给定的队列
+# --queue 要监听的队列
+# --delay 延迟失败作业的时间量(默认值:0)
+# --memory 以兆字节为单位的内存限制(默认值:128)
+# --timeout 超时前作业可能运行的秒数(默认值:60)
+# --sleep 在检查作业队列之前等待的秒数(默认值:3)
+# --tries 在记录失败之前尝试作业的次数(默认值:0)
+$ php artisan queue:listen [--queue[="..."]] [--delay[="..."]] [--memory[="..."]] [--timeout[="..."]] [--sleep[="..."]] [--tries[="..."]] [connection]
+# 列出所有失败的队列作业
+$ php artisan queue:failed
+# 为失败队列作业数据库表创建迁移
+$ php artisan queue:failed-table
+# 刷新所有失败的队列作业
+$ php artisan queue:flush
+# 删除失败的队列作业
+$ php artisan queue:forget
+# 在完成当前作业后重新启动队列工作守护进程
+$ php artisan queue:restart
+# 重试一个失败的队列作业(id:失败作业的ID)
+$ php artisan queue:retry id
+# 订阅 Iron.io 推送队列的 URL
+# 队列:Iron.io 队列的名称
+# url:要订阅的URL
+# --type 队列的推送类型
+$ php artisan queue:subscribe [--type[="..."]] queue url
+# 处理队列中的下一个作业
+# --queue 要监听的队列
+# --daemon 以守护进程模式运行worker
+# --delay 延迟失败作业的时间量(默认值:0)
+# --force 即使在维护模式下也强制 worker 运行
+# --memory 以兆字节为单位的内存限制(默认值:128)
+# --sleep 没有工作时休眠的秒数(默认值:3)
+# --tries 在记录失败之前尝试作业的次数(默认值:0)
+$ php artisan queue:work [--queue[="..."]] [--daemon] [--delay[="..."]] [--force] [--memory[="..."]] [--sleep[="..."]] [--tries[="..."]] [connection]
+
+# 创建路由缓存文件以加快路由注册
+$ php artisan route:cache
+# 移除路由缓存文件
+$ php artisan route:clear
+# 列出所有注册的路由
+$ php artisan route:list
+
+# 运行预定的命令
+$ php artisan schedule:run
+
+# 为会话数据库表创建迁移
+$ php artisan session:table
+
+# 从供应商包中发布任何可发布的资产
+# --force 覆盖任何现有文件
+# --provider 具有您要发布的资产的服务提供商
+# --tag 包含您要发布的资产的标签
+$ php artisan vendor:publish [--force] [--provider[="..."]] [--tag[="..."]]
+$ php artisan tail [--path[="..."]] [--lines[="..."]] [connection]
+```
+
+
+### Composer
+
+```bash
+$ composer create-project laravel/laravel folder_name
+$ composer install
+$ composer update
+$ composer dump-autoload [--optimize]
+$ composer self-update
+$ composer require [options] [--] [vender/packages]...
+```
+
+
+### Config
+
+```php
+Config::get('app.timezone');
+// 使用默认值获取
+Config::get('app.timezone', 'UTC');
+// 设置配置
+Config::set('database.default', 'sqlite');
+```
+
+### Environment
+
+```php
+$environment = app()->environment();
+$environment = App::environment();
+$environment = $app->environment();
+// 环境是当地的
+if ($app->environment('local')){}
+// 环境要么是本地的,要么是暂存的……
+if ($app->environment('local', 'staging')){}
+```
+
+### Log 日志
+
+```php
+// 记录器提供 RFC 5424 中定义的七个日志记录级别:
+// 调试、信息、通知、警告、错误、严重和警报
+// debug, info, notice, warning, error, critical, 和 alert
+Log::info('info');
+Log::info('info',array('context'=>'additional info'));
+Log::error('error');
+Log::warning('warning');
+// 获取独白实例
+Log::getMonolog();
+// 添加监听器
+Log::listen(function($level, $message, $context) {});
+```
+
+查询记录
+
+```php
+// 启用日志
+DB::connection()->enableQueryLog();
+// 获取已执行查询的数组
+DB::getQueryLog();
+```
+
+### URL
+
+```php
+URL::full();
+URL::current();
+URL::previous();
+URL::to('foo/bar', $parameters, $secure);
+URL::action('NewsController@item', ['id'=>123]);
+// 需要在适当的命名空间中
+URL::action('Auth\AuthController@logout');
+URL::action('FooController@method', $parameters, $absolute);
+URL::route('foo', $parameters, $absolute);
+URL::secure('foo/bar', $parameters);
+URL::asset('css/foo.css', $secure);
+URL::secureAsset('css/foo.css');
+URL::isValidUrl('http://example.com');
+URL::getRequest();
+URL::setRequest($request);
+```
+
+### Event
+
+```php
+Event::fire('foo.bar', array($bar));
+// 向调度程序注册一个事件侦听器
+// void listen(string|array $events, mixed $listener, int $priority)
+Event::listen('App\Events\UserSignup', function($bar){});
+Event::listen('foo.*', function($bar){});
+Event::listen('foo.bar', 'FooHandler', 10);
+Event::listen('foo.bar', 'BarHandler', 5);
+// 停止传播事件
+// 您可以通过从处理程序返回 false 来执行此操作
+Event::listen('foor.bar', function($event){ return false; });
+Event::subscribe('UserEventHandler');
+```
+
+### Pagination
+
+```php
+// 自动魔术分页
+Model::paginate(15);
+Model::where('cars', 2)->paginate(15);
+// 仅“下一个”和“上一个”
+Model::where('cars', 2)->simplePaginate(15);
+// 手动分页器
+Paginator::make($items, $totalItems, $perPage);
+// 在视图中打印页面导航器
+$variable->links();
+```
+
+### Lang
+
+```php
+App::setLocale('en');
+Lang::get('messages.welcome');
+Lang::get('messages.welcome', array('foo' => 'Bar'));
+Lang::has('messages.welcome');
+Lang::choice('messages.apples', 10);
+// Lang::get alias
+trans('messages.welcome');
+```
+
+### File
+
+
+```php
+File::exists('path');
+File::get('path');
+File::getRemote('path');
+// 通过请求获取文件的内容
+File::getRequire('path');
+// 需要一次给定的文件
+File::requireOnce('path');
+// 写一个文件的内容
+File::put('path', 'contents');
+// 附加到文件
+File::append('path', 'data');
+// 删除给定路径的文件
+File::delete('path');
+// 将文件移动到新位置
+File::move('path', 'target');
+// 将文件复制到新位置
+File::copy('path', 'target');
+// 从文件路径中提取文件扩展名
+File::extension('path');
+// 获取给定文件的文件类型
+File::type('path');
+// 获取给定文件的文件大小
+File::size('path');
+// 获取文件的最后修改时间
+File::lastModified('path');
+// 确定给定路径是否为目录
+File::isDirectory('directory');
+// 确定给定路径是否可写
+File::isWritable('path');
+// 确定给定路径是否为文件
+File::isFile('file');
+// 查找与给定模式匹配的路径名
+File::glob($patterns, $flag);
+// 获取目录中所有文件的数组
+File::files('directory');
+// 从给定目录中获取所有文件(递归)
+File::allFiles('directory');
+// 获取给定目录中的所有目录
+File::directories('directory');
+// 创建目录
+File::makeDirectory('path', $mode = 0777, $recursive = false);
+// 将目录从一个位置复制到另一个位置
+File::copyDirectory('directory', 'destination', $options = null);
+// 递归删除目录
+File::deleteDirectory('directory', $preserve = false);
+// 清空指定目录下的所有文件和文件夹
+File::cleanDirectory('directory');
+```
+
+### SSH
+
+执行命令
+
+```php
+SSH::run(array $commands);
+SSH::into($remote)->run(array $commands);
+// 指定远程,否则假定默认
+SSH::run(array $commands, function($line)
+{
+ echo $line.PHP_EOL;
+});
+```
+
+任务
+
+```php
+// 定义
+SSH::define($taskName, array $commands);
+// 执行
+SSH::task($taskName, function($line)
+{
+ echo $line.PHP_EOL;
+});
+```
+
+SFTP 上传
+
+```php
+SSH::put($localFile, $remotePath);
+SSH::putString($string, $remotePath);
+```
+
+### Cookie
+
+```php
+Cookie::get('key');
+Cookie::get('key', 'default');
+// 创建一个永远持续的 cookie
+Cookie::forever('key', 'value');
+// 创建一个持续 N 分钟的 cookie
+Cookie::make('key', 'value', 'minutes');
+// 在创建响应之前设置 cookie
+Cookie::queue('key', 'value', 'minutes');
+// 忘记cookie
+Cookie::forget('key');
+// 发送带有响应的 cookie
+$response = Response::make('Hello World');
+// 将 cookie 添加到响应中
+$response->withCookie(Cookie::make('name', 'value', $minutes));
+```
+
+### UnitTest
+
+安装并运行
+
+```php
+// 添加到作曲家并更新:
+"phpunit/phpunit": "4.0.*"
+// 运行测试(从项目根目录)
+./vendor/bin/phpunit
+```
+
+断言
+
+```php
+$this->assertTrue(true);
+$this->assertEquals('foo', $bar);
+$this->assertCount(1,$times);
+$this->assertResponseOk();
+$this->assertResponseStatus(403);
+$this->assertRedirectedTo('foo');
+$this->assertRedirectedToRoute('route.name');
+$this->assertRedirectedToAction('Controller@method');
+$this->assertViewHas('name');
+$this->assertViewHas('age', $value);
+$this->assertSessionHasErrors();
+// 断言会话有给定键的错误...
+$this->assertSessionHasErrors('name');
+// 断言会话有几个键的错误...
+$this->assertSessionHasErrors(array('name', 'age'));
+$this->assertHasOldInput();
+```
+
+调用路由
+
+```php
+$response = $this->call($method, $uri, $parameters, $files, $server, $content);
+$response = $this->callSecure('GET', 'foo/bar');
+$this->session(['foo' => 'bar']);
+$this->flushSession();
+$this->seed();
+$this->seed($connection);
+```
+
+### Cache
+
+```php
+Cache::put('key', 'value', $minutes);
+Cache::add('key', 'value', $minutes);
+Cache::forever('key', 'value');
+Cache::remember('key', $minutes, function(){ return 'value' });
+Cache::rememberForever('key', function(){ return 'value' });
+Cache::forget('key');
+Cache::has('key');
+Cache::get('key');
+Cache::get('key', 'default');
+Cache::get('key', function(){ return 'default'; });
+Cache::tags('my-tag')->put('key','value', $minutes);
+Cache::tags('my-tag')->has('key');
+Cache::tags('my-tag')->get('key');
+Cache::tags('my-tag')->forget('key');
+Cache::tags('my-tag')->flush();
+Cache::increment('key');
+Cache::increment('key', $amount);
+Cache::decrement('key');
+Cache::decrement('key', $amount);
+Cache::section('group')->put('key', $value);
+Cache::section('group')->get('key');
+Cache::section('group')->flush();
+```
+
+### Session
+
+```php
+Session::get('key');
+// 从会话中返回一个项目
+Session::get('key', 'default');
+Session::get('key', function(){ return 'default'; });
+// 获取会话 ID
+Session::getId();
+// 在会话中放置一个键/值对
+Session::put('key', 'value');
+// 将值推送到会话中的数组中
+Session::push('foo.bar','value');
+// 返回会话中的所有项目
+Session::all();
+// 检查一个项目是否被定义
+Session::has('key');
+// 从会话中删除项目
+Session::forget('key');
+// 从会话中删除所有项目
+Session::flush();
+// 生成新的会话标识符
+Session::regenerate();
+// 将键/值对闪存到会话
+Session::flash('key', 'value');
+// 刷新所有会话闪存数据
+Session::reflash();
+// 刷新当前闪存数据的一个子集
+Session::keep(array('key1', 'key2'));
+```
+
+### Response
+
+```php
+return Response::make($contents);
+return Response::make($contents, 200);
+return Response::json(array('key' => 'value'));
+return Response::json(array('key' => 'value'))
+->setCallback(Input::get('callback'));
+return Response::download($filepath);
+return Response::download($filepath, $filename, $headers);
+// 创建响应并修改标头值
+$response = Response::make($contents, 200);
+$response->header('Content-Type', 'application/json');
+return $response;
+// 将 cookie 附加到响应
+return Response::make($content)
+->withCookie(Cookie::make('key', 'value'));
+```
+
+### Request
+
+
+```php
+// url: http://xx.com/aa/bb
+Request::url();
+// 路径:/aa/bb
+Request::path();
+// getRequestUri: /aa/bb/?c=d
+Request::getRequestUri();
+// 返回用户的IP
+Request::getClientIp();
+// getUri: http://xx.com/aa/bb/?c=d
+Request::getUri();
+// 获取查询字符串:c=d
+Request::getQueryString();
+// 获取请求的端口方案(例如 80、443 等)
+Request::getPort();
+// 确定当前请求 URI 是否与模式匹配
+Request::is('foo/*');
+// 从 URI 中获取一个段(基于 1 的索引)
+Request::segment(1);
+// 从请求中检索标头
+Request::header('Content-Type');
+// 从请求中检索服务器变量
+Request::server('PATH_INFO');
+// 确定请求是否是 AJAX 调用的结果
+Request::ajax();
+// 确定请求是否通过 HTTPS
+Request::secure();
+// 获取请求方法
+Request::method();
+// 检查请求方法是否为指定类型
+Request::isMethod('post');
+// 获取原始 POST 数据
+Request::instance()->getContent();
+// 获取请求的响应格式
+Request::format();
+// 如果 HTTP Content-Type 标头包含 */json,则为真
+Request::isJson();
+// 如果 HTTP Accept 标头是 application/json,则为真
+Request::wantsJson();
+```
+
+### Container
+
+```php
+App::bind('foo', function($app){ return new Foo; });
+App::make('foo');
+// 如果这个类存在,则返回
+App::make('FooBar');
+// 在容器中注册共享绑定
+App::singleton('foo', function(){ return new Foo; });
+// 将现有实例注册为在容器中共享
+App::instance('foo', new Foo);
+// 注册与容器的绑定
+App::bind('FooRepositoryInterface', 'BarRepository');
+// 使用应用程序注册服务提供商
+App::register('FooServiceProvider');
+// 监听对象分辨率
+App::resolving(function($object){});
+```
+
+### Redirect
+
+```php
+return Redirect::to('foo/bar');
+return Redirect::to('foo/bar')->with('key', 'value');
+return Redirect::to('foo/bar')->withInput(Input::get());
+return Redirect::to('foo/bar')->withInput(Input::except('password'));
+return Redirect::to('foo/bar')->withErrors($validator);
+// 创建对先前位置的新重定向响应
+return Redirect::back();
+// 创建对命名路由的新重定向响应
+return Redirect::route('foobar');
+return Redirect::route('foobar', array('value'));
+return Redirect::route('foobar', array('key' => 'value'));
+// 创建对控制器操作的新重定向响应
+return Redirect::action('FooController@index');
+return Redirect::action('FooController@baz', array('value'));
+return Redirect::action('FooController@baz', array('key' => 'value'));
+// 如果未定义预期的重定向,则默认为 foo/bar。
+return Redirect::intended('foo/bar');
+```
+
+### Security
+
+Hashing
+
+```php
+Hash::make('secretpassword');
+Hash::check('secretpassword', $hashedPassword);
+Hash::needsRehash($hashedPassword);
+```
+
+Encryption
+
+```php
+Crypt::encrypt('secretstring');
+Crypt::decrypt($encryptedString);
+Crypt::setMode('ctr');
+Crypt::setCipher($cipher);
+```
+
+### Queue
+
+```php
+Queue::push('SendMail', array('message' => $message));
+Queue::push('SendEmail@send', array('message' => $message));
+Queue::push(function($job) use $id {});
+// 多个工人的相同有效载荷
+Queue::bulk(array('SendEmail', 'NotifyUser'), $payload);
+```
+
+Starting the queue listener
+
+```bash
+php artisan queue:listen
+php artisan queue:listen connection
+php artisan queue:listen --timeout=60
+# 只处理队列中的第一个作业
+php artisan queue:work
+# 以守护进程模式启动一个队列工作者
+php artisan queue:work --daemon
+# 为失败的作业创建迁移文件
+php artisan queue:failed-table
+# 列出失败的工作
+php artisan queue:failed
+# 通过 id 删除失败的作业
+php artisan queue:forget 5
+# 删除所有失败的作业
+php artisan queue:flush
+```
+
+### View
+
+```php
+View::make('path/to/view');
+View::make('foo/bar')->with('key', 'value');
+View::make('foo/bar')->withKey('value');
+View::make('foo/bar', array('key' => 'value'));
+View::exists('foo/bar');
+// 在所有视图中共享一个值
+View::share('key', 'value');
+// 嵌套视图
+View::make('foo/bar')->nest('name', 'foo/baz', $data);
+// 注册视图编辑器
+View::composer('viewname', function($view){});
+// 向作曲家注册多个视图
+View::composer(array('view1', 'view2'), function($view){});
+// 注册作曲家类
+View::composer('viewname', 'FooComposer');
+View::creator('viewname', function($view){});
+```
+
+### Validation
+
+
+```php
+Validator::make(
+array('key' => 'Foo'),
+array('key' => 'required|in:Foo')
+);
+Validator::extend('foo', function($attribute, $value, $params){});
+Validator::extend('foo', 'FooValidator@validate');
+Validator::resolver(function($translator, $data, $rules, $msgs)
+{
+return new FooValidator($translator, $data, $rules, $msgs);
+});
+```
+
+#### Rules
+
+- accepted
+- active_url
+- after:YYYY-MM-DD
+- before:YYYY-MM-DD
+- alpha
+- alpha_dash
+- alpha_num
+- array
+- between:1,10
+- confirmed
+- date
+- date_format:YYYY-MM-DD
+- different:fieldname
+- digits:value
+- digits_between:min,max
+- boolean
+- email
+- exists:table,column
+- image
+- in:foo,bar,...
+- not_in:foo,bar,...
+- integer
+- numeric
+- ip
+- max:value
+- min:value
+- mimes:jpeg,png
+- regex:[0-9]
+- required
+- required_if:field,value
+- required_with:foo,bar,...
+- required_with_all:foo,bar,...
+- required_without:foo,bar,...
+- required_without_all:foo,bar,...
+- same:field
+- size:value
+- timezone
+- unique:table,column,except,idColumn
+- url
+
+
+### Form
+
+```php
+Form::open(array('url' => 'foo/bar', 'method' => 'PUT'));
+Form::open(array('route' => 'foo.bar'));
+Form::open(array('route' => array('foo.bar', $parameter)));
+Form::open(array('action' => 'FooController@method'));
+Form::open(array('action' => array('FooController@method', $parameter)));
+Form::open(array('url' => 'foo/bar', 'files' => true));
+Form::close();
+Form::token();
+Form::model($foo, array('route' => array('foo.bar', $foo->bar)));
+```
+
+#### Form Elements
+
+```php
+Form::label('id', 'Description');
+Form::label('id', 'Description', array('class' => 'foo'));
+Form::text('name');
+Form::text('name', $value);
+Form::text('name', $value, array('class' => 'name'));
+Form::textarea('name');
+Form::textarea('name', $value);
+Form::textarea('name', $value, array('class' => 'name'));
+Form::hidden('foo', $value);
+Form::password('password');
+Form::password('password', array('placeholder' => 'Password'));
+Form::email('name', $value, array());
+Form::file('name', array('class' => 'name'));
+Form::checkbox('name', 'value');
+// 生成一个被选中的复选框
+Form::checkbox('name', 'value', true, array('class' => 'name'));
+Form::radio('name', 'value');
+// 生成选定的无线电输入
+Form::radio('name', 'value', true, array('class' => 'name'));
+Form::select('name', array('key' => 'value'));
+Form::select('name', array('key' => 'value'), 'key', array('class' => 'name'));
+Form::selectRange('range', 1, 10);
+Form::selectYear('year', 2011, 2015);
+Form::selectMonth('month');
+Form::submit('Submit!', array('class' => 'name'));
+Form::button('name', array('class' => 'name'));
+Form::macro('fooField', function()
+{
+return '';
+});
+Form::fooField();
+```
+
+### String
+
+```php
+// 将 UTF-8 值音译为 ASCII
+Str::ascii($value)
+Str::camel($value)
+Str::contains($haystack, $needle)
+Str::endsWith($haystack, $needles)
+// 用给定值的单个实例来限制字符串。
+Str::finish($value, $cap)
+Str::is($pattern, $value)
+Str::length($value)
+Str::limit($value, $limit = 100, $end = '...')
+Str::lower($value)
+Str::words($value, $words = 100, $end = '...')
+Str::plural($value, $count = 2)
+// 生成更真实的“随机”字母数字字符串。
+Str::random($length = 16)
+// 生成“随机”字母数字字符串。
+Str::quickRandom($length = 16)
+Str::upper($value)
+Str::title($value)
+Str::singular($value)
+Str::slug($title, $separator = '-')
+Str::snake($value, $delimiter = '_')
+Str::startsWith($haystack, $needles)
+// 将值转换为大写大小写。
+Str::studly($value)
+Str::macro($name, $macro)
+```
+
+### Blade
+
+```php
+// 在模板中显示一个部分
+@yield('name')
+@extends('layout.name')
+// 开始一个部分
+@section('name')
+// 结束一段
+@stop
+// 结束一个部分并屈服
+@section('sidebar')
+@show
+@parent
+
+@include('view.name')
+@include('view.name', array('key' => 'value'));
+@lang('messages.name')
+@choice('messages.name', 1);
+
+@if
+@else
+@elseif
+@endif
+
+@unless
+@endunless
+
+@for
+@endfor
+
+@foreach
+@endforeach
+
+@while
+@endwhile
+
+// 预测 4.2 功能
+@forelse($users as $user)
+@empty
+@endforelse
+
+// Echo 内容
+{{ $var }}
+// Echo 转义内容
+{{{ $var }}}
+// Echo 未转义的内容; 5.0 功能
+{!! $var !!}
+{{-- Blade Comment --}}
+// 检查存在后 Echo 数据
+{{{ $name or 'Default' }}}
+// 显示带有花括号的原始文本
+@{{ This will not be processed by Blade }}
+```
+
+### HTML
+
+```php
+HTML::macro('name', function(){});
+// 将 HTML 字符串转换为实体
+HTML::entities($value);
+// 将实体转换为 HTML 字符
+HTML::decode($value);
+// 生成指向 JavaScript 文件的链接
+HTML::script($url, $attributes);
+// 生成指向 CSS 文件的链接
+HTML::style($url, $attributes);
+// 生成 HTML 图像元素
+HTML::image($url, $alt, $attributes);
+// 生成 HTML 链接
+HTML::link($url, 'title', $attributes, $secure);
+// 生成 HTTPS HTML 链接
+HTML::secureLink($url, 'title', $attributes);
+// 生成资产的 HTML 链接
+HTML::linkAsset($url, 'title', $attributes, $secure);
+// 生成指向资产的 HTTPS HTML 链接
+HTML::linkSecureAsset($url, 'title', $attributes);
+// 生成指向命名路由的 HTML 链接
+HTML::linkRoute($name, 'title', $parameters, $attributes);
+// 生成指向控制器操作的 HTML 链接
+HTML::linkAction($action, 'title', $parameters, $attributes);
+// 生成指向电子邮件地址的 HTML 链接
+HTML::mailto($email, 'title', $attributes);
+// 混淆电子邮件地址以防止垃圾邮件机器人嗅探它
+HTML::email($email);
+// 生成有序的项目列表
+HTML::ol($list, $attributes);
+// 生成一个未排序的项目列表
+HTML::ul($list, $attributes);
+// 创建一个列表 HTML 元素
+HTML::listing($type, $list, $attributes);
+// 为列表元素创建 HTML
+HTML::listingElement($key, $type, $value);
+// 为嵌套列表属性创建 HTML
+HTML::nestedListing($key, $type, $value);
+// 从数组构建 HTML 属性字符串
+HTML::attributes($attributes);
+// 构建单个属性元素
+HTML::attributeElement($key, $value);
+// 混淆字符串以防止垃圾邮件机器人嗅探它
+HTML::obfuscate($value);
+```
+
+DB
+---
+
+### 基本数据库使用
+
+```php
+DB::connection('connection_name');
+// 运行选择查询
+$results = DB::select('select * from users where id = ?', [1]);
+$results = DB::select('select * from users where id = :id', ['id' => 1]);
+// 运行一般声明
+DB::statement('drop table users');
+// 侦听查询事件
+DB::listen(function($sql, $bindings, $time){ code_here; });
+// 数据库事务
+DB::transaction(function()
+{
+ DB::table('users')->update(['votes' => 1]);
+ DB::table('posts')->delete();
+});
+DB::beginTransaction();
+DB::rollback();
+DB::commit();
+```
+
+
+### 查询生成器
+
+
+```php
+// 从表中检索所有行
+DB::table('name')->get();
+// 表中的分块结果
+DB::table('users')->chunk(100, function($users)
+{
+ foreach ($users as $user)
+ {
+//
+}
+});
+// 从表中检索单行
+$user = DB::table('users')->where('name', 'John')->first();
+DB::table('name')->first();
+// 从一行中检索单个列
+$name = DB::table('users')->where('name', 'John')->pluck('name');
+DB::table('name')->pluck('column');
+// 检索列值列表
+$roles = DB::table('roles')->lists('title');
+$roles = DB::table('roles')->lists('title', 'name');
+// 指定 Select 子句
+$users = DB::table('users')->select('name', 'email')->get();
+$users = DB::table('users')->distinct()->get();
+$users = DB::table('users')->select('name as user_name')->get();
+// 将 Select 子句添加到现有查询
+$query = DB::table('users')->select('name');
+$users = $query->addSelect('age')->get();
+// 使用 Where 运算符
+$users = DB::table('users')->where('votes', '>', 100)->get();
+$users = DB::table('users')
+ ->where('votes', '>', 100)
+ ->orWhere('name', 'John')
+ ->get();
+$users = DB::table('users')
+ ->whereBetween('votes', [1, 100])->get();
+$users = DB::table('users')
+ ->whereNotBetween('votes', [1, 100])->get();
+$users = DB::table('users')
+ ->whereIn('id', [1, 2, 3])->get();
+$users = DB::table('users')
+ ->whereNotIn('id', [1, 2, 3])->get();
+$users = DB::table('users')
+ ->whereNull('updated_at')->get();
+DB::table('name')->whereNotNull('column')->get();
+// 动态 Where 子句
+$admin = DB::table('users')->whereId(1)->first();
+$john = DB::table('users')
+ ->whereIdAndEmail(2, 'john@doe.com')
+ ->first();
+$jane = DB::table('users')
+ ->whereNameOrAge('Jane', 22)
+ ->first();
+// 排序依据、分组依据和拥有
+$users = DB::table('users')
+ ->orderBy('name', 'desc')
+ ->groupBy('count')
+ ->having('count', '>', 100)
+ ->get();
+DB::table('name')->orderBy('column')->get();
+DB::table('name')->orderBy('column','desc')->get();
+DB::table('name')->having('count', '>', 100)->get();
+// 偏移和限制
+$users = DB::table('users')->skip(10)->take(5)->get();
+```
+
+### Joins
+
+基本加入声明
+
+```php
+DB::table('users')
+ ->join('contacts', 'users.id', '=', 'contacts.user_id')
+ ->join('orders', 'users.id', '=', 'orders.user_id')
+ ->select('users.id', 'contacts.phone', 'orders.price')
+ ->get();
+```
+
+左连接语句
+
+```php
+DB::table('users')
+ ->leftJoin('posts', 'users.id', '=', 'posts.user_id')
+ ->get();
+// select * from name = 'John' or (votes > 100 and title <> 'Admin')
+DB::table('users')
+ ->where('name', '=', 'John')
+ ->orWhere(function($query)
+ {
+ $query->where('votes', '>', 100)
+ ->where('title', '<>', 'Admin');
+ })
+ ->get();
+```
+
+### Aggregates
+
+```php
+$users = DB::table('users')->count();
+$price = DB::table('orders')->max('price');
+$price = DB::table('orders')->min('price');
+$price = DB::table('orders')->avg('price');
+$total = DB::table('users')->sum('votes');
+
+DB::table('name')->remember(5)->get();
+DB::table('name')->remember(5, 'cache-key-name')->get();
+DB::table('name')->cacheTags('my-key')->remember(5)->get();
+DB::table('name')
+ ->cacheTags(array('my-first-key','my-second-key'))
+ ->remember(5)
+ ->get();
+```
+
+### 原始表达式
+
+```php
+$users = DB::table('users')
+ ->select(DB::raw('count(*) as user_count, status'))
+ ->where('status', '<>', 1)
+ ->groupBy('status')
+ ->get();
+// 返回行
+DB::select('select * from users where id = ?', array('value'));
+// 返回 nr 个受影响的行
+DB::insert('insert into foo set bar=2');
+DB::update('update foo set bar=2');
+DB::delete('delete from bar');
+// 返回无效
+DB::statement('update foo set bar=2');
+// 语句中的原始表达式
+DB::table('name')
+ ->select(DB::raw('count(*) as count, column2'))
+ ->get();
+```
+
+### Inserts 插入
+
+```php
+DB::table('users')->insert(
+ ['email' => 'john@example.com', 'votes' => 0]
+);
+$id = DB::table('users')->insertGetId(
+ ['email' => 'john@example.com', 'votes' => 0]
+);
+DB::table('users')->insert([
+ ['email' => 'taylor@example.com', 'votes' => 0],
+ ['email' => 'dayle@example.com', 'votes' => 0]
+]);
+```
+
+### Updates 更新
+
+```php
+DB::table('users')
+ ->where('id', 1)
+ ->update(['votes' => 1]);
+DB::table('users')->increment('votes');
+DB::table('users')->increment('votes', 5);
+DB::table('users')->decrement('votes');
+DB::table('users')->decrement('votes', 5);
+DB::table('users')->increment('votes', 1, ['name' => 'John']);
+```
+
+### Deletes 删除
+
+```php
+DB::table('users')->where('votes', '<', 100)->delete();
+DB::table('users')->delete();
+DB::table('users')->truncate();
+```
+
+### Unions 联合
+
+
+```php
+// unionAll() 方法也可用,并且具有与 union 相同的方法签名
+$first = DB::table('users')->whereNull('first_name');
+$users = DB::table('users')->whereNull('last_name')->union($first)->get();
+// Pessimistic Locking 悲观锁定
+DB::table('users')->where('votes', '>', 100)->sharedLock()->get();
+DB::table('users')->where('votes', '>', 100)->lockForUpdate()->get();
+```
+
+Input
+---
+
+### Input
+
+```php
+Input::get('key');
+// 如果密钥丢失则默认
+Input::get('key', 'default');
+Input::has('key');
+Input::all();
+// 获取输入时仅检索“foo”和“bar”
+Input::only('foo', 'bar');
+// 获取输入时忽略“foo”
+Input::except('foo');
+Input::flush();
+```
+
+### Session Input (flash)
+
+```php
+// 会话的闪存输入
+Input::flash();
+// 只闪烁会话的一些输入
+Input::flashOnly('foo', 'bar');
+// 只闪烁会话的一些输入
+Input::flashExcept('foo', 'baz');
+// 检索旧输入项
+Input::old('key','default_value');
+```
+
+### Files
+
+```php
+// 使用已上传的文件
+Input::file('filename');
+// 判断文件是否上传
+Input::hasFile('filename');
+// 访问文件属性
+Input::file('name')->getRealPath();
+Input::file('name')->getClientOriginalName();
+Input::file('name')->getClientOriginalExtension();
+Input::file('name')->getSize();
+Input::file('name')->getMimeType();
+// 移动上传的文件
+Input::file('name')->move($destinationPath);
+// 移动上传的文件
+Input::file('name')->move($destinationPath, $fileName);
+```
+
+路由
+---
+
+### Route
+
+```php
+Route::get('foo', function(){});
+Route::get('foo', 'ControllerName@function');
+Route::controller('foo', 'FooController');
+```
+
+
+### RESTful 控制器
+
+```php
+Route::resource('posts','PostsController');
+// 指定要在路线上处理的动作子集
+Route::resource('photo', 'PhotoController',['only' => ['index', 'show']]);
+Route::resource('photo', 'PhotoController',['except' => ['update', 'destroy']]);
+```
+
+
+### 触发错误
+
+```php
+App::abort(404);
+$handler->missing(...) in ErrorServiceProvider::boot();
+
+throw new NotFoundHttpException;
+```
+
+
+### 路由参数
+
+```php
+Route::get('foo/{bar}', function($bar){});
+Route::get('foo/{bar?}', function($bar = 'bar'){});
+```
+
+
+### HTTP 动词
+
+
+```php
+Route::any('foo', function(){});
+Route::post('foo', function(){});
+Route::put('foo', function(){});
+Route::patch('foo', function(){});
+Route::delete('foo', function(){});
+// RESTful 动作
+Route::resource('foo', 'FooController');
+// 为多个动词注册一个路由
+Route::match(['get', 'post'], '/', function(){});
+```
+
+
+### Secure Routes(TBD)
+
+```php
+Route::get('foo', array('https', function(){}));
+```
+
+
+### 路由约束
+
+```php
+Route::get('foo/{bar}', function($bar){})
+->where('bar', '[0-9]+');
+Route::get('foo/{bar}/{baz}', function($bar, $baz){})
+->where(array('bar' => '[0-9]+', 'baz' => '[A-Za-z]'))
+
+// 设置跨路线使用的模式
+Route::pattern('bar', '[0-9]+')
+```
+
+
+### HTTP 中间件
+
+```php
+// 为路由分配中间件
+Route::get('admin/profile', ['middleware' => 'auth', function(){}]);
+```
+
+
+### 命名路由
+
+
+```php
+Route::currentRouteName();
+Route::get('foo/bar', array('as' => 'foobar', function(){}));
+Route::get('user/profile', [
+ 'as' => 'profile', 'uses' => 'UserController@showProfile'
+]);
+$url = route('profile');
+$redirect = redirect()->route('profile');
+```
+
+
+### 路由前缀
+
+
+```php
+Route::group(['prefix' => 'admin'], function()
+{
+ Route::get('users', function(){
+ return 'Matches The "/admin/users" URL';
+ });
+});
+```
+
+
+### 路由命名空间
+
+```php
+// 该路由组将携带命名空间“Foo\Bar”
+Route::group(array('namespace' => 'Foo\Bar'), function(){})
+```
+
+
+### 子域路由
+
+```php
+// {sub} 将被传递给闭包
+Route::group(array('domain' => '{sub}.example.com'), function(){});
+```
+
+
+Model
+----
+
+### 基本用法
+
+```php
+// 定义 Eloquent 模型
+class User extends Model {}
+// 生成 Eloquent 模型
+php artisan make:model User
+// 指定自定义表名
+class User extends Model {
+ protected $table = 'my_users';
+}
+```
+
+### More
+
+
+```php
+Model::create(array('key' => 'value'));
+// 按属性查找第一个匹配记录或创建
+Model::firstOrCreate(array('key' => 'value'));
+// 按属性查找第一条记录或实例化
+Model::firstOrNew(array('key' => 'value'));
+// 创建或更新匹配属性的记录,并填充值
+Model::updateOrCreate(array('search_key' => 'search_value'), array('key' => 'value'));
+// 用属性数组填充模型,注意批量赋值!
+Model::fill($attributes);
+Model::destroy(1);
+Model::all();
+Model::find(1);
+// 使用双主键查找
+Model::find(array('first', 'last'));
+// 如果查找失败则抛出异常
+Model::findOrFail(1);
+// 使用双主键查找并在查找失败时抛出异常
+Model::findOrFail(array('first', 'last'));
+Model::where('foo', '=', 'bar')->get();
+Model::where('foo', '=', 'bar')->first();
+// 动态的
+Model::whereFoo('bar')->first();
+// 如果查找失败则抛出异常
+Model::where('foo', '=', 'bar')->firstOrFail();
+Model::where('foo', '=', 'bar')->count();
+Model::where('foo', '=', 'bar')->delete();
+// 输出原始查询
+Model::where('foo', '=', 'bar')->toSql();
+Model::whereRaw('foo = bar and cars = 2', array(20))->get();
+Model::remember(5)->get();
+Model::remember(5, 'cache-key-name')->get();
+Model::cacheTags('my-tag')->remember(5)->get();
+Model::cacheTags(array('my-first-key','my-second-key'))->remember(5)->get();
+Model::on('connection-name')->find(1);
+Model::with('relation')->get();
+Model::all()->take(10);
+Model::all()->skip(10);
+// 默认 Eloquent 排序方兴未艾
+Model::all()->orderBy('column');
+Model::all()->orderBy('column','desc');
+```
+
+### Soft Delete
+
+```php
+Model::withTrashed()->where('cars', 2)->get();
+// 在结果中包含软删除模型
+Model::withTrashed()->where('cars', 2)->restore();
+Model::where('cars', 2)->forceDelete();
+// 强制结果集只包含软删除
+Model::onlyTrashed()->where('cars', 2)->get();
+```
+
+### Events
+
+```php
+Model::creating(function($model){});
+Model::created(function($model){});
+Model::updating(function($model){});
+Model::updated(function($model){});
+Model::saving(function($model){});
+Model::saved(function($model){});
+Model::deleting(function($model){});
+Model::deleted(function($model){});
+Model::observe(new FooObserver);
+```
+
+### Eloquent Configuration
+
+```php
+// 禁止从模型插入和更新中抛出批量分配异常
+Eloquent::unguard();
+// 启用任何抛出批量分配异常的能力
+Eloquent::reguard();
+```
+
+Schema
+---
+
+### Schema
+
+
+```php
+// 表示需要创建表
+Schema::create('table', function($table)
+{
+ $table->increments('id');
+});
+// 指定连接
+Schema::connection('foo')->create('table', function($table){});
+// 将表重命名为给定名称
+Schema::rename($from, $to);
+// 表示应该删除该表
+Schema::drop('table');
+// 指示如果表存在则应将其删除
+Schema::dropIfExists('table');
+// 确定给定表是否存在
+Schema::hasTable('table');
+// 确定给定表是否具有给定列
+Schema::hasColumn('table', 'column');
+// 更新现有表
+Schema::table('table', function($table){});
+// 指示应重命名给定的列
+$table->renameColumn('from', 'to');
+// 指示应删除给定的列
+$table->dropColumn(string|array);
+// 应该用于表的存储引擎
+$table->engine = 'InnoDB';
+// 仅适用于 MySQL
+$table->string('name')->after('email');
+```
+
+### Indexes
+
+
+```php
+$table->string('column')->unique();
+$table->primary('column');
+// 创建双主键
+$table->primary(array('first', 'last'));
+$table->unique('column');
+$table->unique('column', 'key_name');
+// 创建双唯一索引
+$table->unique(array('first', 'last'));
+$table->unique(array('first', 'last'), 'key_name');
+$table->index('column');
+$table->index('column', 'key_name');
+// 创建双索引
+$table->index(array('first', 'last'));
+$table->index(array('first', 'last'), 'key_name');
+$table->dropPrimary('table_column_primary');
+$table->dropUnique('table_column_unique');
+$table->dropIndex('table_column_index');
+```
+
+### Foreign Keys
+
+```php
+$table->foreign('user_id')->references('id')->on('users');
+$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'|'restrict'|'set null'|'no action');
+$table->foreign('user_id')->references('id')->on('users')->onUpdate('cascade'|'restrict'|'set null'|'no action');
+$table->dropForeign('posts_user_id_foreign');
+```
+
+### 列类型 - 增量
+
+```php
+$table->increments('id');
+$table->bigIncrements('id');
+```
+
+### 列类型 - 字符串和文本
+
+```php
+$table->char('name', 4);
+$table->string('email');
+$table->string('name', 100);
+$table->text('description');
+$table->mediumText('description');
+$table->longText('description');
+```
+
+### 列类型 - 数字
+
+```php
+$table->integer('votes');
+$table->tinyInteger('votes');
+$table->smallInteger('votes');
+$table->mediumInteger('votes');
+$table->bigInteger('votes');
+$table->float('amount');
+$table->double('column', 15, 8);
+$table->decimal('amount', 5, 2);
+```
+
+### 列类型 - 日期和时间
+
+```php
+$table->date('created_at');
+$table->dateTime('created_at');
+$table->time('sunrise');
+$table->timestamp('added_on');
+```
+
+### 列类型 - 添加 created_at 和 updated_at 列
+
+```php
+$table->timestamps();
+$table->nullableTimestamps();
+```
+
+### 列类型 - 其他
+
+
+```php
+$table->binary('data');
+$table->boolean('confirmed');
+// 为软删除添加 deleted_at 列
+$table->softDeletes();
+$table->enum('choices', array('foo', 'bar'));
+// 添加 remember_token 作为 VARCHAR(100) NULL
+$table->rememberToken();
+// 添加 INTEGER parent_id 和 STRING parent_type
+$table->morphs('parent');
+->nullable()
+->default($value)
+->unsigned()
+```
+
+Mail
+---
+
+### Mail
+
+```php
+Mail::send('email.view', $data, function($message){});
+Mail::send(array('html.view', 'text.view'), $data, $callback);
+Mail::queue('email.view', $data, function($message){});
+Mail::queueOn('queue-name', 'email.view', $data, $callback);
+Mail::later(5, 'email.view', $data, function($message){});
+// 将所有电子邮件写入日志而不是发送
+Mail::pretend();
+```
+
+### Messages
+
+
+```php
+// 这些可以用在传递给 Mail::send() 或 Mail::queue() 的 $message 实例上
+$message->from('email@example.com', 'Mr. Example');
+$message->sender('email@example.com', 'Mr. Example');
+$message->returnPath('email@example.com');
+$message->to('email@example.com', 'Mr. Example');
+$message->cc('email@example.com', 'Mr. Example');
+$message->bcc('email@example.com', 'Mr. Example');
+$message->replyTo('email@example.com', 'Mr. Example');
+$message->subject('Welcome to the Jungle');
+$message->priority(2);
+$message->attach('foo\bar.txt', $options);
+// 这使用内存中的数据作为附件
+$message->attachData('bar', 'Data Name', $options);
+// 在消息中嵌入文件并获取 CID
+$message->embed('foo\bar.txt');
+$message->embedData('foo', 'Data Name', $options);
+// 获取底层的 Swift Message 实例
+$message->getSwiftMessage();
+```
+
+Auth
+---
+
+### Authentication
+
+```php
+// 判断当前用户是否通过认证
+Auth::check();
+// 获取当前认证的用户
+Auth::user();
+// 获取当前认证用户的ID
+Auth::id();
+// 尝试使用给定的凭据对用户进行身份验证
+Auth::attempt(array('email' => $email, 'password' => $password));
+// 通过将 true 传递给 Auth::attempt() 来“记住我”
+Auth::attempt($credentials, true);
+// 登录一个请求
+Auth::once($credentials);
+// 将用户登录到应用程序
+Auth::login(User::find(1));
+// 将给定的用户 ID 登录到应用程序中
+Auth::loginUsingId(1);
+// 从应用程序中注销用户
+Auth::logout();
+// 验证用户的凭据
+Auth::validate($credentials);
+// 尝试使用 HTTP Basic Auth 进行身份验证
+Auth::basic('username');
+// 执行无状态 HTTP 基本登录尝试
+Auth::onceBasic();
+// 向用户发送密码提醒
+Password::remind($credentials, function($message, $user){});
+```
+
+### Authorization
+
+
+```php
+// 定义能力
+Gate::define('update-post', 'Class@method');
+Gate::define('update-post', function ($user, $post) {...});
+// 传递多个参数
+Gate::define('delete-comment', function ($user, $post, $comment) {});
+
+// 检查能力
+Gate::denies('update-post', $post);
+Gate::allows('update-post', $post);
+Gate::check('update-post', $post);
+// 指定一个用户进行检查
+Gate::forUser($user)->allows('update-post', $post);
+// 通过 User 模型,使用 Authorizable trait
+User::find(1)->can('update-post', $post);
+User::find(1)->cannot('update-post', $post);
+
+// 拦截授权检查
+Gate::before(function ($user, $ability) {});
+Gate::after(function ($user, $ability) {});
+
+// 在 Blade 模板中检查
+@can('update-post', $post)
+@endcan
+// with else
+@can('update-post', $post)
+@else
+@endcan
+
+// 生成策略
+php artisan make:policy PostPolicy
+// `policy` 辅助函数
+policy($post)->update($user, $post)
+
+// 控制器授权
+$this->authorize('update', $post);
+// for $user
+$this->authorizeForUser($user, 'update', $post);
+```
+
+Helper
+---
+
+### Arrays
+
+
+```php
+// 将给定的键/值对添加到数组中,如果
+// 数组中不存在给定的键
+array_add($array, 'key', 'value');
+// 将数组的数组折叠成一个数组
+array_collapse($array);
+// 将一个数组分成两个数组。一个有键,另一个有值
+array_divide($array);
+// 用点展平多维关联数组
+array_dot($array);
+// 获取所有给定的数组,除了指定的项目数组
+array_except($array, array('key'));
+// 返回数组中通过给定真值测试的第一个元素
+array_first($array, function($key, $value){}, $default);
+// 从数组中剥离键
+array_flatten($array);
+// 使用“点”表示法从给定数组中删除一个或多个数组项
+array_forget($array, 'foo');
+// 点符号
+array_forget($array, 'foo.bar');
+// 使用“点”表示法从数组中获取项目
+array_get($array, 'foo', 'default');
+array_get($array, 'foo.bar', 'default');
+// 使用“点”表示法检查给定项是否存在于数组中
+array_has($array, 'products.desk');
+// 从给定数组中获取项目的子集
+array_only($array, array('key'));
+// 返回键数组 => 值
+array_pluck($array, 'key');
+// 从数组中返回并删除“key”
+array_pull($array, 'key');
+// 使用“点”表示法将数组项设置为给定值
+array_set($array, 'key', 'value');
+// 点符号
+array_set($array, 'key.subkey', 'value');
+// 根据给定闭包的结果对数组进行排序
+array_sort($array, function(){});
+// 使用 sort 函数对数组进行递归排序
+array_sort_recursive();
+// 使用给定的闭包过滤数组
+array_where();
+// 数组的第一个元素
+head($array);
+// 数组的最后一个元素
+last($array);
+```
+
+### Paths
+
+```php
+// 应用程序目录的完全限定路径
+app_path();
+// 获取公共文件夹的路径
+base_path();
+// 应用程序配置目录的完全限定路径
+config_path();
+// 应用程序数据库目录的完全限定路径
+database_path();
+// 获取版本控制的 Elixir 文件的路径:
+elixir();
+// 公共目录的完全限定路径
+public_path();
+// 获取存储文件夹的路径
+storage_path();
+```
+
+### Miscellaneous
+
+
+```php
+// 验证器实例(Auth)
+auth()->user();
+// 生成对用户先前位置的重定向响应
+back();
+// 使用 Bcrypt (Hash) 散列给定值
+bcrypt('my-secret-password');
+// 从提供的项目创建一个集合实例
+collect(['taylor', 'abigail']);
+// 获取配置变量的值
+config('app.timezone', $default);
+// 生成包含 CSRF 令牌值的 HTML 隐藏输入字段
+{!! csrf_field() !!}
+// 检索当前 CSRF 令牌的值
+$token = csrf_token();
+// 转储给定的变量并结束脚本的执行
+dd($value);
+// 获取环境变量的值或返回默认值
+$env = env('APP_ENV');
+$env = env('APP_ENV', 'production');
+// 将给定事件分派给它的侦听器:
+event(new UserRegistered($user));
+// 为给定类创建模型工厂构建器
+$user = factory(App\User::class)->make();
+// 生成一个 HTML 隐藏输入字段,其中包含表单的 HTTP 谓词的欺骗值
+{!! method_field('delete') !!}
+// 检索闪存到会话中的旧输入值
+$value = old('value');
+$value = old('value', 'default');
+// 返回重定向器的实例以进行重定向:
+return redirect('/home');
+// 返回当前请求实例或获取输入项
+$value = request('key', $default = null)
+// 创建响应实例或获取响应工厂的实例
+return response('Hello World', 200, $headers);
+// 用于获取/设置会话值
+$value = session('key');
+$value = session()->get('key');
+session()->put('key', $value);
+// 将简单地返回给定的值。
+value(function(){ return 'bar'; });
+// 检索视图实例
+return view('auth.login');
+// 返回给定的值
+$value = with(new Foo)->work();
+```
+
+### Strings
+
+```php
+// 将值转换为驼峰大小写
+camel_case($value);
+// 获取给定对象/类的类“basename”
+class_basename($class);
+// 转义字符串
+e('');
+// 确定给定字符串是否以给定子字符串开头
+starts_with('Foo bar.', 'Foo');
+// 确定给定字符串是否以给定子字符串结尾
+ends_with('Foo bar.', 'bar.');
+// 将字符串转换为蛇形大小写
+snake_case('fooBar');
+// 限制字符串中的字符数
+str_limit();
+// 确定给定的字符串是否包含给定的子字符串
+str_contains('Hello foo bar.', 'foo');
+// 结果:foo/bar/
+str_finish('foo/bar', '/');
+str_is('foo*', 'foobar');
+str_plural('car');
+str_random(25);
+str_singular('cars');
+str_slug("Laravel 5 Framework", "-");
+// 结果:FooBar
+studly_case('foo_bar');
+trans('foo.bar');
+trans_choice('foo.bar', $count);
+```
+
+### URLs and Links
+
+```php
+action('FooController@method', $parameters);
+// HTML Link
+asset('img/photo.jpg', $title, $attributes);
+// HTTPS link
+secure_asset('img/photo.jpg', $title, $attributes);
+route($route, $parameters, $absolute = true);
+url('path', $parameters = array(), $secure = null);
+```
+
+另见
+---
+
+- [Laravel 官网地址](https://laravel.com/)
+- [Laravel 8 Cheat Sheet](https://learninglaravel.net/cheatsheet/#)
diff --git a/scripts/assets/laravel.svg b/scripts/assets/laravel.svg
new file mode 100644
index 0000000..c6b996b
--- /dev/null
+++ b/scripts/assets/laravel.svg
@@ -0,0 +1,3 @@
+
diff --git a/scripts/js/main.js b/scripts/js/main.js
index c0dd32e..e6e19fc 100644
--- a/scripts/js/main.js
+++ b/scripts/js/main.js
@@ -132,7 +132,7 @@ function searchResult(value) {
}
let menuHTML = '';
result.forEach((item, idx) => {
- const label = item.item.name.replace(getValueReg(value), (txt) => {
+ const label = (item.item.name || '').replace(getValueReg(value), (txt) => {
return `${txt}`;
})
const tags = (item.item.tags || []).join(',').replace(getValueReg(value), (txt) => {