一些實用的 Laravel 小技巧

来源:https://www.cnblogs.com/a609251438/archive/2019/12/20/12075170.html
-Advertisement-
Play Games

Laravel 中一些常用的小技巧,說不定你就用上了。 1.側欄 網站一般都有側欄,用來顯示分類,標簽,熱門文章,熱門評論啥的,但是這些側欄都是相對獨立的模塊,如果在每一個引入側欄的視圖中都單獨導入與視圖有關的數據的話,未免太冗餘了。所以最佳的做法是:新建一個widgets視圖文件夾,再利用Lara ...


Laravel 中一些常用的小技巧,說不定你就用上了。

1.側欄

網站一般都有側欄,用來顯示分類,標簽,熱門文章,熱門評論啥的,但是這些側欄都是相對獨立的模塊,如果在每一個引入側欄的視圖中都單獨導入與視圖有關的數據的話,未免太冗餘了。所以最佳的做法是:新建一個widgets視圖文件夾,再利用Laravel 的ViewComposers單獨為側欄綁定數據,這樣側欄就可以隨便引入而不用關心數據是否綁定啦。

舉個慄子,拿最常用的分類側欄來說,在resources/views/widgets下新建你的分類側欄視圖文件

categories.blade.php:
 
<divclass="widget widget-default"
 
<divclass="widget-header"><h6><iclass="fa fa-folder fa-fw"></i>分類</h6></div>
 
<ulclass="widget-body list-group"
 
@forelse($categoriesas$category)
 
@if(str_contains(urldecode(request->getPathInfo),'category/'.$category->name))
 
<lihref="{{ route('category.show',$category->name) }}"
 
class="list-group-item active"
 
{{$category->name }}
 
<spanclass="badge"{{$category->posts_count }}</span>
 
</li>
 
<ahref='http://www.jobbole.com/members/wx2715401697'@else</a>
 
<ahref="{{ route('category.show',$category->name) }}"
 
class="list-group-item"
 
</a>
 
<ahref='http://www.jobbole.com/members/endif1983'@endif</a>
 
<ahref='http://www.jobbole.com/members/mxbeijing2007'@empty</a>
 
<pclass="meta-item center-block"No categories.</p>
 
@endforelse
 
</ul>

 

新建app/Http/ViewComposers文件夾,然後創建CategoriesComposer.php:

<?php
 
namespaceApp\Http\ViewComposers;
 
useApp\Http\Repositories\CategoryRepository;
 
useIlluminate\View\View;
 
classCategoriesComposer
 
{
 
publicfunction__construct(CategoryRepository$categoryRepository)
 
{
 
$this->categoryRepository=$categoryRepository;
 
}
 
publicfunctioncompose(View$view)
 
{
 
$categories=$this->categoryRepository->getAll->reject(function($category){
 
return$category->posts_count==0;
 
});
 
$view->with('categories'$categories);
 
}

 


 
再在app/Providers文件夾下新建ComposerServiceProvider.php文件:
<?php
 
namespaceApp\Providers;
 
useIlluminate\Support\ServiceProvider;
 
useIlluminate\Support\Facades\View;
 
classComposerServiceProviderextendsServiceProvider
 
{
 
publicfunctionboot
 
{
 
View::composer('widget.categories''App\Http\ViewComposers\CategoriesComposer');
 
}
 
publicfunctionregister{}
 
}

 

 

最後別忘了在config/app.php中的providers數組中添加AppProvidersComposerServiceProvider::class啊。好了,現在你可以隨時隨地@include('widget.categories')了。對了,要善於在ViewComposer中利用Collection的強大方法進行數據處理。

2.善用路由別名

Laravel 最讓人喜歡的地方之一是可以給路由起一個別名,比如:

Route::get('user/profile''UserController@showProfile')->name('user.profile');
 
// 等價於:
 
Route::get('user/profile'['uses'=>'UserController@showProfile''as'=>'user.profile']);;
 
//例如:
 
<ahref="{{ route('user.profile') }}"lufficc</a>

 

因為一個普通的項目路由至少也得有幾十個,如果使用url方法的話,你不但要記住具體的路由,更麻煩的是如果你將來想要改變某個路由(比如把'user/profile'改為'u/profile',或者加個首碼啥的),必須改變所有相關的視圖文件,而使用命名路由的話,只要命名不變,毫不受影響。

所以視圖文件中儘量避免使用url方法,為每一個路由命名,一個預設的命名規則為:資源名稱.或者,如post.show,image.upload。

3.全局動態設置

僅僅是.env的配置還無法滿足我們的需求,有時我們需要可以在後臺動態的進行一些設置,比如網站的標題,網站的背景圖片或者是否允許評論等等。那麼實現這個的最佳實踐是什麼?

熟悉wordpress的同學知道,wordpress可以進行很多自定義,因為wordpress有一張鍵值對資料庫表,它就是靠這個實現個性化的。因此我們也可以參考這種思路,增加一個鍵值對錶,以Xblog為例子,新建一個maps表:

$table->text('value')->nullable(true);

 

maps表的作用就是實現鍵值對key-value存儲,tag的是為了可以有一個分類。然後後臺進行存儲的話,不要寫死,這樣就可以隨時在變單中添加設置而無需更改代碼:

]);
 
$map->tag='settings';
 
$map->value=$value;
 
$map->save;
 
註意firstOrNew的用法:如果不存在這個選項我們就新增一個並保存,否則就更新它。然後我們就可以在視圖中隨便增加任意多個表單了(或者也可以用js動態生成表單)。有了數據,怎麼在視圖中利用呢?利用ViewComposer,新建一個SettingsComposer.php,然後將查詢的數據以數組的形式傳遞給視圖:
 
//在SettingsComposer.php的compose方法中綁定數據
 
publicfunctioncompose(View$view)
 
{
 
$settings=Map::where('tag''settings')->get;
 
foreach($settingsas$setting){
 
}
 
}

 

然後就可以在視圖中隨便引用了,如你表單新增加了一個description

然後就可以在任何視圖引用了:{{ $description or ''}}。另外還可以綁定一個單例Facades到容器,這樣就可以在代碼中隨時獲取配置信息啦。

 //1.註冊
 
publicfunctionregister
 
{
 
$this->app->singleton('XblogConfig'function($app){
 
returnnewMapRepository;
 
});
 
}
 
//2.註冊Facade
 
classXblogConfigextendsFacade
 
{
 
publicstaticfunctiongetFacadeAccessor
 
{
 
return'XblogConfig';
 
}
 
}
 
//3.添加到aliases數組
 
'aliases'=>[
 
***************** 省略 span>
 
'XblogConfig'=>App\Facades\XblogConfig::class
 
],
 
//4.愉快的使用,可爽
 
$page_size=XblogConfig::getValue('page_size'7);

 

4.資料庫查詢

怎麼統計一篇文章有多少評論?最快的方法是:

$post = Post::where('id',1)->withCount('comments')->first;

 

這樣$post變數就有一個屬性comments_count了:

$post->comments_count;

 

如果想獲取點贊數大於的100的評論個數怎麼辦?這樣:

$post=Post::where('id'1)->withCount('comments'function($query){
 
$query->where('like''>'100);
 
})->first;

 

5.多態關聯

文章可以有評論,頁面可以有評論,評論也可以有評論,但是總不能建三張評論表吧?如果自己寫條件判斷也太麻煩了吧,Laravel的多態關聯上場了!!

//1.第一步在Comment模型中說明我是可以多態的
 
return$this->morphTo;
 
}
 
//2.在想要評論的模型中增加comments方法,
 
publicfunctioncomments
 
{
 
return$this->morphMany(Comment::class'commentable');
 
}
 
//3.使用,就像普通的一對多關係一樣:
 
$model->comments;
 
Schema::create('comments'function(Blueprint$table){
 
//等價於
 
****************省略
 
然後 laravel 會自動維持這些關係。註意,保存的評論的時候是有小技巧的,你的表單中至少要傳兩個參數:commentable_id和commentable_type:
 
$comment=newComment;
 
$commentable_id=$request->get('commentable_id');
 
//commentable_type取值例如:AppPost,AppPage等等
 
$commentable=app($request->get('commentable_type'))->where('id'$commentable_id)->firstOrFail;
 
****************省略
 
$commentable->comments->save($comment);

 

保存評論的時候並不知道是誰的評論,而是使用容器根據commentable_type生成一個模型實例,這樣也就和具體的模型解耦了,你可以讓任何東西可以評論,而不需要修改代碼。

6.緩存優化相關

如果你想要在.env文件中添加自己的配置,記住一定要在config文件夾下某個配置文件的數組中添加對應的。記住,除了config文件夾下的配置文件,永遠不要在其它地方使用env函數,因為部署到線上時,配置文件緩存(php artisan config:cache)後,env函數無法獲得正確的值。

另外註意的是,路由文件中儘量不使用閉包函數,統一使用控制器,因為緩存路由的時候php artisan route:cache,無法緩存閉包函數。

 

7.Redis

如果你緩存使用Redis,session也使用了Redis,隊列已使用了Redis,這樣沒問題,速度很快。但是,當你運行php artisan cache:clear清除緩存時,會把你的登錄信息清除,也會把隊列清除……這就不優雅了。解決辦法很簡單,為它們分配不同的連接即可。

首先在configdatabase.php中增加連接,註意database序號:

'redis'=>[
 
'cluster'=>false
 
'default'=>[
 
'host'=>env('REDIS_HOST''localhost'),
 
'password'=>env('REDIS_PASSWORD'null),
 
'port'=>env('REDIS_PORT'6379),
 
'database'=>0
 
],
 
'session'=>[
 
'database'=>1
 
],
 
'queue'=>[
 
'database'=>2
 
],
 
],
 
//queue.php中的connections數組中:
 
'redis'=>[
 
'driver'=>'redis'
 
'connection'=>'queue'
 
'queue'=>'default'
 
'retry_after'=>90
 
],
 
//session.php中的connection選項:
 
'connection'=>'session'

 

這樣它們就互不相干了~~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、http協議實戰 1.URL(Uniform Resource Located) (1)使用FFTP的URL,例如:ftp://rtfm.mit.edu (2)使用HTTP的URL,例如:http://www.baidu.com 2.HTTP工作原理 (1)瀏覽器分析超i鏈接中的URL (2)瀏 ...
  • 一、下載php源安裝包,解壓至/home/php目錄下 下載地址:https://www.php.net/distributions/php-7.2.26.tar.gz [root@localhost home]# tar -zxvf php-7.2.26.tar.gz #在這裡是上傳到了/home ...
  • 作者:個人微信公眾號:程式猿的月光寶盒 環境:win10 idea2019 jdk8 1.搭建Eureka服務模塊 1.1 新建eureka服務模塊(Sping Initializr) 取名為 ,並添加如下Dependencies: 1.2 配置 1.3 在啟動類前加上註解 1.4 開啟啟動器,並訪 ...
  • java嵌套介面 package object; class A { //嵌套在類中的介面,可以被private,protected,default和public四種許可權修飾 interface B { void f(); } public class BImp implements B { pub ...
  • count = 0while count <= 5: print('人生苦短,我用Python!', 'count = ', count) count += 1 ...
  • https://blog.csdn.net/u011244682/article/details/82853213 ...
  • 什麼是高併發? 高併發(High Concurrency)是一種系統運行過程中遇到的一種“短時間內遇到大量操作請求”的情況,主要發生在web系統集中大量訪問收到大量請求(例如:12306的搶票情況;天貓雙十一活動)。該情況的發生會導致系統在這段時間內執行大量操作,例如對資源的請求,資料庫的操作等。 ...
  • Redis支持五種數據類型:string(字元串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。 String(字元串) string 是 redis 最基本的類型,你可以理解成與 Memcached 一模一樣的類型,一個 key 對應一個 val ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...