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.
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
记录:部分
集合是与数组交互和管理数组的好方法。集合有多种方便的方法,并实现了许多有用的接口,例如 ArrayableInterface
、IteratorAggregate
和 JsonableInterface
。
假设我们正在构建一个使用平面文件进行存储的小型博客引擎。我们希望能够执行排序、过滤和分页等操作。
实现博客引擎超出了本文的范围,但假设我们有一个数组 $articles
,并且该数组的每个成员都是 Article
类的实例。然后我们需要做的就是获取 Collection
的新实例并为其提供我们的文章数组。
$articles = new Illuminate\Support\Collection($arrayOfArticles);
使用集合我们可以对文章进行排序。让我们对文章进行排序,并首先显示最近更新的文章。为了本文的目的,我们假设当从文件系统加载文章时,我们将 updatedAt
属性设置为文件的上次修改时间。
$articles->sortByDesc(function ($article) { return $article->updatedAt; });
sortBy
和 sortByDesc
方法接受回调,此回调应返回一个可用于对集合进行排序的值。在我们的例子中,我们可以简单地返回文章的最后修改时间,并且集合可以根据该时间进行排序。
与排序类似,我们也可以使用集合来过滤我们的文章,就像 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();
我们还可以迭代我们的文章集合,就像它是一个常规数组一样。这都要归功于 IteratorAggregate
和 ArrayIterator
接口。
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
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');
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');
updatedAt
kepada masa terakhir diubah suai fail. 🎜
{{ Form::text('username', null) }} @if($errors->has('username')) <div class="error">{{ $errors->first('username') }}></div>; @endif
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. 🎜
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>') }}
filter
sebenarnya mengembalikan contoh baharu IlluminateSupportCollection
, jadi kita perlu menetapkannya kepada pembolehubah $results
. Koleksi baharu ini hanya akan mengandungi artikel yang menyebut "Laravel rock!" 🎜
$user = new Illuminate\Support\Fluent; $user->name('Jason')->country('Australia')->subscriber();
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. 🎜
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
,值为 Jason
、country
,值为 Australia
和 subscriber
,值为布尔值 true
。
在 Laravel 4.1 之前,您只能从实例中真正设置和获取属性。从 Laravel 4.1 开始,您可以使用 toArray
和 toJson
方法分别获取属性数组及其 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!