メモ > 技術 > フレームワーク: 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