Rumah >pembangunan bahagian belakang >tutorial php >Temui Khazanah Tersembunyi Laravel

Temui Khazanah Tersembunyi Laravel

WBOY
WBOYasal
2023-08-28 16:45:02708semak imbas

揭开 Laravel 隐藏的宝藏

Ramai pembangun yang menggunakan Laravel mungkin hanya menconteng permukaan perkara yang ditawarkan oleh rangka kerja itu. Walaupun dokumentasi merangkumi kes penggunaan yang paling biasa dan ciri yang jelas, ia tidak meliputi segala-galanya.

Jangan salah faham, dokumentasinya bagus, cuma ada banyak perkara yang boleh anda lakukan sehingga sukar untuk didokumenkan semuanya. Jadi, kita akan melihat beberapa permata tersembunyi yang bersembunyi di Laravel.

Pandangan Lantun

Masa tersedia: v4.0.0

Rekod: Tidak

Paparan boleh dilantunkan seperti fail konfigurasi. Pandangan bertingkat sangat berguna apabila membangunkan sistem tema berskala. Pertimbangkan struktur direktori berikut.

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

Ideanya ialah apabila kita mengembalikan View::make('theme::blog.index'); ia akan mula-mula berada dalam Carian direktori themes/default/views , cari paparan jika tidak ditemui, kembali ke app/views. 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 方法实际上返回 IlluminateSupportCollection 的新实例,因此我们需要将其分配给 $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

Untuk melakukan ini, kami menggunakan View::addNamespace untuk mendaftarkan ruang nama kami sendiri di kedua-dua lokasi. 🎜
Route::filter('restricted', function($route, $request, $group)
{
    // Restrict user access based on the value of $group
});

Route::when('admin/*', 'restricted:admin');
🎜Koleksi🎜 🎜🎜Masa tersedia: 🎜 v4.0.0 🎜🎜 🎜Rekod: 🎜Bahagian🎜 🎜Koleksi ialah cara terbaik untuk berinteraksi dan mengurus tatasusunan. Koleksi mempunyai pelbagai kaedah kemudahan dan melaksanakan banyak antara muka yang berguna, seperti ArrayableInterface, IteratorAggregate dan JsonableInterface. 🎜 🎜Andaikan kita sedang membina enjin blog kecil yang menggunakan fail rata untuk simpanan. Kami mahu dapat melakukan operasi seperti pengisihan, penapisan dan halaman. 🎜 🎜Melaksanakan enjin blog adalah di luar skop artikel ini, tetapi andaikan kita mempunyai tatasusunan $articles dan setiap ahli tatasusunan ialah contoh kelas Article. Kemudian apa yang perlu kita lakukan ialah mendapatkan contoh baharu Koleksi dan memberikannya pelbagai artikel kami. 🎜
Route::whenRegex('/^admin(\/(?!login)\S+)?$/', 'restricted:admin');

Isih

🎜Menggunakan koleksi kita boleh menyusun artikel. Mari susun artikel dan paparkan artikel yang dikemas kini terlebih dahulu. Untuk tujuan artikel ini, kami menganggap bahawa apabila memuatkan artikel daripada sistem fail, kami menetapkan atribut updatedAt kepada masa terakhir diubah suai fail. 🎜
{{ Form::text('username', null) }}
@if($errors->has('username'))
    <div class="error">{{ $errors->first('username') }}></div>;
@endif
🎜Kaedah sortBy dan sortByDesc menerima panggilan balik yang sepatutnya mengembalikan nilai yang boleh digunakan untuk mengisih koleksi. Dalam kes kami, kami hanya boleh mengembalikan masa pengubahsuaian terakhir artikel dan koleksi boleh diisih berdasarkan masa itu. 🎜

Tapis

🎜Serupa dengan pengisihan, kami juga boleh menggunakan koleksi untuk menapis artikel kami, sama seperti klausa WHERE dalam MySQL. Mari tapis artikel kami berdasarkan carian yang mungkin telah dijalankan. 🎜
    {{ Form::text('username', null) }}
    {{ $errors->first('username', '<div class="error">:message</div>') }}
🎜Kaedah filter sebenarnya mengembalikan contoh baharu IlluminateSupportCollection, jadi kita perlu menetapkannya kepada pembolehubah $results. Koleksi baharu ini hanya akan mengandungi artikel yang menyebut "Laravel rock!" 🎜

Halaman

🎜Menggunakan koleksi ini, kita boleh menomborkan artikel supaya tidak terlalu banyak artikel pada satu halaman. 🎜
$user = new Illuminate\Support\Fluent;
$user->name('Jason')->country('Australia')->subscriber();
🎜Menggunakan kaedah slice, kami mengekstrak sebahagian daripada artikel dalam koleksi dan menetapkannya kepada pembolehubah $results. 🎜 🎜Contoh ini boleh dilaksanakan selanjutnya dengan mencipta contoh baharu kelas Paginator Laravel. Dengan cara ini ia boleh menjana semua nombor halaman dan pautan untuk anda. 🎜

Ada lagi!

🎜Kita boleh dapatkan artikel rawak: 🎜 rrreee 🎜Kami juga boleh mengulangi koleksi artikel kami seolah-olah ia adalah susunan biasa. Ini semua terima kasih kepada antara muka IteratorAggregate dan ArrayIterator. 🎜 rrreee 🎜Kami juga boleh menukar artikel kepada tatasusunan biasa atau perwakilan JSONnya. 🎜 rrreee 🎜Salah satu kaedah yang paling hebat mungkin adalah groupBy, yang membolehkan kami mengumpulkan artikel dengan kunci tertentu. Bayangkan setiap artikel mempunyai beberapa metadata di bahagian atas yang dihuraikan dan dialih keluar daripada badan artikel. 🎜 🎜Walaupun penghuraian metadata ini di luar skop artikel ini, kami menganggap ia dihuraikan dan merupakan sifat pada contoh Article. Anda kemudiannya boleh menggunakan groupBy untuk mengumpulkan artikel mengikut kategori yang diterbitkan. 🎜 rrreee 🎜Semua artikel yang berkongsi kategori yang sama akan dikumpulkan. Kemudian anda boleh mendapatkan artikel dalam kategori tertentu. 🎜 rrreee 🎜Koleksi adalah salah satu permata tersembunyi terbaik yang Laravel tawarkan. 🎜 🎜Penapis Ekspresi Biasa🎜 🎜🎜Masa tersedia: 🎜 v4.1.19 🎜🎜 🎜Rekod: 🎜Tidak🎜 🎜Menapis laluan dalam Laravel ialah tugas biasa yang dilakukan oleh kebanyakan kami dalam semua projek kami. Penapis membolehkan anda melaksanakan tugas seperti pengesahan pengguna atau pengehadan kadar sebelum atau selepas laluan dicetuskan. Kami mencipta penapis menggunakan Route::filter dan boleh menggunakannya pada laluan individu, kumpulan laluan atau menggunakan Route::when dan digunakan pada corak yang sepadan. 🎜
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 可能提供的其他功能的最佳方法是深入研究源代码。它并不像您想象的那么可怕,您将学到很多关于您正在构建的框架的知识。

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

Atas ialah kandungan terperinci Temui Khazanah Tersembunyi Laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn