一些實用的 Laravel 小技巧

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

1.側欄laravel

網站通常都有側欄,用來顯示分類,標籤,熱門文章,熱門評論啥的,可是這些側欄都是相對獨立的模塊,若是在每個引入側欄的視圖中都單獨導入與視圖有關的數據的話,未免太冗餘了。因此最佳的作法是:新建一個widgets視圖文件夾,再利用Laravel 的ViewComposers單獨爲側欄綁定數據,這樣側欄就能夠隨便引入而不用關心數據是否綁定啦。redis

舉個栗子,拿最經常使用的分類側欄來講,在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.善用路由別名session

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',或者加個前綴啥的),必須改變全部相關的視圖文件,而使用命名路由的話,只要命名不變,絕不受影響。app

因此視圖文件中儘可能避免使用url方法,爲每個路由命名,一個默認的命名規則爲:資源名稱.或者,如post.show,image.upload。composer

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'

 

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

相關文章
相關標籤/搜索