laravel5.5 + react完成简单的CRUD
laravel5.5 + react完成简单的CRUD在这篇文章中,我想和大家分享如何在PHP Laravel框架中使用js来创建crud(Create Read Update Delete)应用程序。在这个例子中,您可以学习如何为laravel reactjs应用程序构建设置,我还使用axios post请求,获取请求,放入请求和删除请求来插入更新删除应用程序。 教程大概分为如下9步
1. 安装laravel5.51.1 创建项目composer create-project laravel/laravel laravel-react --prefer-dist 1.2 修改数据库配置创建数据库并修改配置文件 cd laravel-react vim .env 1.3 创建文章迁移表及模型php artisan make:model Post -m
这样就创建好了 当然你也可以分两步执行 // 创建Post 模型 php artisan make:model Post // 创建posts表 php artisan make:migration create_posts_table 修改迁移文件的 public function up() { Schema::create('posts',function (Blueprint $table) { $table->increments('id'); $table->string('title'); $table->text('content'); $table->timestamps(); }); } 执行迁移 php artisan migrate
修改 <?php namespace App; use IlluminateDatabaseEloquentModel; class Post extends Model { protected $fillable = [ 'title','body' ]; } 1.4 创建web路由和api路由
Route::get('/',function () { return view('welcome'); });
Route::resource('posts','PostController'); 1.5 创建PostControllerphp artisan make:controller PostController --resource
修改 <?php namespace AppHttpControllers; use IlluminateHttpRequest; use AppPost; class PostController extends Controller { /** * Display a listing of the resource. * * @return IlluminateHttpResponse */ public function index() { $data = Post::all(); return response()->json($data); } /** * Show the form for creating a new resource. * * @return IlluminateHttpResponse */ public function create(Request $request) { $data = new Post([ 'title' => $request->get('title'),'content' => $request->get('content') ]); $data->save(); return response()->json('添加成功 :)'); } /** * Store a newly created resource in storage. * * @param IlluminateHttpRequest $request * @return IlluminateHttpResponse */ public function store(Request $request) { $data = new Post([ 'title' => $request->get('title'),'content' => $request->get('content') ]); $data->save(); return response()->json('保存成功 :)'); } /** * Display the specified resource. * * @param int $id * @return IlluminateHttpResponse */ public function show($id) { // } /** * Show the form for editing the specified resource. * * @param int $id * @return IlluminateHttpResponse */ public function edit($id) { $data = Post::find($id); return response()->json($data); } /** * Update the specified resource in storage. * * @param IlluminateHttpRequest $request * @param int $id * @return IlluminateHttpResponse */ public function update(Request $request,$id) { $data = Post::find($id); $data->title = $request->get('title'); $data->content = $request->get('content'); $data->save(); return response()->json('修改成功 :)'); } /** * Remove the specified resource from storage. * * @param int $id * @return IlluminateHttpResponse */ public function destroy($id) { $data = Post::find($id); $data->delete(); return response()->json('删除成功 :)'); } } 2. 安装ReactJS修改前端预置 php artisan preset react npm 安装 npm install 运行 npm run dev 安装 npm install react-router@2.8.1 3. 创建React组件文件我们需要创建的文件列表如下:
require('./bootstrap'); import React from 'react'; import { render } from 'react-dom'; import { Router,Route,browserHistory } from 'react-router'; import Master from './components/Master'; import CreatePost from './components/CreatePost'; import DisplayPost from './components/DisplayPost'; import UpdatePost from './components/UpdatePost'; render( <Router history={browserHistory}> <Route path="/" component={Master} > <Route path="/add-item" component={CreatePost} /> <Route path="/display-item" component={DisplayPost} /> <Route path="/edit/:id" component={UpdatePost} /> </Route> </Router>,document.getElementById('crud-app'));
window._ = require('lodash'); try { window.$ = window.jQuery = require('jquery'); require('bootstrap-sass'); } catch (e) {} window.axios = require('axios'); window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; let token = document.head.querySelector('meta[name="csrf-token"]'); if (token) { window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content; } else { console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token'); }
import React,{Component} from 'react'; import {browserHistory} from 'react-router'; import MyGlobleSetting from './MyGlobleSetting'; class CreatePost extends Component { constructor(props){ super(props); this.state = {postTitle: '',postContent: ''}; this.handleChange1 = this.handleChange1.bind(this); this.handleChange2 = this.handleChange2.bind(this); this.handleSubmit = this.handleSubmit.bind(this); } handleChange1(e){ this.setState({ postTitle: e.target.value }) } handleChange2(e){ this.setState({ postContent: e.target.value }) } handleSubmit(e){ e.preventDefault(); const posts = { title: this.state.postTitle,content: this.state.postContent } let uri = MyGlobleSetting.url + '/api/posts'; axios.post(uri,posts).then((response) => { browserHistory.push('/display-item'); }); } render() { return ( <div> <h1>Create Post</h1> <form onSubmit={this.handleSubmit}> <div className="row"> <div className="col-md-6"> <div className="form-group"> <label>Post Title:</label> <input type="text" className="form-control" onChange={this.handleChange1} /> </div> </div> </div> <div className="row"> <div className="col-md-6"> <div className="form-group"> <label>Post Content:</label> <textarea className="form-control col-md-6" onChange={this.handleChange2}></textarea> </div> </div> </div><br /> <div className="form-group"> <button className="btn btn-primary">Add Post</button> </div> </form> </div> ) } } export default CreatePost;
import React,{Component} from 'react'; import axios from 'axios'; import { Link } from 'react-router'; import TableRow from './TableRow'; import MyGlobleSetting from './MyGlobleSetting'; class DisplayPost extends Component { constructor(props) { super(props); this.state = {value: '',posts: ''}; } componentDidMount(){ axios.get(MyGlobleSetting.url + '/api/posts') .then(response => { this.setState({ posts: response.data }); }) .catch(function (error) { console.log(error); }) } tabRow(){ if(this.state.posts instanceof Array){ return this.state.posts.map(function(object,i){ return <TableRow obj={object} key={i} />; }) } } render(){ return ( <div> <h1>Post</h1> <div className="row"> <div className="col-md-10"></div> <div className="col-md-2"> <Link to="/add-item">Create Post</Link> </div> </div><br /> <table className="table table-hover"> <thead> <tr> <td>ID</td> <td>Post Title</td> <td>Post Content</td> <td width="200px">Actions</td> </tr> </thead> <tbody> {this.tabRow()} </tbody> </table> </div> ) } } export default DisplayPost;
import React,{Component} from 'react'; import { Router,Link } from 'react-router'; class Master extends Component { render(){ return ( <div className="container"> <nav className="navbar navbar-default"> <div className="container-fluid"> <div className="navbar-header"> <a className="navbar-brand" href="https://www.bear777.com">bear777.com</a> </div> <ul className="nav navbar-nav"> <li><Link to="/">Home</Link></li> <li><Link to="add-item">Create Post</Link></li> <li><Link to="display-item">Post List</Link></li> </ul> </div> </nav> <div> {this.props.children} </div> </div> ) } } export default Master;
class MyGlobleSetting { constructor() { this.url = 'http://localhost:8000'; } } export default (new MyGlobleSetting);
import React,{ Component } from 'react'; import { Link,browserHistory } from 'react-router'; import MyGlobleSetting from './MyGlobleSetting'; class TableRow extends Component { constructor(props) { super(props); this.handleSubmit = this.handleSubmit.bind(this); } handleSubmit(event) { event.preventDefault(); let uri = MyGlobleSetting.url + `/api/posts/${this.props.obj.id}`; axios.delete(uri); browserHistory.push('/display-item'); } render() { return ( <tr> <td> {this.props.obj.id} </td> <td> {this.props.obj.title} </td> <td> {this.props.obj.content} </td> <td> <form onSubmit={this.handleSubmit}> <Link to={"edit/"+this.props.obj.id} className="btn btn-primary">Edit</Link> <input type="submit" value="Delete" className="btn btn-danger"/> </form> </td> </tr> ); } } export default TableRow;
import React,{Component} from 'react'; import axios from 'axios'; import { Link } from 'react-router'; import MyGlobleSetting from './MyGlobleSetting'; class UpdatePost extends Component { constructor(props) { super(props); this.state = {title: '',content: ''}; this.handleChange1 = this.handleChange1.bind(this); this.handleChange2 = this.handleChange2.bind(this); this.handleSubmit = this.handleSubmit.bind(this); } componentDidMount(){ axios.get(MyGlobleSetting.url + `/api/posts/${this.props.params.id}/edit`) .then(response => { this.setState({ title: response.data.title,content: response.data.content }); }) .catch(function (error) { console.log(error); }) } handleChange1(e){ this.setState({ title: e.target.value }) } handleChange2(e){ this.setState({ content: e.target.value }) } handleSubmit(event) { event.preventDefault(); const posts = { title: this.state.title,content: this.state.content } let uri = MyGlobleSetting.url + '/api/posts/'+this.props.params.id; axios.patch(uri,posts).then((response) => { this.props.history.push('/display-item'); }); } render(){ return ( <div> <h1>Update Post</h1> <div className="row"> <div className="col-md-10"></div> <div className="col-md-2"> <Link to="/display-item" className="btn btn-success">Return to Post</Link> </div> </div> <form onSubmit={this.handleSubmit}> <div className="form-group"> <label>Post Title</label> <input type="text" className="form-control" value={this.state.title} onChange={this.handleChange1} /> </div> <div className="form-group"> <label name="post_content">Post Content</label> <textarea className="form-control" onChange={this.handleChange2} value={this.state.content}></textarea> </div> <div className="form-group"> <button className="btn btn-primary">Update</button> </div> </form> </div> ) } } export default UpdatePost; 4. 创建主视图文件
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Laravel 5.5 ReactJS CRUD Example</title> <link href="{{asset('css/app.css')}}" rel="stylesheet" type="text/css"> </head> <body> <div id="crud-app"></div> <script src="{{asset('js/app.js')}}" ></script> </body> </html> 为了避免 <meta name="csrf-token" content="{{ csrf_token() }}"> <script> window.Laravel = <?php echo json_encode([ 'csrfToken' => csrf_token(),]); ?> </script> 完整视图 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="csrf-token" content="{{ csrf_token() }}"> <title>Laravel 5.5 ReactJS CRUD Example</title> <link href="{{asset('css/app.css')}}" rel="stylesheet" type="text/css"> <script> window.Laravel = <?php echo json_encode([ 'csrfToken' => csrf_token(),]); ?> </script> </head> <body> <div id="crud-app"></div> <script src="{{asset('js/app.js')}}" ></script> </body> </html> 5. 编译&运行编译 npm run dev artisan运行项目 php artisan serve 访问 http://localhost:8000 即可 效果图
主要参考资料 Laravel 5.5 ReactJS Tutorial (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |