Recipe-box 控制器设计

创建控制器(创建完成之后生成的文件在 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, '图片没有上传');
        }
        $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' => '食谱创建成功!'
        ]);
    }
    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
        ]);
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容