Laravel+Vueで構築していると
- PHP
- typescript
- Javascript
- そのた
もろもろの技術が重なっているので複雑になる。
慣れれば、いろいろなことができる
- SNS認証
- 暗号化と復号化
- ファイルのアップロードダウンロード
- 二段階認証
ただそれを覚えて応用するまでは時間が必要だ。
今後、これらを備忘記録していく予定です。
こうご期待
Laravel+Vueで構築していると
もろもろの技術が重なっているので複雑になる。
慣れれば、いろいろなことができる
ただそれを覚えて応用するまでは時間が必要だ。
今後、これらを備忘記録していく予定です。
こうご期待
親子コンポーネントについて
見本ソースを参照している
子供のコンポーネント
親コンポーネント
props 経由で受け取った foo の中身はリテラルではななく、親で定義されたオブジェクトのため、foo の値として hoge が出力される。
v-bindはリアクティブのために親子間で連携していることを意味します
下記も同様です。
親のコンポーネント
子供のコンポーネント
子コンポーネントから親のメソッドを実行するためには、子から $emit でイベントを発火させるのがポイントです。
template から直接イベントを発生させることができないため、クリックイベントを一旦 子コンポーネントのメソッド ( ここでは childFunc ) で受け取り、そのメソッド内でイベントを処理します。
親子間でデータ量が増えた場合はVUEXを使うのが最善。
今、思案しているところでした・・・
PHP:Laravel-07の参考URLをもとにしていろいろと変更していきます。
npm install bootstrap-vue
※ Composerは、PHPの依存関係を管理するツールです。 Packagistを使用して依存関係に関する情報を取得し、適切にインストールします。
NPMはNodeエコシステムの一部であり、主にNode.jsアプリケーションの依存関係を管理するために構築されました。
下記の設計関係のドキュメントが必要です。理由はプロダクトの際に必要になる情報です。
常に製造の品質を上げるときは設計が重要です。設計することによってテスト内容が把握でき、結果の保証します。
参考にしているURLには設計関係のものがありますので参考にして、今後、追加と修正をしていきます。
■bootstrap-vueを利用しているので、これを利用できるようにします
resources/app.js に下記を追加
クライアント側での動きの制御がVue、Vuex
サーバ側での動きはLaravelのAPI
この動きを設計書に基づき、プロダクトを見てみましょう
■resources/app.js
App.vue
初期画面構成となります
router.js
VueRouterプラグインを使用したルーティングを行います
コンポーネントと紐づけをしています
<RouterView />が利用可能になる
■resources/store/index.js
resources/app.js が参照しているresources/store配下のjsを見てみましょう
storeで利用できるものは
となります
■resources/store/auth.js
ソースに詳細を記入しています
URLから、dispathされ、actionに渡されて、actionが起動、そして、APIを起動します
ログインを見てみましょう
context.commit('setApiStatus', null) ミューテーションを呼び出します
例では setApiStatus に null をセットします
const response = await axios.post('/api/login', data)
例ではloginコントローラが呼び出される
画面については次回になります
Vueを利用している参照としているのは、
composer create-project laravel/laravel プロジェクト名
cd プロジェクト名
php artisan serve
これでローカルでWeb画面が開けばインストール完了
LaravelはJavaScriptやCSSプリプロセッサの使用を規定してはいませんが、開発時点の元としてほとんどのアプリケーションで役立つだろうBootstrapやReact、Vueを提供しています。これらのフロントエンドパッケージをインストールするため、LaravelはNPMを使用しています。
Laravelが提供するBootstrapとVueのスカフォールドは、Composerを使いインストールする
>composer require laravel/ui
laravel/uiパッケージをインストールできたら、ui Artisanコマンドを使いフロントエンドのスカフォールドをインストールします。
// 基本的なスカフォールドを生成
>php artisan ui vue
// ログイン/ユーザー登録スカフォールドを生成
>php artisan ui vue --auth
>npm install --save-dev vue-router
下記は必要事項のみを記載している。
自ら勉学し、苦労することによって知恵が身につきます
参考のURLでは動かない時があるので、そこは自ら学習して起動するようにしましょう
>php artisan make:migration create_photos_table --create=photos
>php artisan make:migration create_likes_table --create=likes
>php artisan make:migration create_comments_table --create=comments
>php artisan migrate
>php artisan make:model Photo
>php artisan make:model Comment
>php artisan make:request StoreComment
>php artisan make:request StorePhoto
アップロードしただけでは、ブラウザからアップロードしたファイルを閲覧することはできません。ブラウザからサーバ上のファイルにアクセスするためには、Laravelインストールディレクトリの下にあるpublicディレクトリの下に保存する必要があります。しかし、アップロードしたファイルは/storage/appの下にあるためアクセスすることができません。/publicディレクトリと/storage/appディレクトリとの間でリンクを持たせる必要があります。
Laravelではリンクを貼る設定を行う機能も備えています。
php artisan storage:linkを実行します。
>php artisan storage:link
基本的な作成はこれまでと変わらず。
今後は必要なことや、技術的なこと記載させていただきます。
今回は参照としているのは、
参考にしているもの
学習のポイントはエラーの出し方やログイン情報です。
DB内のテーブル情報を作り直す便利なコマンドは
>php artisan migrate:fresh
項目などを追加したり、削除するにも便利です
composer create-project laravel/laravel プロジェクト名
cd プロジェクト名
php artisan serve
これでローカルでWeb画面が開けばインストール完了
>php artisan ui bootstrap --auth
laravel/uiのvueベースをインストールした際に、必要なフロントエンドパッケージがpackage.jsonに追記されました。
bootstrap、jqueryなどが追記されています。
これらのパッケージをインストールします。
>npm install
必要なパッケージは全てインストール完了したので、最後にフロントエンドソースコードをビルドしてみます。
これは毎回必要です
>npm run dev
このコマンドを実行することで、Laravel Mixのビルド処理が実行され、コンパイルされたjs、cssが/public/js public/cssに出力されます。
日本語の処理は参考としているURLをご覧ください。
Auth クラスの check メソッドでログインしているかどうかを確認することができます 。
アクセスしたユーザーがログインしていれば Auth::check() は true を返し、ログインしていなければ false を返します。テンプレートではこの Auth::check() を利用してログインしていた場合の要素とログインしていない場合の要素を出し分けています。
@if(Auth::check())
<!-- ログインしていた場合 -->
@else
<!-- ログインしていない場合 -->
@endif
Auth::check() とは逆の働きをする guest メソッドも存在します。つまり Auth::guest() はユーザーがログインしていない場合に true を返します。
ログインユーザーの取得
Auth::user() でログイン中のユーザーを取得できます。返却値はログインユーザーの情報が入った User モデルのインスタンスです。
Auth::check() や Auth::user() はコントローラーなどでも使用することができます。実際に後述の処理でも使用します。便利なメソッドですので覚えておきましょう。
ログアウト
次にログアウト処理を実装します。
@if(Auth::check())
<script>
document.getElementById('logout').addEventListener('click', function(event) {
event.preventDefault();
document.getElementById('logout-form').submit();
});
</script>
@endif
アプリケーションの利用にログイン認証を求める機能を実装します。
ログインしないとフォルダやタスクの作成・閲覧ページにアクセスできないようにします。
ページに認証を求める処理はミドルウェアを用いて実現します。ミドルウェアとは、ルートごとの処理に移る前に実行されるプログラムでした。認証状態の確認はさまざまなルートに共通して実行したい処理なのでミドルウェアで実現するのに適しています。
認証を求めるミドルウェアはデフォルトで用意されていますので、routes/web.php でルートにミドルウェアを適用します。
ミドルウェアは 'auth' という名前で指定されていますが、app/Http/Kernel.php というファイルに実際のクラスと名前の定義があります。
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
// ...
];
このミドルウェアはアクセスしたユーザーの認証状態をチェックして、ログインしていたらそのままコントローラーメソッド(または次のミドルウェア)に処理を渡します。ログインしていなければログイン画面にリダイレクトさせます。
認証「されていない」ことを確かめるミドルウェアを編集します。
ログインページや会員登録ページはログインしていないときにだけアクセスできるべきですね。すでにログインしているユーザーがそのようなページにアクセスすることを防ぐミドルウェアは用意されていますが、一部編集する必要があります。
app/Http/Middleware/RedirectIfAuthenticated.php
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
return redirect('/');
}
return $next($request);
}RedirectIfAuthenticated ミドルウェアは会員登録コントローラーやログインコントローラーのコンストラクタで適用されています。
RegisterController.php
public function __construct()
{
$this->middleware('guest');
}
LoginController.php
public function __construct()
{
$this->middleware('guest')->except('logout');
}
'guest' という名前は Kernel.php で定義されています。
Kernel.php
protected $routeMiddleware = [
// ...
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
// ...
];
参考にすべき情報があると、知っているだけで知識と知恵が備わります。
今回学習すべき点はルーティングやログインに関してです。
エラーの出し方がわかると、次にVUEと合体させて学習し、実務に活かしましょう。
Vueと同時にしていると、Laravel自体の特徴がうまく使えないので、
改めてプロジェクトを作成することにする
まずは設計
ToDo アプリが持つ機能の箇条書きは以下の通りです。
画面は省略
| 項目 | 出入力 |
|---|---|
| フォルダ タイトル | 出力 |
| タスク タイトル | 出力 |
| タスク 状態 | 出力 |
| タスク 期限日 | 出力 |
| 項目 | 種類 | 働き |
|---|---|---|
| フォルダ作成 | リンク | フォルダ作成ページに遷移する。 |
| タスク作成 | リンク | タスク作成ページに遷移する。 |
| タスク編集 | リンク | タスク編集ページに遷移する。 |
| 項目 | 出入力 |
|---|---|
| フォルダ タイトル | 入力 |
| 項目 | 種類 | 働き |
|---|---|---|
| 送信 | ボタン | フォルダを新規作成し、タスク一覧ページに遷移する。 |
| 項目 | 出入力 |
|---|---|
| タスク タイトル | 入力 |
| タスク 状態 | 入力 |
| タスク 期限日 | 入力 |
| 項目 | 種類 | 働き |
|---|---|---|
| 送信 | ボタン | タスクを新規作成し、タスク一覧ページに遷移する。 |
タスク編集ページでは登録済みの情報を画面に出力しておく必要もあります。
| 項目 | 出入力 |
|---|---|
| タスク タイトル | 出力 |
| タスク 状態 | 出力 |
| タスク 期限日 | 出力 |
| タスク タイトル | 入力 |
| タスク 状態 | 入力 |
| タスク 期限日 | 入力 |
| 項目 | 種類 | 働き |
|---|---|---|
| 送信 | ボタン | タスクを編集し、タスク一覧ページに遷移する。 |
画面をまたいで共通で定義されるパーツもあるでしょう。
今回はヘッダーナビゲーションがすべての画面に共有して配置されます。
| 項目 | 出入力 |
|---|---|
| アプリ名 | 出力 |
| ユーザー名 | 出力 |
| 項目 | 種類 | 働き |
|---|---|---|
| ログアウト | リンク | ログインしている時のみ表示する。 ログアウト処理を行い、ログイン画面に遷移する。 |
| 会員登録 | リンク | ログインしていない時のみ表示する。 会員登録ページに遷移する。 |
| ログイン | リンク | ログインしていない時のみ表示する。 ログインページに遷移する。 |
| URL | メソッド | 処理 |
|---|---|---|
| /folders/{フォルダID}/tasks | GET | タスク一覧ページを表示する。 |
| /folders/create | GET | フォルダ作成ページを表示する。 |
| /folders/create | POST | フォルダ作成処理を実行する。 |
| /folders/{フォルダID}/tasks/create | GET | タスク作成ページを表示する。 |
| /folders/{フォルダID}/tasks/create | POST | タスク作成処理を実行する。 |
| /folders/{フォルダID}/tasks/{タスクID}/edit | GET | タスク編集ページを表示する。 |
| /folders/{フォルダID}/tasks/{タスクID}/edit | POST | タスク編集処理を実行する。 |
フォルダテーブル
| カラム論理名 | カラム物理名 | 型 | 型の意味 |
|---|---|---|---|
| ID | id | SERIAL | 連番(自動採番) |
| タイトル | title | VARCHAR(20) | 20文字までの文字列 |
| 作成日 | created_at | TIMESTAMP | 日付と時刻 |
| 更新日 | updated_at | TIMESTAMP | 日付と時刻 |
タスクテーブル
| カラム論理名 | カラム物理名 | 型 | 型の意味 |
|---|---|---|---|
| ID | id | SERIAL | 連番(自動採番) |
| フォルダID | folder_id | INTEGER | 数値 |
| タイトル | title | VARCHAR(100) | 100文字までの文字列 |
| 状態 | status | INTEGER | 数値 |
| 期限日 | due_date | DATE | 日付 |
| 作成日 | created_at | TIMESTAMP | 日付と時刻 |
| 更新日 | updated_at | TIMESTAMP | 日付と時刻 |