簡體   English   中英

Laravel-將控制器功能用於兩種不同的口才模型

[英]Laravel - Using controller function for two different eloquent models

我目前正在為印迪電影制作公司開發應用程序。 我現在擁有工作流程的方式是,用戶首先通過輸入電影標題和簡介來創建一個新的電影對象。 然后,用戶可以從那里添加更多詳細信息,例如價格,運行時間,全屏/寬屏等。電影基本信息(標題,簡介)在一個數據庫表中,而詳細信息在另一個數據庫表中。 我在兩個雄辯的模型之間建立了一對一的關系。 我還設置了一個MovieController,使我可以非常輕松地對影片基本模型執行CRUD操作,並且在向用戶顯示影片對象時,我可以同時顯示基本信息和詳細信息。

我想知道是否有某種方法可以使用影片控制器中已經存在的功能對影片細節進行CRUD操作,而不必在控制器中創建新功能? 還可以重用我為每個對應的CRUD操作創建的視圖嗎? 換句話說我可以

something.dev/cms/create

在一種情況下,匹配以創建新電影(標題,簡介),在另一種情況下以匹配創建電影細節(價格,運行時間,全屏/寬屏)等。這可能嗎? 我提供了以下兩個模型的代碼:

Movie_basic.php

<?php namespace App;

use Illuminate\Database\Eloquent\Model;

class Movie_basic extends Model {

    protected $fillable = ['movie_title', 'movie_synopsis'];

    protected $guarded = ['id'];

    public function details()
    {
        return $this->hasOne('App\Movie_detail', 'movie_id');
    }

    public function personnel()
    {
        return $this->hasMany('App\Movie_personnel', 'movie_id');
    }
}

Model_detail.php

<?php namespace App;

use Illuminate\Database\Eloquent\Model;

class Movie_detail extends Model {

    protected $fillable = ['minutes', 'languages', 'viewer_discretion', 'screen_type', 'price'];

    protected $guarded = ['id', 'movie_id'];

    public function basics()
    {
        return $this->belongsTo('App\Movie_basic');
    }

}

如果我了解您,這可能是答案。 (未測試代碼。)

請注意,該代碼已編寫為向您展示了一個示例。 您可能需要對其進行編輯,以使其正常工作並按您希望的方式運行。 也許您想使用存儲庫或自動創建模型實例(我沒有創建新實例)並保存流程。 您可以使用接口而不是模型等...

這是存儲邏輯的服務。

<?php
use Movie_basic; use Movie_detail;

Class MovieService {

    protected $movieBasic;
    protected $movieDetail;

    public function __construct(Movie_basic $movieBasic, Movie_detail $movieDetail) {

        $this->movieBasic = $movieBasic;
        $this->movieDetail = $movieDetail;

    }

    public function createMovie(array $attr) {

        // TODO: Move your business logic here.
        // E.g 
        $movie = $this->movieBasic->fill($attr); 
        $movie->save();
        return $movie;

    }

    public function createMovieDetail(array $movieAttr, array $attributes) {

        // TODO: Move your detail logic here.
        // E.g. 
        $basic = $this->createMovie($movieAttr);
        $detail = $this->movieDetail->fill($attributes);
        $detail->basic()->associate($detail);
        $detail->save();
        return $detail;

    }

}

在這里,控制器示例:

<?php

use MovieService;

class MovieController {

    public function __construct(MovieService $ms) {
        $this->ms = $ms;
    }

    public function store() {
        $this->ms->createMovie($attrToSave);
    }

}

<?php

use MovieService;

class MovieDetailController {

    public function __construct(MovieService $ms) {
        $this->ms = $ms;
    }

    public function store() {
         $this->ms->createMovieDetail($attrToSave);
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM