Laravel 編碼技巧 其他

2023-02-16 17:10 更新

localhost 配置

不要忘記將 .env 文件中的 app_url 從 http://localhost 中改為真實(shí)的 URL,因?yàn)樗鼘⑹悄汶娮余]件通知和其他地方的任何鏈接的基礎(chǔ)。

APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:9PHz3TL5C4YrdV6Gg/Xkkmx9btaE93j7rQTUZWm2MqU=
APP_DEBUG=true
APP_URL=http://localhost

當(dāng)運(yùn)行 (不運(yùn)行)”composer update”

不是關(guān)于 Laravel ,而是… 永遠(yuǎn)不要在生產(chǎn)服務(wù)器上運(yùn)行 composer update ,它很慢,會(huì) “破壞” 存儲(chǔ)庫(kù)。始終在你電腦上本地運(yùn)行 composer update ,將新的 composer.lock 提交到存儲(chǔ)庫(kù),然后再在生產(chǎn)服務(wù)器運(yùn)行 composer install。

Composer 檢查新版本

如果你想找出 composer.json 包中已經(jīng)發(fā)布的較新版本,直接運(yùn)行 composer outdated。你會(huì)得到一個(gè)包含所有信息的完整列表,如下所示。

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

自動(dòng)大寫翻譯

在翻譯文件中(resources/lang),你不僅可以指定變量為 :variable ,也可以指定大寫為 :VARIABLE 或 :Variable ,然后你傳遞的值也會(huì)自動(dòng)大寫。

// 翻譯配置路徑:resources/lang/en/messages.php
'welcome' => 'Welcome, :Name'

// 返回結(jié)果:"Welcome, Taylor"
echo __('messages.welcome', ['name' => 'taylor']);

僅含小時(shí)的 Carbon

如果你想有當(dāng)前日期不包含秒或者分鐘,用定時(shí)器的方法比如: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();

單動(dòng)作控制器

如果你想創(chuàng)建一個(gè)只有一個(gè)動(dòng)作的控制器,你可以使用 __invoke() 方法創(chuàng)建「可調(diào)用(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)
        ]);
    }
}

重定向到特定的控制器方法

你不僅可以跳轉(zhuǎn) redirect() 到 URL 或特定的路由,而且可以跳轉(zhuǎn)到一個(gè)特定的控制器里的特定方法,甚至向其傳遞參數(shù)。像這樣:

return redirect()->action('SomeController@method', ['param' => $value]);

使用舊版本的 Laravel

如果你想用舊版本而非新版本的 Laravel,使用這個(gè)命令:

composer create-project --prefer-dist laravel/laravel project "7.*"

將 7.* 更改為任何你想要的版本。

為分頁(yè)鏈接添加參數(shù)

在默認(rèn)的分頁(yè)鏈接中,你可以傳遞其他參數(shù),保留原始的查詢字符串,甚至指向一個(gè)特定的 #xxxxx 錨點(diǎn)。

{{ $users->appends(['sort' => 'votes'])->links() }}

{{ $users->withQueryString()->links() }}

{{ $users->fragment('foo')->links() }}

可重復(fù)回調(diào)函數(shù)

如果你有一個(gè)需要多次重復(fù)調(diào)用的回調(diào)函數(shù),你可以將其聲明在一個(gè)變量中,然后反復(fù)使用它。

$userCondition = function ($query) {
    $query->where('user_id', auth()->id());
};

// 獲取該用戶包含有評(píng)論的文章
// 返回該用戶的評(píng)論
$articles = Article::with(['comments' => $userCondition])
    ->whereHas('comments', $userCondition)
    ->get();

請(qǐng)求:查看多個(gè)參數(shù) hasAny

你不僅可以使用 $request->has() 方法來查看一個(gè)參數(shù),而且可以使用 $request->hasAny() 來查看傳入的多個(gè)參數(shù)。

public function store(Request $request) 
{
    if ($request->hasAny(['api_key', 'token'])) {
        echo '我們傳入了api_key';
    } else {
        echo '缺少認(rèn)證必要參數(shù)';
    }
}

簡(jiǎn)單分頁(yè)組件

在分頁(yè)組件中,如果你只需要「上一頁(yè) / 下一頁(yè)」的鏈接,而不是需要所有頁(yè)碼,也因此可以使用更少的數(shù)據(jù)庫(kù)查詢,你只需要將 paginate() 更改為 simplePaginate()。

// 全部頁(yè)碼的分頁(yè)組件
$users = User::paginate(10);

// 或者你可以這樣做
$users = User::simplePaginate(10);

獲取數(shù)據(jù)的方法

如果你有一個(gè)具有復(fù)雜數(shù)據(jù)結(jié)構(gòu)的數(shù)組,例如帶對(duì)象嵌套的數(shù)組,你可以使用 data_get() 助手函數(shù)配合通配符和「點(diǎn)」符號(hào),來從嵌套數(shù)組或?qū)ο笾袡z索值。

// 我們有如下數(shù)組
[ 
  0 => 
    ['user_id' =>'用戶id1', 'created_at' => '時(shí)間戳1', 'product' => {object Product}, ...], 
  1 =>  
      ['user_id' =>'用戶id2', 'created_at' => '時(shí)間戳2', 'product' => {object Product}, ...],  
  2 =>  ...
]

// 現(xiàn)在我們想要獲取其中全部的產(chǎn)品id,我們可以這樣寫:

data_get($yourArray,  '*.product.id');

// 這樣我們就獲取了全部的產(chǎn)品 id [1, 2, 3, 4, 5, ...]

Blade 指令增加真 / 假條件

Laravel 8.51 新增 @class 指令,用于添加控制 CSS 類的真 / 假條件??梢栽?a rel="external nofollow" target="_blank" target="_blank">此文檔中了解更多。

之前:

<div class="@if ($active) underline @endif">`

現(xiàn)在:

<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>

作業(yè)允許脫離隊(duì)列

在文檔中,「作業(yè)」是在「隊(duì)列」章節(jié)進(jìn)行討論的,但是你可以脫離隊(duì)列來使用「作業(yè)」,就像傳統(tǒng)的委托任務(wù)的類一樣。只需在控制器中調(diào)用 $this->dispatchNow() 即可。

public function approve(Article $article)
{
    //
    $this->dispatchNow(new ApproveArticle($article));
    //
}

在工廠類或 seeders 外部使用 Faker

如果你想要生成一些假數(shù)據(jù),你可以在模型工廠或 Seeds 中,甚至任何類的外部使用 Faker。

注意:要在生產(chǎn)模式 production 中使用它的話,你需要在 composer.json 中,將 faker 從 "require-dev" 移動(dòng)到 "require" 中。

use Faker;

class WhateverController extends Controller
{
    public function whatever_method()
    {
        $faker = Faker\Factory::create();
        $address = $faker->streetAddress;
    }
}

可以定時(shí)執(zhí)行的事情

你可以讓一些事情以每小時(shí)、每天,或是其他時(shí)間模式執(zhí)行。

你可以安排 artisan 命令、作業(yè)類、可調(diào)用類、回調(diào)函數(shù)、甚至是 shell 腳本去定時(shí)執(zhí)行。

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 文檔

如果你想使用一些關(guān)鍵詞來檢索 Laravel 文檔,默認(rèn)情況下只會(huì)給出 5 個(gè)結(jié)果?;蛟S還能給出更多結(jié)果。

如果你想要看全部的結(jié)果,你可以前往 Laravel 文檔 的 Github 倉(cāng)庫(kù) 直接搜索。

過濾 route:list

Laravel 8.34 新增: php artisan route:list 獲得了新的參數(shù) --except-path,你可以把一些你不想看見的路由過濾掉。

原始 Pull Request

使用 Blade 指令

如果你在不同的 Blade 文件中格式化數(shù)據(jù),可以嘗試創(chuàng)建自己的 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 命令的參數(shù),或者您想知道可用的參數(shù),只需鍵入 php artisan help [命令]。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)