2023/04/13
Laravel
## Laravelプロジェクト導入
- composerから
```
composer create-project laravel/laravel --prefer-dist app-name
```
- githubから
```
composer self-update
```
```
composer install
```
```
php artisan key:generate
```
```
php artisan migrate
```
```
chmod -R 777 storage
```
```
chmod -R bootstrap/cache
```
***
## ライブラリ
※ メモリオーバー時の対応
`php -d memory_limit=-1 $env:ComposerPhar <コマンド>`
(`$env:ComposerPhar` = `composer.phar`ファイルパス)
- デバッグツールバー
```
composer require barryvdh/laravel-debugbar
```
- ui
```
composer require laravel/ui
```
***
## artisan コマンド
### make
- Controller
```
php artisan make:controller PhotoController --resource
```
- Model
```
php .artisan make:model Post -m
```
※ -m : Migrationも作成
- Migration
- create
```
php .artisan make:migration create_posts_table --create=posts
```
- change
```
php .artisan make:migration add_votes_to_posts_table --table=posts
```
- シーダー
```
php artisan make:seeder PhotoTableSeeder
```
### migrate
- ステータス確認
```
php artisan migrate:status
```
- 直前の操作のロールバック
```
php artisan migrate:rollback
```
- リセット
```
php artisan migrate:reset
```
- リセット後、再度マイグレーション実行
```
php artisan migrate:refresh
```
- すべてのテーブルを削除後、再度マイグレーション実行
```
php artisan migrate:fresh
```
- すべてのテーブルを削除後、マイグレーションとシーダーを実行
```
php artisan migrate:fresh --seed
```
### route
- キャッシュクリア
```
php artisan route:cache
```
- 一覧確認
```
php artisan route:list
```
### db
- 全てのシーダーの実行
```
php artisan db:seed
```
- 特定のシーダーの実行
```
php artisan db:seed --class=UsersTableSeeder
```
### tinker
```
php artisan tinker
>>> use [使用するクラス]
>>> $hoge = new [読みこんだクラス]
>>> $hoge->[メソッド名(引数)]
```
- User 作成
```
php artisan tinker
>>> User::create(['name'=>'test','email'=>'test@example.com','password'=>Hash::make('password')])
```
***
## sourse
### グループルーティング
```php
Route::group(['middleware' => ['auth']], function () {
Route::resource('/post', PostController::class);
});
```
### リソースルーティング
```php
Route::resource('/post', PostController::class);
```
### リクエスト値をモデルに一括更新
```php
$post = Post::findOrNew($id);
$post->fill($request->all())->save();
```
### Requestインスタンスを使用したバリデーション
```php
$request->validate(
['is_opened' => 'required|boolean'],
['is_opened.required' => ':attributeは必ず指定してください。'],
['is_opened' => '公開設定']
);
```
### current_timestanpカラム
```php
public function up()
{
Schema::create('posts', function (Blueprint $table) {
...
$table->timestamp('updated_at')->useCurrentOnUpdate()->nullable();
$table->timestamp('created_at')->useCurrent()->nullable();
});
}
```
### リレーションシップ
```php
class Content extends Model
{
...
public function posts()
{
return $this->hasMany(Post::class);
}
}
```
### 論理削除の実装
- migration
```php
public function up()
{
Schema::create('posts', function (Blueprint $table) {
...
$table->softDeletes();
});
}
```
- model
```php
use IlluminateDatabaseEloquentSoftDeletes;
class Content extends Model
{
use SoftDeletes;
protected $dates = ['deleted_at'];
}
```
- controller
```php
if ($post = Post::find($id)) {
$post->delete();
}
```
### [ページネーション](https://readouble.com/laravel/8.x/ja/pagination.html)
- controller
```php
Post::where(['user_id' => Auth::id()])->paginate(20);
```
- view
```php
{{ $samples->links() }}
```
- pagination viewテンプレート生成コマンド
```
php artisan vendor:publish --tag=laravel-pagination
```
### シーダー使用
`migrations/seeders/DatabaseSeeder.php`
```php :DatabaseSeeder.php
public function run()
{
$this->call([
UsersTableSeeder::class,
]);
}
```
***
## その他
### キャッシュクリア系コマンド
```
php artisan cache:clear | php artisan config:clear | php artisan route:clear | php artisan view:clear
```
```
composer dump-autoload | php artisan clear-compiled | php artisan optimize | php artisan config:cache
```
### ログイン機能導入
1. `composer require laravel/ui`
1. `php artisan ui vue --auth`
1. `php artisan migrate`
1. `npm install`
1. `npm run dev`
### Larave-admin導入
1. `composer require encore/laravel-admin`
1. `php artisan vendor:publish --provider="EncoreAdminAdminServiceProvider"`
1. `php artisan admin:install`
1. `config/filesystem.php`修正
```
'disks' => [
...,
'admin' => [
'driver' =>'local',
'root' => public_path('uploads'),
'visibility' =>'public',
'url' => env('APP_URL').'/uploads',
],
],
```
*参考*
- https://enjoyworks.jp/tech-blog/7298
- https://mofuru.net/news/230
### SASS導入
1. `webpack.mix.js`を編集
```javascript
mix.js('resources/js/app.js', 'public/js')
- .postCss('resources/css/app.css', 'public/css', [
- //
- ]);
+ .sass('resources/sass/app.scss', 'public/css')
+ .version();
```
1. `resources/sass/app.scss`を作成
1. `npm run dev` 等でビルド
### Bluma導入
1. `npm install bulma --save-dev`
1. `app.scss` に`@import '~bulma/bulma';` を追記
1. `npm run dev`
1. viewファイルで`app.css` を読み込む(例:`<link rel="stylesheet" href="{{ mix('css/app.css') }}">`)
### jquery導入
1. `npm install jquery popper.js --save-dev`
1. `resources/js/bootstrap.js` に追記
```javascript
window.Popper = require('popper.js').default;
window.$ = window.jQuery = require('jquery');
```
1. `npm run dev`
### Vuejs導入
1. `npm install vue --save-dev`
1. `webpack.mix.js` に追記
```javascript
mix.js('resources/js/app.js', 'public/js')
+ .vue()
```
1. `recources/js/app.js` を編集
```javascript
import './bootstrap'
import Vue from 'vue'
new Vue({
el: '#app',
template: '<p>hello vue</p>'
});
```
1. viewファイルに`app.js`読み込み、及び app id ブロックを追記
```html
<body>
<div id="app"></div>
<script src="{{ mix('js/app.js') }}"></script>
</body>
```
1. `npm run dev`
### typescript導入
1. `npm install --save-dev typescript @types/node @types/react @types/react-dom`
1. `./node_modules/.bin/tsc --init` で`tsconfig.json`を生成
※ reactを使用する場合、`tsconfig.json`の`jsx`に`react`を設定する。
1. `webpack.mix.js`を修正
```js
mix.ts('resources/ts/app.tsx', 'public/js')
.sass('resources/sass/app.scss', 'public/css')
.version();
```
1. `resources/ts/app.tsx`を作成
```js
import React from 'react';
import ReactDOM from 'react-dom';
const App: React.FC = () => (<div>Hello World</div>)
if (document.getElementById('app')) {
ReactDOM.render(<App />, document.getElementById('app'));
}
```
1. viewファイルに`app.js`読み込み、及び app id ブロックを追記
```html
<body>
<div id="app"></div>
<script src="{{ mix('js/app.js') }}"></script>
</body>
```
1. `npm run dev`
### browserSync有効
1. `webpack.mix.js` を修正
```js
mix.browserSync('localhost:8000')
.js('resources/js/app.js', 'public/js')
.react()
.sass('resources/sass/app.scss', 'public/css')
.version()
.disableNotifications();
```
1. `php artisan serve` でサーバー起動
1. `npm run watch` で監視開始
### Laravel Mix OS通知無効
`webpack.mix.js`
```js
mix.js('resources/js/app.js', 'public/js')
.sass('resources/sass/app.scss', 'public/css')
.disableNotifications(); // OS通知無効
```
### Laravel-admin導入
1. `composer require encore/laravel-admin`
1. `php artisan vendor:publish --provider="EncoreAdminAdminServiceProvider"`
1. `php artisan admin:install`
1. ログインして確認(admin / admin)
#### 機能追加
1. コントローラー作成
```
php artisan admin:make UserController --model=App\User
```
1. `app/Admin/routes.php`にルート追加
```php
+ $router->resource('manager/users', UserController::class);
```
1. Admin>Menuからメニューを追加
#### 設定エクスポート
`php artisan admin:export-seed`
#### 参考
- https://enjoyworks.jp/tech-blog/7298
- https://qiita.com/reopa_sharkun/items/0d1a81ac1967783ae470
***
## 環境設定
### sqlite使用
1. `.env` 修正
```
- DB_CONNECTION=mysql
- DB_HOST=127.0.0.1
- DB_PORT=3306
- DB_DATABASE=laravel
- DB_USERNAME=root
- DB_PASSWORD=
+ DB_CONNECTION=sqlite
```
1. `database` ディレクトリ直下に `database.sqlite` ファイルを作成
### ドキュメントルートを変更する場合のhtaccess
```ini
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^$ public/index.php [L]
RewriteRule ^(.+)$ public/$1 [L]
</IfModule>
```
### 日本語化
1. `config/app.php`を修正
```
- 'timezone' => 'UTC',
+ 'timezone' => 'Asia/Tokyo',
- 'locale' => 'en',
+ 'locale' => 'ja',
```
1. 日本語ファイルダウンロード
```
php -r "copy('https://readouble.com/laravel/6.x/ja/install-ja-lang-files.php', 'install-ja-lang.php');"
```
```
php -f install-ja-lang.php
```
```
php -r "unlink('install-ja-lang.php');"
```
## テスト
### テスト用データベース使用
1. テスト用データベースを用意(`database/test.sqlite' 等)
1. テスト用環境設定ファイル `env.testing` を作成
```[env]
APP_ENV=testing
APP_KEY=空
DB_CONNECTION=sqlite
DB_DATABASE=database/test.sqlite
```
1. `php artisan config:clear`
1. `php artisan key:generate --env=testing`
1. `php artisan migrate --seed --env=testing`
### テスト作成と実行
1. `php artisan make:test UserTest`
1. `php .\artisan test tests/Feature/UserTest.php`