2017-10-22 1 views
0

Laravelを使用してウェブログを作成します。各投稿には多くのタグがあります。 私は新しいタグ格納する方法と、タグのコントローラがあります。この場合Laravelの他のコントローラから新しいモデルインスタンスを保存するベストプラクティス

class TagController extends Controller 
{ 
    public function store($title){ 
     return Tag::firstOrCreate(['title'=>$title]); 
    } 
} 

を、私はのPostControllerからこのメソッドを呼び出す必要があります:

class PostController extends Controller 
... 
    protected function createTagsObjects(string $csvTags){ 
      $tagsArray=explode(',',$csvTags); 
      $tagsArray=array_unique($tagsArray); 
      foreach($tagsArray as $tag){ 
       //call to tag controller->store 
      } 
    } 
} 

私はそれがコントローラを呼び出すことをお勧めではないことを知っていますメソッドを別のコントローラから取得します。 私はネットをサーフィンし、私は特性やサービスを知りました。しかし、私は彼らが私の問題に役立つとは思わない。このシナリオは非常に頻繁に起こります。 これらの状況を処理するベストプラクティスは何ですか?おかげさまで

+0

形質を使用するのが最良です。私はそれらを使用しない理由がないか、または 'Controller'クラスの中で' createTagsObjects'を取るこ​​とができます。 –

+0

@RazaMehdiもしあなたがこれのために形質を実装したいのであれば、それはどうですか? – mjkhonline

+0

このスレッドを参照してください:https://stackoverflow.com/questions/7892749/traits-in-php-any-real-world-examples-best-practices –

答えて

0

コントローラのメソッドを他のコントローラから呼び出さないでください。

ロジックをServiceクラスまたはTagモデルに抽出して呼び出します。あなたは

protected function createTagsObjects(string $csvTags) 
{ 
    $tagsArray = explode(',',$csvTags); 
    $tagsArray = array_unique($tagsArray); 
    foreach ($tagsArray as $tag) { 
     $tagCreated = Tag::firstOrCreate(['title' => $tag]); 
    } 
} 
0
public function store($title){ 
    return Tag::firstOrCreate(['title'=>$title]); 
} 

雄弁メソッドを呼び出しているので、

しかし、この場合には、それは必要はありません。この方法ではlaravel Modelのデフォルトのメソッドのメソッドを呼び出すが、何もしていません。だから、TagControllerのメソッドをPostControllerから呼び出す必要はありません。代わりにTag::firstOrCreate(['title'=>$title]);PostControllerから呼び出すことができます。これは絶対に問題ありません。

しかし、この1行の代わりにいくつかのコードブロック(メソッドなど)があり、それらのコードブロックを別のコントローラから呼び出す必要がある場合は、それらをサービス(リポジトリ)またはモデルしかし時々それは大丈夫です)。

関連する問題