Laravel 编码技巧 其他

2023-02-16 17:10 更新

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,你可以把一些你不想看见的路由过滤掉。

原始 Pull Request

使用 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 [命令]


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号