@yield('title')
@yield('content') {{-- error --}} @if($errors->count())@endforeach
apricot [プロジェクト]
|
├── app [アプリ]
| |
| ├── Controllers [コントローラ]
| | |
| | └── Interceptors [インターセプター]
| |
| ├── Exceptions [例外]
| ├── Foundation [基盤]
| ├── Helpers [ヘルパー]
| ├── Middleware [ルミドルウェア]
| ├── Models [モデル]
| └── Services [サービス] (予約)
* app フォルダはPSR-4によるオートローディングのベースフォルダとなります。従って、app 下のフォルダ及びファイルはPSR-4の命名規則に従う必要があり、クラスを保存するフォルダ及びファイルはUpperCamelCaseを使用して下さい。
\\
==== オートローディングの変更 ====
以下のようにcomposer.jsonを編集します。
{{fa>folder-open-o}} ** /apricot **
{
"autoload" : {
"psr-4" : {
"App\\" : "app/",
"Core\\" : "core/"
},
}
* ''autoload.psr-4'' の中に App名前空間へのマッピングを追加
オートローディングファイルを更新する為に、プロジェクトフォルダで以下のコマンドを実行します。
composer dump-autoload
\\
===== ヘルパークラス =====
アプリ用のヘルパー関数を作る準備として 表示用のHelperクラスを作成しておきます。必要に応じて、関数やクラスを追加していきます。
* ViewHelper --- 表示用(主にHTMLテンプレートで使用)
{{fa>folder-open-o}} ** /apricot/app/Helpers **
\\
===== クラスエイリアス =====
完全修飾クラス名を短くコーディングする為に、クラスのエイリアスを作成します。このエイリアスは、特にHTMLテンプレートでの使用を想定しています。
以下に示す初期設定ファイル(aliases.setup.php)を config/setup フォルダの下に作成して下さい。
{{fa>folder-open-o}} ** /apricot/config/setup **
\Core\Input::class,
'QueryString' => \Core\QueryString::class,
'Session' => \Core\Session::class,
'Flash' => \Core\Flash::class,
'Cookie' => \Core\Cookie::class,
'Config' => \Core\Config::class,
'Log' => \Core\Log::class,
'Debug' => \Core\Debug::class,
'DebugBar' => \Core\DebugBar::class,
'ErrorBag' => \Core\Foundation\ErrorBag::class,
/* App */
'ViewHelper' => \App\Helpers\ViewHelper::class,
];
// Creates an alias for a class
foreach($aliases as $alias_name => $original_class)
{
class_alias($original_class, $alias_name);
}
return true; // Must return true on success
};
* よく使うコアクラスとアプリ用のヘルパークラスのエイリアスを作っています
上で作った aliases.setup.php をアプリケーションの設定ファイル(app.php)に追加します。
{{fa>folder-open-o}} ** /apricot/config**
[
config_dir('setup/whoops.setup.php'), /* Error handler(whoops) */
config_dir('setup/bladeone.setup.php'), /* View template (BladeOne) */
config_dir('setup/aliases.setup.php'), /* Class aliases for view template and so on */
],
'middleware' =>[],
'auth' =>[],
'csrf' =>[],
];
\\
===== 言語テキスト =====
アプリの作成過程で使用する共通の言語テキストを準備します。個別の画面については、その都度に追加して行きます。
{{fa>folder-open-o}} ** /apricot/assets/lang/ja **
[
'title'=>env('APP_NAME'),
'menu'=>[
'menu1'=>'menu1',
'menu2'=>'Menu2',
'menu3'=>'Menu3',
'logout'=>'Logout',
'about_me'=>'About Me',
],
],
'success' => [
'db' => [
'insert' => 'データを登録しました',
'update' => 'データを更新しました',
'delete' => 'データを削除しました',
],
],
'error'=>[
'unknown'=>'エラーが発生しました',
'db' => [
'access' => 'データアクセスが失敗しました',
'insert' => 'データの登録が失敗しました',
'update' => 'データの更新が失敗しました',
'delete' => 'データの削除が失敗しました',
'optimisstic_lock'=>'データが他のユーザによって更新されています',
],
],
];
* app --- アプリケーションのタイトルやメニュー
* success --- 処理が成功した場合のメッセージ
* error --- エラー用のメッセージ
\\
===== 例外クラス =====
まず最初に、アプリで発生する例外を様々な例外クラスのベースとなる ApplicationException を Exceptionクラス から派生させて作ります。
{{fa>folder-open-o}} ** /apricot/app/Exceptions **
user_message = isset($user_message) ? $user_message : __('messages.error.unknown');
parent::__construct($internal_message, $code, $previous);
}
/**
* Get user error message
* @return string
*/
public function getUserMessage()
{
return $this->user_message;
}
}
* コンストラクタの引数のエラーメッセージが、ユーザ表示用( $user_message )と内部用( $internal_message )の2つがあります。
* ユーザ表示用のメッセージは、''getUserMessage()'' メソッドで取得できます。
* コンストラクタ内で使用されているボイラープレート ''%%__%%()'' はトランスレータ [[apricot:core:basic-class#langクラス|Core\Lang::get()]] を呼び出しています。トランスレータへの引数 'messages.error.unknown' は言語テキストのキーです(ドット表記)。
次に、ApplicationException から継承した楽観的ロック例外クラス OptimissticLockException を作ります。
{{fa>folder-open-o}} ** /apricot/app/Exceptions **
* コンストラクタ内で使用されているボイラープレート ''%%__%%()'' はトランスレータ [[apricot:core:basic-class#langクラス|Core\Lang::get()]] を呼び出しています。トランスレータへの引数 'messages.error.db.optimisstic_lock' は言語テキストのキーです(ドット表記)。
このようにして、アプリで発生する例外は ApplicationException から継承して作るようにします。
\\
===== HTMLレイアウト =====
apricotで採用しているテンプレートエンジン [[basic-library:bladeone:3.37|BladeOne]] の文法に従ってアプリ全体のレイアウトを作ります。また、cssとJavaScriptファイルも準備します。
* layout.blade.php --- アプリ全体のレイアウト
* main.css --- アプリ共通のスタイルシート
* main.js --- アプリ共通で使用するJavaScript
==== layout.blade.php ====
アプリ全体で使用するHTMLテンプレートを示します。このテンプレートではbootstrapとjqueryを使用し、レスポンシブデザインを採用しています。
* [[https://getbootstrap.com/|bootstrap]] 4.3.1
* [[https://jquery.com/|jquery]] 3.3.1
{{fa>folder-open-o}} ** /apricot/assets/view **
{{__('messages.app.title')}}
{!! DebugBar::renderHead() !!}
@stack('scripts')
@yield('title')
@yield('content')
{{-- error --}}
@if($errors->count())
@foreach($errors as $key=>$value)
{{$value}}
@endforeach
@endif
{{-- msg --}}
@if(Flash::has('msg'))
{{Flash::get('msg')}}
@endif
{!! DebugBar::render() !!}
* ****
* '''' と '''' を設定します
* bootstrap、jquery をインクルードします
* apricot用のCSSとJsのインクルードします( ''mian.css''、''main.js'' )
* [[apricot:core:basic-class#デバッグバー|DebugBar]]のHTMLヘッダーをレンダリングします
* ''@stack('scripts')'' を使って、個々の画面用のJavaSctiptを差し込みます
* ** **
* ''