首頁  >  文章  >  後端開發  >  揭開 Laravel 隱藏的寶藏

揭開 Laravel 隱藏的寶藏

WBOY
WBOY原創
2023-08-28 16:45:02672瀏覽

揭开 Laravel 隐藏的宝藏

許多使用 Laravel 的開發人員可能只觸及了該框架所提供功能的皮毛。雖然文件確實涵蓋了最常見的用例和明顯的功能,但它並沒有涵蓋所有內容。

別誤會我的意思,文檔很好,只是您可以做的事情太多了,很難記錄所有內容。因此,我們將看看 Laravel 中潛藏的一些隱藏的寶藏。

級聯視圖

可用時間: v4.0.0

#記錄:

視圖能夠像設定檔一樣級聯。在開發可擴展的主題系統時,級聯視圖非常有用。考慮以下目錄結構。

/app
    /views
        /blog
            /index.blade.php
/themes
    /default
        /views
            /blog
                /index.blade.php
            /theme.blade.php

這個想法是,當我們return View::make('theme::blog.index'); 時,它會先在themes/default/views 目錄中查找,如果找不到的話找到視圖,回退到app/views

為此,我們使用 View::addNamespace 在這兩個位置註冊我們自己的命名空間。

View::addNamespace('theme', [
    base_path().'/themes/default/views',
    app_path().'/views'
]);

集合

可用時間: v4.0.0

#記錄:部分

集合是與陣列互動和管理陣列的好方法。集合有多種方便的方法,並實作了許多有用的接口,例如 ArrayableInterfaceIteratorAggregateJsonableInterface

假設我們正在建立一個使用平面檔案進行儲存的小型部落格引擎。我們希望能夠執行排序、過濾和分頁等操作。

實作部落格引擎超出了本文的範圍,但假設我們有一個陣列 $articles,而該陣列的每個成員都是 Article 類別的實例。然後我們需要做的就是取得 Collection 的新實例並為其提供我們的文章陣列。

$articles = new Illuminate\Support\Collection($arrayOfArticles);

排序

使用集合我們可以對文章進行排序。讓我們對文章進行排序,並先顯示最近更新的文章。為了本文的目的,我們假設當從檔案系統載入文章時,我們將 updatedAt 屬性設定為檔案的上次修改時間。

$articles->sortByDesc(function ($article) { 
    return $article->updatedAt; 
});

sortBysortByDesc 方法接受回調,此回呼應傳回一個可用來對集合進行排序的值。在我們的例子中,我們可以簡單地傳回文章的最後修改時間,並且集合可以根據該時間進行排序。

過濾

與排序類似,我們也可以使用集合來過濾我們的文章,就像 MySQL 中的 WHERE 子句一樣。讓我們根據可能已運行的搜尋來過濾我們的文章。

<?php

$searchQuery = 'Laravel rocks!';

$results = $articles->filter(function ($article) use ($searchQuery) {
    return preg_match(sprintf('/%s/m', $searchQuery), $article->body);
});

filter 方法實際上會傳回 Illuminate\Support\Collection 的新實例,因此我們需要將其指派給 $results 變數。這個新集合將只包含提到「Laravel rock!」的文章體內。

分頁

使用該集合,我們可以對文章進行分頁,這樣單一頁面上就不會出現太多文章。

$perPage = 1;

$page = Input::get('page', 1);

if ($page > ($articles->count() / $perPage)) {
    $page = 1;
}

$pageOffset = ($page * $perPage) - $perPage;

$results = $articles->slice($pageOffset, $perPage);

使用 slice 方法,我們提取集合中的一部分文章並將其指派給 $results 變數。

這個範例可以透過建立 Laravel 的 Paginator 類別的新實例來進一步實現。這樣它就可以為您產生所有頁碼和連結。

還有更多!

我們可以得到一篇隨機文章:

$article = $articles->random();

我們也可以迭代我們的文章集合,就像它是一個常規數組一樣。這都要歸功於 IteratorAggregateArrayIterator 介面。

foreach ($articles as $article) {
    echo $article->body;
}

我們甚至可以將文章轉換為常規陣列或其 JSON 表示形式。

$array = $articles->toArray();
$json = $articles->toJson();

最酷的方法之一可能是 groupBy,它允許我們按特定鍵對文章進行分組。想像一下,每篇文章的頂部都有一些元數據,這些元數據被解析並從文章正文中刪除。

儘管此元資料的解析超出了本文的範圍,但我們假設它已被解析並且是 Article 實例上的屬性。然後,您可以使用 groupBy 按文章發佈的類別對文章進行分組。

$results = $articles->groupBy('category');

共享同一類別的所有文章都將被分組。然後您可以獲得特定類別的文章。

foreach ($results->get('tutorial') as $article) { 
    echo $article->body; 
}

集合是 Laravel 提供的最好的隱藏寶石之一。

正規表示式篩選器

可用時間: v4.1.19

#記錄:

在 Laravel 中過濾路由是我們許多人在所有專案中執行的常見任務。過濾器可讓您在路由觸發之前或之後執行使用者身份驗證或速率限制等任務。我們使用 Route::filter 建立過濾器,並可以將它們套用到單一路由、路由組,或使用 Route::when 並套用到匹配的模式。

Route::filter('restricted', function($route, $request, $group)
{
    // Restrict user access based on the value of $group
});

Route::when('admin/*', 'restricted:admin');

在此示例中,我们创建一个 restricted 过滤器,它需要一个参数 $group$route$request 参数始终提供给 before 过滤器。

但是如果我们想要更大的灵活性怎么办?假设我们想要将过滤器应用于所有 admin 路由除了 admin/login。我们可以使用路线组并将相关路线移至组外。或者我们可以使用 Route::whenRegex 并编写我们自己的正则表达式。

Route::whenRegex('/^admin(\/(?!login)\S+)?$/', 'restricted:admin');

此正则表达式只是确保它仅适用于以 admin 开头且后面不跟 /login 的路由,但后面可以跟任何其他内容。出色的。现在,我们将 restricted:admin 过滤器应用于除 admin/login 路由之外的所有路由。

消息包

可用时间: v4.0.0

记录:部分

毫无疑问,您已经使用 Illuminate\Support\MessageBag 一段时间了,甚至没有意识到。 MessageBag 扮演的最大角色是在使用 Laravel 内置验证器时包含所有验证错误。

每个视图中都有一个 $errors 变量,该变量包含空的 MessageBag 实例或使用 Redirect::to('/')->withErrors($validator); 刷新到会话的实例

当在特定输入下方显示错误消息时,很多人可能会在表单中执行类似的操作。

{{ Form::text('username', null) }}
@if($errors->has('username'))
    <div class="error">{{ $errors->first('username') }}></div>;
@endif

您实际上可以完全删除 if 语句,并使用 first 方法的第二个参数将消息包装在 div 中。

    {{ Form::text('username', null) }}
    {{ $errors->first('username', '<div class="error">:message</div>') }}

好多了,好多了!

流利

可用时间: v3.0.0

记录:部分

Fluent 类已经存在很长时间了,当使用模式生成器创建迁移时,它实际上在框架本身内使用。 Laravel 3 和 Laravel 4 之间,类本身几乎没有变化,唯一大的区别是多了一些接口。

要使用 Fluent 类,您所需要做的就是获取一个实例,然后就可以了。

$user = new Illuminate\Support\Fluent;
$user->name('Jason')->country('Australia')->subscriber();

该实例现在定义了 3 个属性:name,值为 Jasoncountry,值为 Australiasubscriber,值为布尔值 true

在 Laravel 4.1 之前,您只能从实例中真正设置和获取属性。从 Laravel 4.1 开始,您可以使用 toArraytoJson 方法分别获取属性数组及其 JSON 表示形式。

从 Laravel 4.2 开始,该类还实现了 JsonSerialized 接口,这意味着您可以将实例直接传递到 json_encode 中。

还有更多!

我们已经研究了 Laravel 框架的几个有用的精华。但是,正如您所猜测的,框架内还有更多内容。

了解 Laravel 可能提供的其他功能的最佳方法是深入研究源代码。它并不像您想象的那么可怕,您将学到很多关于您正在构建的框架的知识。

如果您发现了其他宝石,请随时在评论中分享!

以上是揭開 Laravel 隱藏的寶藏的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn