Recipe-box 控制器設(shè)計(jì)

創(chuàng)建控制器(創(chuàng)建完成之后生成的文件在 app/Http/Controllers/ 下)

>php artisan make:controller AuthController
>php artisan make:controller RecipeController

添加路由 (路徑:routes/api.php)

<?php
Route::post('/register', 'AuthController@register');
Route::post('/login', 'AuthController@login');
Route::post('/logout', 'AuthController@logout');

Route::resource('recipes', 'RecipeController');

修改 AuthController.php 控制器

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\User;
use Hash;
class AuthController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth:api')->only('logout');
    }
    public function register(Request $request){
        $this->validate($request, [
            'name' => 'required|max:255',
            'email' => 'required|email|unique:users',
            'password' => 'required|between:6,25|confirmed'
        ]);
        $user = new User($request->all());
        $user->password = bcrypt($request->password);
        $user->save();
        return response()->json([
            'registered' => true
        ]);
    }
    public function login(Request $request){
        $this->validate($request, [
            'email' => 'required|email',
            'password' => 'required|between:6,25'
        ]);
        $user = User::where('email', $request->email)->first();
        if($user && Hash::check($request->password, $user->password)){
            $user->api_token = str_random(60);
            $user->save();
            return response()->json([
                'authenticated' => true,
                'api_token' => $user->api_token,
                'user_id' => $user->id
            ]);
        }
        return response()->json([
            'email' => '提供的電子郵件和密碼不匹配!'
        ], 422);
    }
    public function logout(Request $request){
        $user = $request->user();
        $user->api_token = null;
        $user->save();
        return response()->json(['logged_out' => true]);
    }
}

修改RecipeController.php 控制器

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Recipe;
use App\RecipeIngredient;
use App\RecipeDirection;
use File;
class RecipeController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth:api')->except('index', 'show');
    }
    public function index(){
        $recipes = Recipe::orderBy('created_at','desc')->get(['name','image','id']);
        return response()->json(['recipes' => $recipes]);
    }
    public function create(){
        $form = Recipe::form();
        return response()->json(['form' => $form]);
    }
    public function store(Request $request){
        $this->validate($request, [
           'name' => 'required|max:255',
           'description' => 'required|max:3000',
           'image' => 'required|image',
           'ingredients' => 'required|array|min:1',
           'ingredients.*.name' => 'required|max:255',
           'ingredients.*.qty' => 'required|max:255',
           'directions' => 'required|array|min:1',
           'directions.*.description' => 'required|max:3000'
        ]);
        $ingredients = [];
        foreach ($request->ingredients as $ingredient){
            $ingredients[] = new RecipeIngredient($ingredient);
        }
        $directions = [];
        foreach ($request->directions as $direction){
            $directions[] = new RecipeDirection($direction);
        }
        if(!$request->hasFile('image') && !$request->file('image')->isValid()){
            return abort(404, '圖片沒(méi)有上傳');
        }
        $filename = $this->getFileName($request->image);
        $request->image->move(base_path('public/images'), $filename);
        $recipe = new Recipe($request->all());
        $recipe->image = $filename;
        $request->user()->recipes()->save($recipe);
        $recipe->directions()->saveMany($directions);
        $recipe->ingredients()->saveMany($ingredients);
        return response()->json([
            'saved' =>true,
            'id' => $recipe->id,
            'filename' => $filename,
            'message' => '食譜創(chuàng)建成功满粗!'
        ]);
    }
    protected function getFileName($file){
        return str_random(32).'.'.$file->extension();
    }
    public function show($id){
        $recipe = Recipe::with(['user','ingredients', 'directions'])->findOrFail($id);
        return response()->json(['recipe' => $recipe]);
    }
    public function edit($id, Request $request){
        $form = $request->user()->recipes()
            ->with(['ingredients' => function($query){
                $query->get(['id','name','qty']);
            }, 'directions' => function($query){
                $query->get(['id','description']);
            }])
            ->findOrFail($id, [
                'id','name','description','image'
            ]);
        return response()->json(['form' => $form]);
    }
    public function update($id, Request $request){
        $this->validate($request, [
            'name' => 'required|max:255',
            'description' => 'required|max:3000',
            'image' => 'image',
            'ingredients' => 'required|array|min:1',
            'ingredients.*.id' => 'integer|exists:recipe_ingredients',
            'ingredients.*.name' => 'required|max:255',
            'ingredients.*.qty' => 'required|max:255',
            'directions' => 'required|array|min:1',
            'directions.*.id' => 'integer|exists:recipe_directions',
            'directions.*.description' => 'required|max:3000'
        ]);
        $recipe = $request->user()->recipes()->findOrFail($id);
        $ingredients = [];
        $ingredientsUpdated = [];
        foreach ($request->ingredients as $ingredient){
            if(isset($ingredient['id'])){
                RecipeIngredient::where('recipe_id', $recipe->id)
                    ->where('id', $ingredient['id'])
                    ->update($ingredient);
                $ingredientsUpdated[] = $ingredient['id'];
            }else{
                $ingredients[] = new RecipeIngredient($ingredient);
            }
        }
        $directions = [];
        $directionsUpdated = [];
        foreach ($request->directions as $direction){
            if(isset($direction['id'])){
                RecipeDirection::where('recipe_id', $recipe->id)
                    ->where('id', $direction['id'])
                    ->update($direction);
                $directionsUpdated[] = $direction['id'];
            }else{
                $directions[] = new RecipeDirection($direction);
            }
        }
        $recipe->name = $request->name;
        $recipe->description = $request->description;
        if($request->hasFile('image') && $request->file('image')->isValid()){
            $filename = $this->getFileName($request->image);
            $request->image->move(base_path('public/images'),$filename);
            File::delete(base_path('public/images/'.$recipe->image));
            $recipe->image = $filename;
        }
        $recipe->save();
        RecipeIngredient::whereNotIn('id', $ingredientsUpdated)
            ->where('recipe_id', $recipe->id)->delete();
        RecipeDirection::whereNotIn('id', $directionsUpdated)
            ->where('recipe_id', $recipe->id)->delete();
        if(count($ingredients)){
            $recipe->ingredients()->saveMany($ingredients);
        }
        if(count($ingredients)){
            $recipe->directions()->saveMany($directions);
        }
        return response()->json([
            'saved' => true,
            'id' => $recipe->id,
            'message' => '更新食譜成功!'
        ]);
    }
    public function destroy($id, Request $request){
        $recipe = $request->user()->recipes()->findOrFail($id);
        RecipeIngredient::where('recipe_id', $recipe->id)->delete();
        RecipeDirection::where('recipe_id', $recipe->id)->delete();
        File::delete(base_path('public/images/'.$recipe->image));
        $recipe->delete();
        return response()->json([
            'deleted' => true
        ]);
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末愚争,一起剝皮案震驚了整個(gè)濱河市映皆,隨后出現(xiàn)的幾起案子挤聘,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缭裆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)炉擅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)快鱼,“玉大人线罕,你說(shuō)我怎么就攤上這事袄琳¢倭ぃ” “怎么了介陶?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)玻墅。 經(jīng)常有香客問(wèn)我囚似,道長(zhǎng)徐伐,這世上最難降的妖魔是什么摸屠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任刻蚯,我火速辦了婚禮逃顶,結(jié)果婚禮上盈蛮,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好十性,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布斑鸦。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪菌湃。 梳的紋絲不亂的頭發(fā)上纯路,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天杯拐,我揣著相機(jī)與錄音霞篡,去河邊找鬼盐欺。 笑死冗美,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播樊破,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起源武,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤扼褪,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后粱栖,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體话浇,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年闹究,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了幔崖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖赏寇,靈堂內(nèi)的尸體忽然破棺而出吉嫩,到底是詐尸還是另有隱情,我是刑警寧澤嗅定,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布自娩,位于F島的核電站,受9級(jí)特大地震影響渠退,放射性物質(zhì)發(fā)生泄漏忙迁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一碎乃、第九天 我趴在偏房一處隱蔽的房頂上張望姊扔。 院中可真熱鬧,春花似錦梅誓、人聲如沸恰梢。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)删豺。三九已至,卻和暖如春愧怜,著一層夾襖步出監(jiān)牢的瞬間呀页,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留桦山,地道東北人峭跳。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像丸氛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子著摔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理缓窜,服務(wù)發(fā)現(xiàn),斷路器谍咆,智...
    卡卡羅2017閱讀 134,656評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,127評(píng)論 25 707
  • 一摹察、簡(jiǎn)述 撰寫(xiě)結(jié)構(gòu)與開(kāi)發(fā)思維恩掷,是在產(chǎn)品需求文檔基礎(chǔ)上,需進(jìn)一步提升的核心基本功供嚎。而這個(gè)基本功黄娘,決定著能否輸出高度模...
    倒?fàn)?01閱讀 4,139評(píng)論 1 44
  • 安安靜靜 呆在這里 聆聽(tīng) 自然的聲音 風(fēng)吹動(dòng)身邊的草葉 水面泛起細(xì)細(xì)波紋 不知道 那朵菜花開(kāi)了幾分 不知道 天空何...
    Silvenli閱讀 180評(píng)論 2 8
  • 化一壺好酒逼争、品一生滋味优床、幾個(gè)老友、說(shuō)著說(shuō)著就老了氮凝。 我們要去環(huán)游世界羔巢、對(duì)、我們就是要去環(huán)游世界罩阵、去和這個(gè)世界好好談...
    夏小希閱讀 552評(píng)論 0 0