Laravelでよく使う処理を一通りまとめていこうと思います。
今回は画像アップロードです!
画像を保存するストレージへのリンクを作成
1 |
php artisan storage:link |
これでstorageフォルダに公開ディレクトリpublicへのリンクが張れて公開が可能になります。
プロジェクトに移動してプロフィール画像を保存するディレクトリの作成
1 2 |
cd project/ mkdir ./public/storage/profile |
コントローラの作成
1 |
php artisan make:controller PeopleController |
project/app/Http/Controllers/PersonController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests\PersonRequest; use App\Models\Person; class PersonController extends Controller { public function user_list(){ $people = new Person(); $users = $people->select(); return view('users.list', ['users' => $users]); } public function user_add(){ return view('users.add'); } public function user_create(Request $request){ $people = new Person(); $people->create($request); return redirect('/'); } } |
モデルの作成
1 2 |
mkdir ./app/Models php artisan make:model models/Person |
追加を実行するcreate()メソッドをModelに作ります。
project/app/Models/Person.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\DB; use Illuminate\Http\Request; class Person extends Model { protected $table = 'people'; protected $guarded = array('id'); public function select(){ $users = DB::table('people') ->join('category' , 'people.category_id', '=', 'category.id' ) ->join('prefectures', 'people.prefectures_id', '=', 'prefectures.id' ) ->join('generation', 'people.generation_id', '=', 'generation.id' ) ->select('people.*', 'category.category_name', 'prefectures.prefectures_name', 'generation.generation_name') ->orderBy('people.updated_at', 'DESC') ->paginate(3); return $users; } public function create($request){ $param = [ "people_name" => $request->name, "generation_id" => $request->generation, "category_id" => $request->category, "prefectures_id" => $request->prefectures, "password" => $request->password, "email" => $request->email, 'created_at' => now(), 'updated_at' => now(), ]; if(isset($request->file)) { //画像を保存 $param["image"] = $request->file('image')->getClientOriginalName(); $request->file('image')->storeAs('profile', $param['image'], 'public'); }else{ $param["image"] = ""; } //DBに保存 DB::insert('INSERT INTO people (people_name, generation_id, category_id, prefectures_id, comment, image, password, email, created_at, updated_at) VALUES(:people_name, :generation_id, :category_id, :prefectures_id, :comment, :image, :password, :email, :created_at, :updated_at)', $param); } } |
ビューの作成
フォーム作成用のパッケージをインストールする
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ vi /var/www/vhosts/example.net/httpdocs/project/composer.json (略) "require": { "php": "^7.1.3", "fideloper/proxy": "^4.0", "laravel/framework": "5.7.*", "laravel/tinker": "^1.0", "laravelcollective/html": "~5.0" ←追加 }, (略) |
1 |
project]$ composer update |
project/resources/views/users/add.blade.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
(略) <table class="table table-striped table-hover"> <thead> </thead> {{Form::open(['action' => 'PersonController@user_create', 'files' => true])}} {{ csrf_field() }} //画像以外の入力項目は省略しています。 <tr><th>画像</th><td>{{ Form::file('image') }}</td></tr> <tr><th></th><td>{{Form::submit()}}</td></tr> {{Form::close()}} </tbody> </table> (略) |
これで画像を表示させることが出来る
1 |
<img class="card-img-top" width="90" height="115" src="/images/画像名" alt=""> |
実際はforeachなどで回して取得したり、id指定したり。
DBに画像の値が入っていない場合はnoimage.jpgを表示させる処理も。
1 2 3 4 5 6 7 8 9 |
@foreach($users as $user) @if($user->image == null) <td width="10%"><img class="card-img-top" width="90" height="115" src="/storage/profile/noimage.jpg" alt=""></td> @else <td width="10%"><img class="card-img-top" width="90" height="115" src="/storage/profile/{{ $user->image }}" alt=""></td> @endif @endforeach |
ルーティングの設定
project/routes/web.php
1 2 |
Route::get('/add', 'PersonController@user_add'); Route::post('/add', 'PersonController@user_create'); |
http://ホスト名/add
お疲れ様です。