Laravel 编码技巧 其他
localhost 配置
不要忘记将 .env
文件中的 app_url
从 http://localhost
中改为真实的 URL,因为它将是你电子邮件通知和其他地方的任何链接的基础。
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:9PHz3TL5C4YrdV6Gg/Xkkmx9btaE93j7rQTUZWm2MqU=
APP_DEBUG=true
APP_URL=http://localhost
当运行 (不运行)”composer update”
不是关于 Laravel ,而是… 永远不要在生产服务器上运行 composer update
,它很慢,会 “破坏” 存储库。始终在你电脑上本地运行 composer update
,将新的 composer.lock
提交到存储库,然后再在生产服务器运行 composer install
。
Composer 检查新版本
如果你想找出 composer.json
包中已经发布的较新版本,直接运行 composer outdated
。你会得到一个包含所有信息的完整列表,如下所示。
phpdocumentor/type-resolver 0.4.0 0.7.1
phpunit/php-code-coverage 6.1.4 7.0.3 Library that provides collection, processing, and rende...
phpunit/phpunit 7.5.9 8.1.3 The PHP Unit Testing framework.
ralouphie/getallheaders 2.0.5 3.0.3 A polyfill for getallheaders.
sebastian/global-state 2.0.0 3.0.0 Snapshotting of global state
自动大写翻译
在翻译文件中(resources/lang
),你不仅可以指定变量为 :variable
,也可以指定大写为 :VARIABLE
或 :Variable
,然后你传递的值也会自动大写。
// 翻译配置路径:resources/lang/en/messages.php
'welcome' => 'Welcome, :Name'
// 返回结果:"Welcome, Taylor"
echo __('messages.welcome', ['name' => 'taylor']);
仅含小时的 Carbon
如果你想有当前日期不包含秒或者分钟,用定时器的方法比如:setSeconds(0)
或者 setMinutes(0)
。
// 2020-04-20 08:12:34
echo now();
// 2020-04-20 08:12:00
echo now()->setSeconds(0);
// 2020-04-20 08:00:00
echo now()->setSeconds(0)->setMinutes(0);
// 另外一种更短的方式
// 2020-04-20 08:00:00
echo now()->startOfHour();
单动作控制器
如果你想创建一个只有一个动作的控制器,你可以使用 __invoke()
方法创建「可调用(invokable)」控制器。
路由:
Route::get('user/{id}', 'ShowProfile');
Artisan 命令:
php artisan make:controller ShowProfile --invokable
控制器:
class ShowProfile extends Controller
{
public function __invoke($id)
{
return view('user.profile', [
'user' => User::findOrFail($id)
]);
}
}
重定向到特定的控制器方法
你不仅可以跳转 redirect()
到 URL 或特定的路由,而且可以跳转到一个特定的控制器里的特定方法,甚至向其传递参数。像这样:
return redirect()->action('SomeController@method', ['param' => $value]);
使用旧版本的 Laravel
如果你想用旧版本而非新版本的 Laravel,使用这个命令:
composer create-project --prefer-dist laravel/laravel project "7.*"
将 7.* 更改为任何你想要的版本。
为分页链接添加参数
在默认的分页链接中,你可以传递其他参数,保留原始的查询字符串,甚至指向一个特定的 #xxxxx
锚点。
{{ $users->appends(['sort' => 'votes'])->links() }}
{{ $users->withQueryString()->links() }}
{{ $users->fragment('foo')->links() }}
可重复回调函数
如果你有一个需要多次重复调用的回调函数,你可以将其声明在一个变量中,然后反复使用它。
$userCondition = function ($query) {
$query->where('user_id', auth()->id());
};
// 获取该用户包含有评论的文章
// 返回该用户的评论
$articles = Article::with(['comments' => $userCondition])
->whereHas('comments', $userCondition)
->get();
请求:查看多个参数 hasAny
你不仅可以使用 $request->has()
方法来查看一个参数,而且可以使用 $request->hasAny()
来查看传入的多个参数。
public function store(Request $request)
{
if ($request->hasAny(['api_key', 'token'])) {
echo '我们传入了api_key';
} else {
echo '缺少认证必要参数';
}
}
简单分页组件
在分页组件中,如果你只需要「上一页 / 下一页」的链接,而不是需要所有页码,也因此可以使用更少的数据库查询,你只需要将 paginate()
更改为 simplePaginate()
。
// 全部页码的分页组件
$users = User::paginate(10);
// 或者你可以这样做
$users = User::simplePaginate(10);
获取数据的方法
如果你有一个具有复杂数据结构的数组,例如带对象嵌套的数组,你可以使用 data_get()
助手函数配合通配符和「点」符号,来从嵌套数组或对象中检索值。
// 我们有如下数组
[
0 =>
['user_id' =>'用户id1', 'created_at' => '时间戳1', 'product' => {object Product}, ...],
1 =>
['user_id' =>'用户id2', 'created_at' => '时间戳2', 'product' => {object Product}, ...],
2 => ...
]
// 现在我们想要获取其中全部的产品id,我们可以这样写:
data_get($yourArray, '*.product.id');
// 这样我们就获取了全部的产品 id [1, 2, 3, 4, 5, ...]
Blade 指令增加真 / 假条件
Laravel 8.51 新增 @class
指令,用于添加控制 CSS 类的真 / 假条件。可以在此文档中了解更多。
之前:
<div class="@if ($active) underline @endif">`
现在:
<div @class(['underline' => $active])>
@php
$isActive = false;
$hasError = true;
@endphp
<span @class([
'p-4',
'font-bold' => $isActive,
'text-gray-500' => ! $isActive,
'bg-red' => $hasError,
])></span>
<span class="p-4 text-gray-500 bg-red"></span>
作业允许脱离队列
在文档中,「作业」是在「队列」章节进行讨论的,但是你可以脱离队列来使用「作业」,就像传统的委托任务的类一样。只需在控制器中调用 $this->dispatchNow()
即可。
public function approve(Article $article)
{
//
$this->dispatchNow(new ApproveArticle($article));
//
}
在工厂类或 seeders 外部使用 Faker
如果你想要生成一些假数据,你可以在模型工厂或 Seeds 中,甚至任何类的外部使用 Faker
。
注意:要在生产模式 production 中使用它的话,你需要在 composer.json
中,将 faker
从 "require-dev"
移动到 "require"
中。
use Faker;
class WhateverController extends Controller
{
public function whatever_method()
{
$faker = Faker\Factory::create();
$address = $faker->streetAddress;
}
}
可以定时执行的事情
你可以让一些事情以每小时、每天,或是其他时间模式执行。
你可以安排 artisan 命令、作业类、可调用类、回调函数、甚至是 shell 脚本去定时执行。
use App\Jobs\Heartbeat;
$schedule->job(new Heartbeat)->everyFiveMinutes();
$schedule->exec('node /home/forge/script.js')->daily();
use App\Console\Commands\SendEmailsCommand;
$schedule->command('emails:send Taylor --force')->daily();
$schedule->command(SendEmailsCommand::class, ['Taylor', '--force'])->daily();
protected function schedule(Schedule $schedule)
{
$schedule->call(function () {
DB::table('recent_users')->delete();
})->daily();
}
检索 Laravel 文档
如果你想使用一些关键词来检索 Laravel 文档,默认情况下只会给出 5 个结果。或许还能给出更多结果。
如果你想要看全部的结果,你可以前往 Laravel 文档 的 Github 仓库 直接搜索。
过滤 route:list
Laravel 8.34 新增: php artisan route:list
获得了新的参数 --except-path
,你可以把一些你不想看见的路由过滤掉。
使用 Blade 指令
如果你在不同的 Blade 文件中格式化数据,可以尝试创建自己的 Blade 指令。
下面这一段是来自 Laravel Cashier 包的例子:
"require": {
"laravel/cashier": "^12.9",
}
public function boot()
{
Blade::directive('money', function ($expression) {
return "<?php echo Laravel\Cashier\Cashier::formatAmount($expression, config('cashier.currency')); ?>";
});
}
<div>Price: @money($book->price)</div>
@if($book->discount_price)
<div>Discounted price: @money($book->dicount_price)</div>
@endif
Artisan 命令帮助
如果您不确定某些 Artisan 命令的参数,或者您想知道可用的参数,只需键入 php artisan help [命令]
。
更多建议: