Memo

メモ > 技術 > フレームワーク: Laravel > 簡易ブログの作成

簡易ブログの作成
詳細な変更内容は以下のコミットログも参照 https://github.com/refirio/laravel-blog/commits/master ■プロジェクト作成
cd C:\localhost\home\test\public_html\laravel composer create-project --prefer-dist laravel/laravel blog
http://localhost/~test/laravel/blog/public/ ■日本語化
cd blog composer require laravel-ja/comja5 cd C:\localhost\home\test\public_html\laravel vendor\bin\comja5 vendor\bin\comja5 -c vendor\bin\comja5 -f
■初期設定 config\app.php を編集。
'timezone' => 'Asia/Tokyo', 'locale' => 'ja',
データベース laravel-blog を作成。 文字コードは utf8_general_ci もしくは utf8mb4_general_ci とする。 config\database.php を編集。
'charset' => 'utf8mb4', 'collation' => 'utf8mb4_general_ci',
/.env を編集。
DB_CONNECTION=mysql DB_HOST=localhost DB_PORT=3306 DB_DATABASE=laravel-blog DB_USERNAME=root DB_PASSWORD=1234
■作成の準備 モデルを移動。(移動先は App\DataAccess\Eloquent では無く App\Entities の方が良さそう。)
app\DataAccess\Eloquent\User.php
不要なマイグレーションを削除。
database\migrations\2014_10_12_100000_create_password_resets_table.php
コメントのモデルとマイグレーションを作成。
php artisan make:model DataAccess\Eloquent\Comment -m
エントリーのモデルとマイグレーションを作成。
php artisan make:model DataAccess\Eloquent\Entry -m
マイグレーションを調整。 マイグレーションを実行。
php artisan migrate
■ユーザ登録と認証 認証処理を調整。 認証処理を調整後。
composer dump-autoload
この時点で、ユーザ登録とログインの動作確認ができる。 ユーザ登録処理をオーバーライド。 Illuminate\Foundation\Auth\RegistersUsers の register() をもとにする。 イベントについて。 https://kore1server.com/358/Laravel5.4%E3%80%81%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E7%99%BB%E9%8C%B... http://programmer-jobs.blogspot.jp/2017/04/laravel-5-4-get-login-event-record-user-login-time.html http://qiita.com/bmf_san/items/e96bb3533de0792f9382 https://xzxzyzyz.blogspot.jp/2017/06/laravel5.html $this->create() は同じクラス内にメソッドが定義されている。 ユーザ登録のフォームリクエストを作成。
php artisan make:request UserRegisterRequest
ユーザ登録処理をリファクタリング。 Class 'App\Http\Controllers\Auth\Registered' not found https://stackoverflow.com/questions/40836577/class-app-http-controllers-auth-registered-not-found 言語ファイルを追加。 項目名は以下で指定できるが、モデルなど他の場所でも指定できたかも?どのように指定するのがいいか要検証。 C:\localhost\home\test\public_html\laravel\blog\resources\lang\ja\validation.php 'attributes' => [], ログインのフォームリクエストを作成。
php artisan make:request LoginRequest
ログイン処理をオーバーライド。 Illuminate\Foundation\Auth\AuthenticatesUsers の login() をもとにする。 P.400 認証機能のカスタマイズ。 は後回し。 ■記事 記事管理のコントローラを作成。
php artisan make:controller Admin\EntryController
記事のフォームリクエストを作成。
php artisan make:request EntryStoreRequest php artisan make:request EntryUpdateRequest
記事の一覧・追加・更新を実装。 http://qiita.com/michiomochi@github/items/de19c560bc1dc19d698c http://qiita.com/fagai/items/a1bf55b6249aee03a624 http://recipes.laravel.jp/recipe/92 https://github.com/laravel/framework/issues/17550 http://qiita.com/naga1460/items/ecff7e439b534a021a68 ページネーションを追加。 キャッシュは後回し。 ■論理削除
php artisan make:migration alter_users_table php artisan make:migration alter_entries_table php artisan make:migration alter_comments_table
マイグレーションを調整。 マイグレーションを実行。
php artisan migrate
モデルを修正。 ■キャッシュ プログラムを実装 https://github.com/Zizaco/entrust/issues/468 https://github.com/Zizaco/entrust/issues/749 http://recipes.laravel.jp/recipe/122 fileとdatabaseはタグをサポートしていないらしい。 arrayにすればエラーは出なくなるが、これは「キャッシュしない」という設定みたい。 タグを使わないようにプログラムを調整した。 C:\localhost\home\test\public_html\laravel\blog\app\Providers\AppServiceProvider.php の以下の部分がキャッシュの有効期限。この場合60分。 new DataCache($app['cache'], 'entry', 60) ■認可
php artisan make:policy EntryPolicy php artisan make:middleware SelfEntry
プログラムを実装 この方式で何が便利になるのかは要勉強。 https://readouble.com/laravel/5.4/ja/authorization.html checkメソッドはallowsメソッドのエイリアス。5.4では紹介されていないので、非推奨と思われる。 https://readouble.com/laravel/5.1/ja/authorization.html
composer dump-autoload
■ビューコンポーザー プログラムを実装 ビューがレンダリングされるたびに実行した処理をまとめる。 https://readouble.com/laravel/5.4/ja/views.html ■記事表示を実装 管理ページ用に作成したプログラムを流用して実装。 ■タグを実装
php artisan make:model DataAccess\Eloquent\Tag -m
タグを登録。
$ php artisan tinker >>> App\DataAccess\Eloquent\Tag::create(['name' => 'diary']); >>> App\DataAccess\Eloquent\Tag::create(['name' => 'work']); >>> App\DataAccess\Eloquent\Tag::create(['name' => 'hobby']); >>> App\DataAccess\Eloquent\Tag::create(['name' => 'family']); >>> App\DataAccess\Eloquent\Tag::all()->toArray(); >>> exit
記事とタグを関連付け。
$ php artisan tinker >>> $entry = App\DataAccess\Eloquent\Entry::first(); >>> $entry->tags()->attach(1); >>> DB::select('select * from entry_tag'); >>> $entry = App\DataAccess\Eloquent\Entry::first(); >>> $entry->tags->toArray(); >>> $tag = App\DataAccess\Eloquent\Tag::first(); >>> $tag->entries->toArray(); >>> $entry = App\DataAccess\Eloquent\Entry::first(); >>> $entry->tags()->attach(2); >>> $entry = App\DataAccess\Eloquent\Entry::find(2); >>> $entry->tags()->attach(1); >>> $entry->tags()->attach(3);
プログラムから記事とタグを一覧表示。
Route::get('/test', function () { $result = ''; $entries = App\DataAccess\Eloquent\Entry::with('tags')->get(); //$entries = App\DataAccess\Eloquent\Entry::get(); foreach ($entries as $entry) { $result .= $entry->id . ' | ' . $entry->title . '<br>'; foreach ($entry->tags as $tag) { $result .= $tag->id . ' | ' . $tag->name . '<br>'; } $result .= '<br>'; } return $result; });
■備忘録・疑問点 外部キーを設定すると、マイグレーションのロールバックを実行できない? 外部キー制約はSeederで設定するほうがいい? Laravelが自動作成するルーティングは以下なので、スラッシュは省略しない方がいいかも? ルーティングのグループ化などへの影響を確認する。
Route::get('/', function () { return view('welcome'); }); Auth::routes(); Route::get('/home', 'HomeController@index')->name('home');
Laravel5.4では、ユーザ登録関連でイベントが発行されるようになっている。 それなら「記事登録時」「コメント登録時」など、自分で作る処理でもイベントを発行すべき? サービスとか、スーパークラスとして専用のクラスを定義して継承させる? でもUserRepositoryやUserRepositoryInterfaceは親クラスは不要?それなら無くていいかも? $entries に記事データを渡して $entry で一件ずつ表示。 …とすると、単数形と複数形が同じ単語の場合に問題がある。 一件ずつ表示する際は常に $row でいいかも。 levisのサンプルもそのようにする? と思ったけど、ループ内でループさせる場合に名前がややこしい。要検討。 created_at と updated_at はNULLを禁止にする? モデル、リポジトリ、サービスのメソッド名は要検討。 すべてで統一するのか区別するのか。 投稿する場合も save なのか add なのか create なのか、など。 => のインデントを揃えるか否か。 オートインクリメントな代理キーで管理している際、 代理キーの連番とは別に、例えばカテゴリごとに連番を登録したい場合はどのように処理するのがいいか。 UIの作成には Form::open() を使う? 紐付けテーブルに代理キーを持たせるべきか、持たせないべきか。 論理削除にすべきか、物理削除にすべきか。 WMSは「代理キーあり、論理削除」となっている。 論理削除の際、UNIQUE制約のある列はどうすべきか? 例えばユーザ名がUNIQUEだとして、deleted_atで削除しても再度同じユーザ名は使えない。 以下の方法で、UNIQUE制約のある列に「DELETED 20171002210832 」を付与するか。 Laravelのeloquentのeventでcreated_byとかupdated_byとか更新するobserverとtrait - Qiita https://qiita.com/maimai-swap/items/6597c04721adbc48fec2 laravel Hashファサード 文字列ハッシュ化までの道 - Qiita https://qiita.com/miriwo/items/b3fa105c28566d5f8cb7 パスワードのハッシュは、tinkerを使って作ることができる。
$ php artisan tinker > Hash::make('password')
もしくは、以下のようにすることもできる。(デフォルトではHash::makeによってbcryptが呼び出されるらしいが、同じ結果を得られるかどうかは設定次第なので要確認。)
> bcrypt('password')
その他 Laravel.txt で「未検証」としているものは検証したい。 ■解決済みメモ useは Illuminate と App のどちらを先に書くか、統一したい。 →先にAppを書く方が一般的みたい。 公式のサンプルもそのようになっているので、そちらに合わせる。 1ページあたりの表示件数などは、設定ファイルで管理する? 設定ファイルにはどのように定義するのがいいか。 →設定ファイルで以下のようにすると良さそう。 https://github.com/laravel-jp-reference/chapter8/blob/master/config/blog.php

Advertisement