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=https://www.cnblogs.com/a609251438/p/"{{ route('category.show',$category->name) }}" class="list-group-item active" {{$category->name }} <spanclass="badge"{{$category->posts_count }}</span> </li> <ahref=https://www.cnblogs.com/a609251438/p/'http://www.jobbole.com/members/wx2715401697'@else</a> <ahref=https://www.cnblogs.com/a609251438/p/"{{ route('category.show',$category->name) }}" class="list-group-item" </a> <ahref=https://www.cnblogs.com/a609251438/p/'http://www.jobbole.com/members/endif1983'@endif</a> <ahref=https://www.cnblogs.com/a609251438/p/'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=https://www.cnblogs.com/a609251438/p/"{{ 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=https://www.cnblogs.com/a609251438/p/$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'
這樣它們就互不相干了~~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/95127.html
標籤:PHP
下一篇:Redis有哪幾種資料型別
