Ground Sunlight

Windowsで作る - PHPプログラミングの開発環境

ユーザ用ツール

サイト用ツール


apricot:app:top

差分

このページの2つのバージョン間の差分を表示します。

この比較画面にリンクする

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
apricot:app:top [2020/05/09 09:33]
y2sunlight [layout.blade.php]
apricot:app:top [2020/06/03 13:11] (現在)
tanaka [クラスエイリアス]
行 14: 行 14:
     * [[apricot:app:db-model|Apricot データベースとモデル]]     * [[apricot:app:db-model|Apricot データベースとモデル]]
     * [[apricot:app:user-list|Apricot ユーザ一覧画面]]     * [[apricot:app:user-list|Apricot ユーザ一覧画面]]
-    * [[apricot:app:user-edit|Apricot ユーザ編集画面]]+    * [[apricot:app:user-edit|Apricot ユーザ登録画面]]
     * [[apricot:app:validation|Apricot バリデーション]]     * [[apricot:app:validation|Apricot バリデーション]]
     * [[apricot:app:transaction|Apricot トランザクション]]     * [[apricot:app:transaction|Apricot トランザクション]]
-  * [[apricot:ext:top|Apricot 拡張]]+  * [[apricot:ext:middleware|Apricot 拡張]]
  
-\\ 
  
 まずは、apricotのアプリを作る為に以下を準備します。 まずは、apricotのアプリを作る為に以下を準備します。
行 32: 行 31:
 ==== appフォルダ ==== ==== appフォルダ ====
  
-以下に示すようにプロジェクトフォルダ下に、アプリ用のフォルダ app を作成し、その下に7つのフォルダ(Controllers, Exceptions, Foundation, Helpers, Middleware, Models, Services)を作成します。+以下に示すようにプロジェクトフォルダ下に、アプリ用のフォルダ app を作成し、その下に7つのフォルダ(Controllers, Exceptions, Foundation, Helpers, Middleware, Models, Services)を作成します。また、Controllersの下にはInterceptorsフォルダを作成します。 
  
 <code> <code>
行 40: 行 39:
     |     |
     ├── Controllers [コントローラ]     ├── Controllers [コントローラ]
 +    |    |
 +    |    └── Interceptors [インターセプター]
 +    |  
     ├── Exceptions [例外]     ├── Exceptions [例外]
     ├── Foundation [基盤]     ├── Foundation [基盤]
行 45: 行 47:
     ├── Middleware [ルミドルウェア]     ├── Middleware [ルミドルウェア]
     ├── Models     [モデル]     ├── Models     [モデル]
-    └── Services   [サービス]+    └── Services   [サービス] (予約)
 </code> </code>
  
行 146: 行 148:
 </code> </code>
  
-  * よく使うコアクラスとアプリ用のヘルパークラスのリアスを作っています+  * よく使うコアクラスとアプリ用のヘルパークラスのエイリアスを作っています
  
  
行 214: 行 216:
 \\ \\
  
 +===== 例外クラス =====
 +
 +まず最初に、アプリで発生する例外を様々な例外クラスのベースとなる ApplicationException を Exceptionクラス から派生させて作ります。
 +
 +{{fa>folder-open-o}} ** /apricot/app/Exceptions **
 +<code php ApplicationException.php>
 +<?php
 +
 +namespace App\Exceptions;
 +
 +use Exception;
 +
 +/**
 + * アプリケーション例外
 + */
 +class ApplicationException extends Exception
 +{
 +    /**
 +     * User error message
 +     * @var string
 +     */
 +    private $user_message;
 +
 +    /**
 +     * Create ApplicationException
 +     * @param string $user_message
 +     * @param string $internal_message
 +     * @param int $code
 +     * @param \Throwable $previous
 +     */
 +    public function __construct(string $user_message=null, $internal_message=__CLASS__, int $code = 0, \Throwable $previous = null)
 +    {
 +        $this->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;
 +    }
 +}
 +</code>
 +
 +  * コンストラクタの引数のエラーメッセージが、ユーザ表示用( $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 **
 +<code php OptimissticLockException.php>
 +<?php
 +
 +namespace App\Exceptions;
 +
 +/**
 + * 楽観的ロック例外
 + */
 +class OptimissticLockException extends ApplicationException
 +{
 +    /**
 +     * Create Optimisstic Lock
 +     * @param string $message
 +     * @param \Exception $previous
 +     */
 +    public function __construct()
 +    {
 +        parent::__construct(__('messages.error.db.optimisstic_lock'), __CLASS__);
 +    }
 +}
 +</code>
 +
 +  * コンストラクタ内で使用されているボイラープレート ''%%__%%()'' はトランスレータ [[apricot:core:basic-class#langクラス|Core\Lang::get()]] を呼び出しています。トランスレータへの引数 'messages.error.db.optimisstic_lock' は言語テキストのキーです(ドット表記)。
 +
 +このようにして、アプリで発生する例外は ApplicationException から継承して作るようにします。
 +
 +\\
  
 ===== HTMLレイアウト ===== ===== HTMLレイアウト =====
行 274: 行 357:
  
             {{--             {{--
-            @if(app_has('auth'))+            @if(app('auth.menu',false))
             <ul class="navbar-nav ml-auto">             <ul class="navbar-nav ml-auto">
                 <a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>                 <a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
-                    {{user()->account}} <span class="caret"></span>+                    {{AuthUser::getUser()->account}} <span class="caret"></span>
                 </a>                 </a>
                 <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdown">                 <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdown">
行 316: 行 399:
     </main>     </main>
  
-    <footer class="fixed-bottom bg-secondary text-center text-light py-1">&copy; 2020 y2sunlight</footer>+    <footer class="fixed-bottom bg-secondary text-center text-light py-1">{{env('APP_NAME')}} &copy; 2020 y2sunlight</footer>
     {!! DebugBar::render() !!}     {!! DebugBar::render() !!}
 </body> </body>
行 334: 行 417:
       * ''@yield('title')'' を使って、個々の画面のタイトルを生成します       * ''@yield('title')'' を使って、個々の画面のタイトルを生成します
       * ''@yield('content')'' を使って、個々の画面のコンテンツを生成します       * ''@yield('content')'' を使って、個々の画面のコンテンツを生成します
 +      * ''@if'', ''@foreach'' はPHPの if, foreach と同じ機能を持つ制御ディレクティブです
       * テンプレード変数 ''$errors'' が空でない場合はエラー表示します       * テンプレード変数 ''$errors'' が空でない場合はエラー表示します
       * フラッシュ変数 ''msg'' があるときはメッセージを表示します       * フラッシュ変数 ''msg'' があるときはメッセージを表示します
     * 最後尾に [[apricot:core:basic-class#デバッグバー|DebugBar]]のHTMLボディをレンダリングします     * 最後尾に [[apricot:core:basic-class#デバッグバー|DebugBar]]のHTMLボディをレンダリングします
  
 +  * **ボイラープレート**
 +    * ''__()'' はトランスレータ [[apricot:core:basic-class#langクラス|Core\Lang::get()]] を呼び出しています。トランスレータへの引数は言語テキスト(assests/lang/ja/messages.php)のキーです(ドット表記)。
 +    * ''url_ver()'' はHTMLリソースをバージョニング対応する[[apricot:core:application-class#applicationクラスのヘルパー関数|Applicationクラスのヘルパー関数]]です。\\ (バージョニングとは、静的なHTMLリソースの更新をブラウザに通知する為に、静的ファイルの後ろに ''?v={version no}'' などのクエリ文字列を追加する事を指します)
 +    * ''route()'' はルートパスをURLに変換する[[apricot:core:application-class#applicationクラスのヘルパー関数|Applicationクラスのヘルパー関数]]です。
 +    * ''user()'' はログインユーザのエンティティを呼び出します(後述のユーザ認証で説明)。
 +    * ''env()'' は環境設定を取得する[[apricot:core:top#ヘルパー|ヘルパー関数]]です。
  
->''<nav>'' の中の ''@if(app_has('auth'))'' の部分は後述のユーザ認証で説明します。この段階ではコメントアウトされています。+>''<nav>'' の中の ''@if(app('auth.menu',false))'' の部分は後述のユーザ認証で説明します。この段階ではコメントアウトされています。
  
 HTMLテンプレートに関しては本編[[http://www.y2sunlight.com/ground/doku.php?id=basic-library:bladeone:3.37|BladeOne]]のリンクを項を参照して下さい。 HTMLテンプレートに関しては本編[[http://www.y2sunlight.com/ground/doku.php?id=basic-library:bladeone:3.37|BladeOne]]のリンクを項を参照して下さい。
- 
-  * **ボイラープレート** 
-    * '' __()'' はトランスレータ [[apricot:core:basic-class#langクラス|Core\Lang::get()]] を呼び出しています。 
-    * '' url_ver()'' は[[apricot:core:application-class#applicationクラスのヘルパー関数|Applicationクラスのヘルパー関数]]でHTMLリソースをバージョニング対応しています。 
- 
  
  
行 472: 行 557:
      * @return \Core\Foundation\Response      * @return \Core\Foundation\Response
      */      */
-    function index(int $no=null)+    public function index(int $no=null)
     {     {
         $title = "Stub {$no}";         $title = "Stub {$no}";
行 508: 行 593:
 {{-- コンテンツ --}} {{-- コンテンツ --}}
 @section('content') @section('content')
-    @foreach($messages as $message) +    @if(!empty($messages)) 
-    <p>{{$message}}</p> +      @foreach($messages as $message) 
-    @endforeach+      <p>{{$message}}</p> 
 +      @endforeach 
 +    @endif
 @endsection @endsection
 </code> </code>
行 517: 行 604:
   * ''push''ディレクティブで layoutテンプレートの ''scripts''スタック にコードを追加しています。\\ (ここでは書くべきJavascriptがないので何も追加していません)   * ''push''ディレクティブで layoutテンプレートの ''scripts''スタック にコードを追加しています。\\ (ここでは書くべきJavascriptがないので何も追加していません)
   * ''section''で layoutテンプレートの ''title'' と ''content'' セクションを生成しています。   * ''section''で layoutテンプレートの ''title'' と ''content'' セクションを生成しています。
 +  * ''@if'', ''@foreach'' はPHPの if, foreach と同じ機能を有するディレクティブです。
  
 HTMLテンプレートに関しては本編[[http://www.y2sunlight.com/ground/doku.php?id=basic-library:bladeone:3.37|BladeOne]]のリンクを項を参照して下さい。 HTMLテンプレートに関しては本編[[http://www.y2sunlight.com/ground/doku.php?id=basic-library:bladeone:3.37|BladeOne]]のリンクを項を参照して下さい。
apricot/app/top.1588984414.txt.gz · 最終更新: 2020/05/09 09:33 by y2sunlight