狠狠撸

狠狠撸Share a Scribd company logo
LaravelでFacadeを使わない開発
kenjiro kubota
2017/06/23
Profile
Kenjiro Kubota
istyle.inc
?PHP,?HHVM/Hack,?Javascript?
DTPDesigner
WebDesigner
FrontEnginner
WebApplicationEngiiner?now?
みなさん尝补谤补惫别濒使ってますか?
贵补肠补诲别使ってますか?
LaravelにおけるFacadeとは
Facadeはサービスコンテナで利用可能なクラスへの ''static'' イ
ンタフェースを提供
Facadeはサービスコンテナからオブジェクトへのアクセスを
提供するクラス
デザインパターンのファサードパターンのことではありません。
こういうやつです
Route::get();
Input::get();
スタティックでどこからでも呼び出せる
めっちゃ便利
そう思っていた时期が私にもありました
しかし複数人で開発していく上で
弊害になることも???
例えば
@if?(Input::has('hoge'))
????<p>hogeがあるよ</p>
@endif
Viewテンプレートでリクエストパラメータ値を評価したり
?これはまだましかも?
とか
class?hogeController?extend?Controller
{
????public?function?insertHoge():?int
????{
????????return?DB::table('hoge')
???????????????????‐>insertGetId(['fuga'?=>?'piyo']);
????}
}
コントローラーでデータアクセス層が出てきたり
最悪なのが
class?UserStorage
{
????public?function?insert(array?$array):?bool
????{
????????$hoge?=?Input::get('hoge');
????????...
????}
}
逆にデータアクセス層でHttpリクエストを取得していたり
たとえしっかり設計していても
どこでも呼べてしまうFacadeに汚染される可能性がある
破绽の日は近いぞ
というわけで、贵补肠补诲别をあえて封印して开発してみよう
まずはエイリアスを消してしまおう
?config/app.php?
'aliases'?=>?[
????'App'?=>?IlluminateSupportFacadesApp::class,
????'Artisan'?=>?IlluminateSupportFacadesArtisan::class,
????'Auth'?=>?IlluminateSupportFacadesAuth::class,
????'Blade'?=>?IlluminateSupportFacadesBlade::class,
????~~~
],
次は元から絶ってしまおう
?bootstrap/app.php?
$app‐>singleton(
????IlluminateContractsHttpKernel::class,
????AppHttpKernel::class
);
$app‐>singleton(
????IlluminateContractsConsoleKernel::class,
????AppConsoleKernel::class
);
?AppHttpKernel::class?
が継承してる
?use?IlluminateFoundationHttpKernel?as?HttpKernel;?
protected?$bootstrappers?=?[
????IlluminateFoundationBootstrapLoadEnvironmentVariables::class
????IlluminateFoundationBootstrapLoadConfiguration::class,
????IlluminateFoundationBootstrapHandleExceptions::class,
????IlluminateFoundationBootstrapRegisterFacades::class,
????IlluminateFoundationBootstrapRegisterProviders::class,
????IlluminateFoundationBootstrapBootProviders::class,
];
?RegisterFacades?を消したいので↑をコピーして
?AppHttpKernel::class?
protected?$bootstrappers?=?[
????IlluminateFoundationBootstrapLoadEnvironmentVariables::class
????IlluminateFoundationBootstrapLoadConfiguration::class,
????IlluminateFoundationBootstrapHandleExceptions::class,
????IlluminateFoundationBootstrapRegisterProviders::class,
????IlluminateFoundationBootstrapBootProviders::class,
];
?RegisterFacades?をなかったことにしてオーバーライド
※Consoleも同様に
もうこの尝补谤补惫别濒から贵补肠补诲别は呼べなくなりました
...あれ?
Facadeが使えないとAuthとかSessionとかどうするの?
実体をそのまま呼び出せば翱碍
Auth::なら
use?IlluminateAuthAuthManager;
public?function?__construct(AuthManager?$authManager)
{
????$this‐>auth?=?$authManager‐>guard('web');
}
Session::なら
use?IlluminateSessionSessionManager;
public?function?__construct(SessionManager?$sessionManager)
{
????$this‐>session?=?$sessionManager‐>driver('memcached');
}
Input::は
use?IlluminateHttpRequest;
public?function?__invoke(Request?$request)
{
????$input?=?$request‐>all();
}
Log::は特に簡単
use?PsrLogLoggerInterface;
public?function?__construct(LoggerInterface?$logger)
{
????$this‐>logger?=?$logger;
}
PSR‐3のLoggerInterfaceにIlluminateLogWriter?Monolog?がバインドさ
れているのでコンストラクタインジェクションで入る
简単ですね
依存しているものはuseを見ればわかる ‐> 破綻しにくい
実はちょっと落とし穴が...
?database/migrations/2014_10_12_000000_create_users_table.php?
use?IlluminateSupportFacadesSchema;
...
public?function?up()
{
????Schema::create('users',?function?(Blueprint?$table)?{
????????$table‐>increments('id');
????????$table‐>string('name');
????????$table‐>string('email')‐>unique();
????????$table‐>string('password');
????????$table‐>rememberToken();
????????$table‐>timestamps();
????});
}
LaravelのデフォルトのマイグレーションでFacadeを使ってるの
に?$bootstrappers?から消し去ったので動かなくなります
こういうtraitを用意して
trait?Helper
{
????/**
?????*?@return?IlluminateDatabaseSchemaBuilder
?????*/
????protected?function?getSchemeBuilder()
????{
????????return?app('db')‐>connection($this‐>getConnection())
????????????‐>getSchemaBuilder();
????}???
}
こんな感じでやればOKです
public?function?up()
{
????$this‐>getSchemeBuilder()
????????‐>create('users',?function?(Blueprint?$table)?{
????????????$table‐>increments('id');
????????});
}
拙作のリポジトリで参考が置いてあるのでパクってください。
https://github.com/kubotak‐is/laravel‐web‐site‐boilerplate
?app/Providers/AuthServiceProvider.php?も死ぬ
?app/Providers/BroadcastServiceProvider.php?も死ぬ
?app/Providers/EventServiceProvider.php?も死ぬ
これらは継承元のServiceProviderでFacadeを使っているので各親
を継承しないようにして自前で書いてください。
これも拙作のリポジトリで参考が置いてあるのでパクってください。
https://github.com/kubotak‐is/laravel‐web‐site‐boilerplate
まとめ
LaravelのFacadeは便利だけど多様すると見通しが悪い
Facadeを使わなくても特に困らない
とはいえ便利なので小規模なアプリや個人的に使う分には良
いのでは
余談ですが弊社にはFacade警察が居るのでFacadeを使うとレ
ビューで煽られます
おわり

More Related Content

尝补谤补惫别濒で蹿补肠补诲别を使わない开発