狠狠撸

狠狠撸Share a Scribd company logo
中?大規模でLaravel導入するTips
KenjiroKubota@笔谤辞尝补产辞もくもく会#10
Profile.
久保田 賢二朗
● PHP(Laravel/Phalcon)
● JavaScript(Vue.js,/Svelte)
● Golang(Echo/Goa)
● HHVM/Hack
kenjiro kubota
2019/2/16(sat)
弊社istyleでLaravel/Lumenを利用したアプリケーション
(GitHub調べ)
30-40くらい
そんな弊社でLaravelを利用する上で実践していることを紹介
View Composer
View Composerとは
プレゼンターやビューモデルのような振る舞いをする
テンプレートと値を紐付けるLaravelの機能
class ViewComposerServiceProvider extends ServiceProvider
{
public function register()
{
$view = $this->app->make('view');
$view->composer('welcome', AppHttpViewComposerUserComposer::class);
}
}
使い方
独自のServiceProviderを作成してconfig/app.phpに登録
use IlluminateViewView;
use IlluminateAuthAuthManager;
class UserComposer
{
private $auth;
public function __construct(AuthManager $authManager)
{
$this->auth = $authManager->guard('web');
}
public function compose(View $view)
{
$view->with([
'authUser' => $this->auth->user()
]);
}
}
AppHttpViewComposerUserComposer
{{ $userAuth->id }}
welcome.blade.php
※ 特定のテンプレートがレンダリングされる際にViewComposerが実行される
※ Composerの他にもViewインスタンス生成時に起動するView::Creatorもあるよ
Facade, Eloquentの禁止
「Facade, Eloquent禁止」でググるとこの人が一番上に出てきます。(上司)
※中?大規模での話なので個人で作るアプリケーションなら自分も別にいいんじゃないかなという気持ち
Facadeとは
'aliases' => [
'App' => IlluminateSupportFacadesApp::class,
'Artisan' => IlluminateSupportFacadesArtisan::class,
'Auth' => IlluminateSupportFacadesAuth::class,
'Blade' => IlluminateSupportFacadesBlade::class,
'Broadcast' => IlluminateSupportFacadesBroadcast::class,
'Bus' => IlluminateSupportFacadesBus::class,
'Cache' => IlluminateSupportFacadesCache::class,
'Config' => IlluminateSupportFacadesConfig::class,
'Cookie' => IlluminateSupportFacadesCookie::class,
'Crypt' => IlluminateSupportFacadesCrypt::class,
'DB' => IlluminateSupportFacadesDB::class,
'Eloquent' => IlluminateDatabaseEloquentModel::class,
'Event' => IlluminateSupportFacadesEvent::class,
'File' => IlluminateSupportFacadesFile::class,
'Gate' => IlluminateSupportFacadesGate::class,
'Hash' => IlluminateSupportFacadesHash::class,
'Lang' => IlluminateSupportFacadesLang::class,
'Log' => IlluminateSupportFacadesLog::class,
'Mail' => IlluminateSupportFacadesMail::class,
'Notification' => IlluminateSupportFacadesNotification::class,
'Password' => IlluminateSupportFacadesPassword::class,
'Queue' => IlluminateSupportFacadesQueue::class,
'Redirect' => IlluminateSupportFacadesRedirect::class,
'Redis' => IlluminateSupportFacadesRedis::class,
'Request' => IlluminateSupportFacadesRequest::class,
'Response' => IlluminateSupportFacadesResponse::class,
config/app.php
ズラァ~~と並ぶエイリアスを、
どこからでもスタティックに飛び出しが可能な便利な機能
Request::input("name");
とか
Cache::get("user");
とかとか、
ファサードにはたくさんの利点があります。自分で取り込んだり、設定したりする必要があり、長くて覚えにくいクラス名を使わずに、
Laravelの機能を簡素で覚えやすい文法で使ってもらえます。
その上に、PHPの動的メソッドのユニークな使用方法のおかげで、簡単にテストができます。
しかしながら、ファサードの使用にはいくつか気をつけるべき点も存在します。ファサードの一番の危険性は、クラスの責任範囲の暴
走です。
ファサードはとても簡単に使用でき、依存注入も必要ないため、簡単にクラスが成長し続ける結果、一つのクラスで多くのファサード
が使われます。
依存注入を使用すれば、クラスが大きくなりすぎることに伴う、大きなコンストラクタの視覚的なフィードバックにより、この危険性は抑
制されます。
ですから、ファサードを使用するときは、クラスの責任範囲を小さくとどめるため、クラスサイズに特に注意をはらいましょう。
出典:https://readouble.com
protected $bootstrappers = [
IlluminateFoundationBootstrapLoadEnvironmentVariables::class,
IlluminateFoundationBootstrapLoadConfiguration::class,
IlluminateFoundationBootstrapHandleExceptions::class,
// IlluminateFoundationBootstrapRegisterFacades::class,
IlluminateFoundationBootstrapRegisterProviders::class,
IlluminateFoundationBootstrapBootProviders::class,
];
IlluminateFoundationHttpKernel
Facadeを呼べないアプリケーションになります。
Eloquentの禁止
これは単純に処理される SQLが追いにくいので、弊社では QueryBuilderやAura.Sqlを使って
素に近いSQLで書いてます。
LaravelAspect
LaravelAspectとは
https://github.com/ytake/Laravel-Aspect
導入方法はリポジトリ参照
これも先程登場した上司作のライブラリです。ぜひ使ってください。
use YtakeLaravelAspectAnnotationCacheable;
/**
* @Cacheable(cacheName="testing1",key={"#id","#value"})
* @param $id
* @param $value
* @return mixed
*/
public function namedMultipleKey($id, $value)
{
return $id;
}
アノテーションを利用して Cache!
use YtakeLaravelAspectAnnotationTransactional;
/**
* @Transactional("master")
*/
public function save(array $params)
{
return $this->eloquent->save($params);
}
トランザクションもアノテーションで!
ADR
ADRとは
Action Domain Responedrの頭文字からとった、 UIアーキテクチャパターンです。
MVC(Model View Controller)の派生パターンです。
ADRとは
この書籍でも紹介されている設計パターンです。
ご参考にどうぞ(宣伝)
好評発売中!
Model / Domain
View / Responder
Controller / Action
namespace AppHttpAction;
use AppHttpResponderIndexResponder;
final class IndexAction
{
public function __invoke(IndexResponder $responder): IndexResponder
{
return $responder;
}
}
チームのルールとして Controllerのメソッドを一個に制限してもよいですが、 Laravelなら以下のように制
約することができます。
/** @var Router $router */
$router = $this->app['router'];
$router->get('/', AppHttpActionIndexAction::class);
__invokeというマジックメソッドだけで表現するのでこれ以上メソッドを増やすことはできません。
また、Routerからの呼び出しは以下のようになります。
namespace AppHttpResponder;
use IlluminateViewFactory;
use IlluminateHttpResponse;
use IlluminateContractsSupportResponsable;
class IndexResponder implements Responsable
{
public function __construct( Factory $view)
{
$this->view = $view;
}
public function toResponse($request): Response
{
return new Response(
$this->view->make( 'welcome' ), 200
);
}
}
Responderの実装はLaravel5.5から追加されたResponsable Interfaceを実装することでスッキリか
けます。
if ($response instanceof Responsable) {
$response = $response->toResponse($request);
}
Responsable InterfaceのtoResponseメソッドはLaravelのRouterでコールされます。
ですので、toResponseメソッドでviewやjsonを返却することでResponderとして機能させることが可能
です。
IlluminateRoutingRouter
まとめ
中?大規模開発では制約や見通しの良さが重要です。
FacadeやEloquentを使わないことで記述が増えたり、 ADRで設計することでクラスは膨大にな
ります。
しかし、責務を分離することで細かくなったクラスはテストがしやすくなり、
なによりリーダブルになることと思います。
ご参考になれば!
スピーカー募集中!
thanks:)

More Related Content

中?大规模で尝补谤补惫别濒を导入する罢颈辫蝉