1. 程式人生 > >laravel 服務提供者 facade初使用及理解

laravel 服務提供者 facade初使用及理解

使用服務提供者註冊服務進行依賴注入後可以直接Class::method()呼叫否則得自己new一個例項

<?php


namespace App\Providers;


use Illuminate\Support\ServiceProvider;


class MyViewComposer extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }


    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton('myviewcomposera',function(){
            //return new TestService();
            return new \App\Http\ViewComposers\MyViewComposer;
        });


        $this->app->bind('App\Contracts\ComposerContract', function() //兩種繫結方式
        {
            return new \App\Http\ViewComposers\MyViewComposer;
        });
    }
}
facade其實就是建立一個靜態類
<?php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;

class MyViewComposer extends Facade {

    protected static function getFacadeAccessor() { return 'myviewcomposera'; }

}
config資料夾app.php中註冊別名
 'MyViewComposer' => App\Facades\MyViewComposer::class,
建立契約介面方便後面依賴注入
<?php


namespace App\Contracts;
use Illuminate\Contracts\View\View;


interface ComposerContract
{
    public function compose(View $view);
    public function setnavbar($data);  
}
建立類
<?php namespace App\Http\ViewComposers;
use Illuminate\Contracts\View\View;
use App\Contracts\ComposerContract;
use Cache;
use Carbon\Carbon;
class MyViewComposer implements ComposerContract
{
    public function compose(View $view)
    { 
        $view->with('sitename',Cache::get('navbar',[1,0,0,0]));
    }
    public function setnavbar($data){
    	Cache::put('navbar', $data, Carbon::now()->addSeconds(300));
    }
}


使用
<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Role;
use App\Permission;
use App\Contracts\ComposerContract;
//use App\Facades\MyViewComposer; //使用全名
use MyViewComposer;//使用別名

class RoleController extends Controller
{
	//自己進行依賴注入
    public function __construct(ComposerContract $test){ //需要取消使用全名註釋
        $this->composer = $test;
    }

    public function welcome()
    {
    	$users=Role::get();
    	foreach ($users as $user) {
    		$user->permissions;
    	}
    	// $this->composer->setnavbar([0,0,0,[1,0,0]]); 
         MyViewComposer::setnavbar([0,0,0,[1,0,0]]);
    	//Cache::put('navbar', [0,0,1,0], Carbon::now()->addSeconds(300));
    	return view('admin/role',['roledata'=>$users,'permissions'=>Permission::all()]);
    }

}

facade就相當於幫你依賴注入了