iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 9
0
Modern Web

Laravel學習系列 第 9

LARAVEL學習 DAY 9 CRUD FOR WEB (一)

進度規劃ing... 請有耐心的各位慢慢等待...

LARAVEL學習 DAY 9 CRUD FOR WEB (一)

前言

太久沒寫了 都忘記文章怎麼寫...
臥病寫文章ing 寫出什麼垃圾文章也不能怪我了(藉口一堆)

正文

上上次已經建立了一個Controller了 接下來我們就先建立一個給CRUD用的模板
不過在那之前我們先把上次的檔名換一下
resources\views\layouts\app.blade.php改成別的什麼都好 因為之後會用到這個檔名...
之後建立一個resources\views\layouts\CRUD.blade.php

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>@yield('title')</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="{{ asset('css/app.css') }}">
    <script src="{{ asset('js/app.js') }}"></script>
</head>

<body>
    <nav class="navbar navbar-default">
        <div class="container-fluid">
            <div class="navbar-header">
                <a class="navbar-brand" href="#">IRONMAN</a>
            </div>
        </div>
    </nav>
    <div class="container-fluid">
        @yield('content')
    </div>
</body>

</html>

這樣大家就知道其他頁面只要專心在那頁該做的事情上了

然後幫我把這傢伙resources\views\crud\index.blade.php也改個名 因為之後也用得到這個檔名... (Day8的我在裝忙)

再來我們就來到app\Http\Controllers\Web\CRUDController.php的create跟store這兩個function(因為這次只講Create的部分)
然後根據我第六天講過的東西 我們要先建立一個Repository
整個Controller會長得像這樣
前面有一段是在進行dependency injection的動作

<?php

namespace App\Http\Controllers\Web;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Repositories\CRUDRepository;

class CRUDController extends Controller
{
    protected $CRUDRepo;

    public function __construct(CRUDRepository $CRUDRepo) {
        $this->CRUDRepo = $CRUDRepo;
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        return view('crud.create');
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $data = $request->only('title', 'content');
        $post = $this->CRUDRepo->create($data);
        return redirect()->route('crud.show', $post->id);
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}

接下來還要建立一個Repository
app\Repositories\CRUDRepository.php

<?php

namespace App\Repositories;

use App\Entities\CRUD;

class CRUDRepository
{
    public function create($data)
    {
        return CRUD::create($data);
    }
}

接下來我們來建立一個很醜很醜的新增頁面
resources\views\crud\create.blade.php

@extends('layouts.CRUD')
@section('title', '新增')
@section('content')
<form action="{{ route('crud.store') }}" method="post">
    {{ csrf_field() }}
    <div class="form-group">
        <label for="title">標題</label>
        <input type="text" class="form-control" name="title">
    </div>
    <div class="form-group">
        <label for="content">內容</label>    
        <textarea class="form-control" name="content" cols="30" rows="10"></textarea>
    </div>
    <button type="submit" class="btn btn-primary">送出</button>
</form>
@endsection

先來解釋一下form的route 用了這個之後 管你路由那邊怎麼改 只要名字對了 就不用改這邊了 是個很方便的東西 還可以避免一堆鬼打牆
再來就是csrf 這個東西以前在開api的時候是個麻煩 不過自從5.4之後web跟api切開來 用不同的middleware之後就不是什麼太大的問題了
反正那行就是用來防止csrf攻擊所建立在web的一個東西 如果那行拿掉的話Laravel就會跳一個錯誤給你看

之後我們就可以來送出我們的文章了

送完之後如果一切正常 接下來就會成功轉址(Controller)然後就會看到一個白畫面

因為那個頁面還沒有做XDD 下次再來做唄

等等 忘了說 剛剛撞到一個Laravel的bug 看起來就是c_r_u_ds跟c_r_u_d_s之間的誤會...
migration那邊的命名是前面 但是Model採用的是後面 為了避免重建資料表的麻煩 直接改Model好了
app\Entities\CRUD.php
直接在class裡新增這行就好了

protected $table = 'c_r_u_ds';

結語

真的抱歉了 接下來文章內容會大幅縮短 因為沒想到期末還一堆事 加上要拿來趕文章的時間又感冒(咳咳)
希望下次會更好...


上一篇
LARAVEL學習 DAY 8 CRUD(續)BLADE?
下一篇
LARAVEL學習 DAY 10 CRUD FOR WEB (二)
系列文
Laravel學習30

尚未有邦友留言

立即登入留言