Vue.jsからReactに切り替える
LaravelのデフォルトのJSフレームワークはVueですが、簡単にReactに切り替えることができます。
新規プロジェクトを作成したらartisan preset reactコマンドを実行するだけです。
$ composer create-project laravel/laravel laravel-react$ cd laravel-react$ php artisan preset react切り替えたらnpmインストールします。
$ npm installこれでReactを使用する準備が整いました。
下記コマンドでJSファイルの保存を監視&ビルドして進めます。
$ npm watchコンポーネントの切り替え
Webルーティングでページ毎に別のReactコンポーネントを表示してみます。
TaskとProjectの2つのコンポーネントファイルを作成します。
import React, { Component } from 'react';import ReactDOM from 'react-dom';
export default class Task extends Component { render() { return ( <div> <p>タスク</p> </div> ); }}
if (document.getElementById('task')) { ReactDOM.render(<Task />, document.getElementById('task'));}Projectコンポーネントも同じように作成してください。
次に、app.jsで作成したコンポーネントを読み込みます。
require('./components/Task');require('./components/Project');これでビュー(html)でidがtaskの場合Taskコンポーネントが表示され、idがprojectの場合はProjectコンポーネントが表示されます。
Laravelのビューファイルを作成し、それぞれのidでdivを配置します。
@extends('layout')@section('content') <h1>タスク</h1> <div id="task"></div>@endsectionresources/views/project.blade.phpも同じように作成してください。 これでそれぞれのページでコンポーネントが読み込まれるようになります。
最後にwebルーティングを設定して、作成したビューファイルが読み込まれるようにします。
Route::get('/tasks', function () { return view('task');});Route::get('/projects', function () { return view('project');});Laravelのデータを表示する
ReactコンポーネントでLaravelのデータを表示してみます。
例えばこんなモデルがあるとします。
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Task extends Model{ protected $fillable = [ 'title' ];}コントローラーはApiディレクトリを作成してその中に入れます。
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;use App\Models\Task;use App\Http\Controllers\Controller;
class TaskController extends Controller{ public function index() { return Task::all(); }}Reactからアクセスするルーティングはroutes/api.phpに書きます。
Route::get('/tasks', 'Api\TaskController@index');これでapi/tasksで一覧がjsonで取得できるようになります。
Taskコンポーネントを下記のようにすれべ、データの取得表示をできるようになります。
import React, { Component } from 'react';import ReactDOM from 'react-dom';import axios from "axios";
export default class Task extends Component { constructor() { super(); this.state = { tasks: [] }; } componentDidMount() { axios .get('/api/tasks') .then(response => { this.setState({ tasks: response.data });
}).catch(error => { console.log(error); }); } render() { const list = this.state.tasks.map((item) => { return <li key={item.id}>{item.title}</li>; }); return ( <div> <ul className="task-list"> {list} </ul> </div> ); }}
if (document.getElementById('task')) { ReactDOM.render(<Task />, document.getElementById('task'));}ログイン時のみデータを取得
今の所APIには誰でもアクセスできますが、ログインしたユーザーだけ見られるようにしましょう。
make:authで通常のLaravelのユーザー登録&ログイン機能を使えるようにします。
$ php artisan make:auth今回、APIは内部からのアクセスしないのでapiをそのまま置き換えます。
Kernel.phpの$middlewareGroupsのapi部分を下記のように置き換えます。
protected $middlewareGroups = [ // ....
'api' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, 'throttle:60,1', 'bindings', ],];APIルーターを通常のAuthミドルウェアで囲んで完成です。
Route::group(['middleware' => 'auth'], function () { Route::get('/tasks', 'Api\TaskController@index');});以上、いきなりSPAでリニューアルだ!とかだと難易度高いと思うので、少しづつReactを組み込むみたいなのでもいいのかなと思いました。



