Laravel - 使用控制器功能为两个不同的雄辩模型

时间:2015-06-13 04:33:07

标签: php laravel laravel-5

我目前正在为一家indy电影制作公司开发一个应用程序。我现在拥有工作流程的方式,用户首先通过输入电影标题和概要创建一个新的电影对象。然后,用户可以添加更多详细信息,例如价格,运行时间,全屏/宽屏等。电影基本(标题,概要)位于一个数据库表中,详细信息位于另一个数据库表中。我在两个雄辩的模型之间建立了一对一的关系。我还设置了一个MovieController,它允许我在电影基本模型上非常容易地进行CRUD操作,当我向用户显示电影对象时,我可以显示基础和细节。

我想知道是否有某种方法可以使用电影控制器中已存在的功能对电影细节进行CRUD操作而无需在控制器中创建新功能?还可以重用我为每个相应的CRUD操作创建的视图吗?换句话说我可以

<?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'); } }

在一个实例中匹配创建新电影(标题,概要),在另一个实例中匹配创建电影细节(价格,运行时,全屏/宽屏)等。这可能吗?我提供了以下两种模型的代码:

Movie_basic.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');
    }

}

Model_detail.php

{{1}}

1 个答案:

答案 0 :(得分:0)

如果我理解你,这可能是一个答案。 (没有测试代码。)

请注意,该代码是为了向您展示示例而编写的。您可能希望对其进行编辑以使其正常工作并按您的需要进行操作。也许您想使用存储库或自动化模型实例创建(我没有创建新实例)和保存流程。您可以使用界面而不是模型等...

这是存储逻辑的服务。

<?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);
    }

}