2015-06-13 2 views
0

В настоящее время я разрабатываю приложение для компании по производству фильмов Indy. То, как у меня есть рабочий процесс прямо сейчас, пользователь начинает с создания нового объекта фильма, введя название фильма и синопсис. Затем пользователь может добавить дополнительные данные, такие как цена, время выполнения, полноэкранный/широкоэкранный режим и т. Д. Основные сведения о фильме (название, резюме) находятся в одной таблице базы данных, а детали находятся в другом. Я установил взаимно однозначное соотношение между двумя красноречивыми моделями. Я также создал MovieController, который позволяет мне очень легко выполнять операции CRUD в базовой модели фильма, и когда я показываю объект фильма для пользователя, я могу отображать как основы, так и детали.Laravel - Использование функции контроллера для двух разных красноречивых моделей

Что мне было интересно, был ли какой-то способ использовать уже существующие функции в контроллере видео, чтобы выполнять операции 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'); 
    } 

} 
+0

Если им читать это право в основном вы хотите создать новый _service_ и зарегистрировать его в качестве зависимости для различных контроллеров. http://laravel.com/docs/5.1/container –

ответ

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

} 
+0

Из того, что я понимаю из вашего ответа, вы абстрагировали создание из обоих классов в один класс. Я в этом прав? Думаю, ты пропустил еще одну часть моего вопроса. Есть ли у вас какие-либо идеи относительно того, что было бы лучшим способом для одного и того же взгляда? Т.е. обе функции создают «cms.create», но представляют две разные формы? –

+0

Nvm, передаст параметр для просмотра и из этого параметра определит, какую форму показывать –

Смежные вопросы