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/#)