2015-04-17 2 views
0

Я продвигаю большой проект от CodeIgniter до Laravel 5 и сталкиваюсь с проблемой, с которой я не могу найти решение.Laravel Метод привязки модели?

Я знаю, что вы можете использовать привязку модели маршрута, и я использую ее без проблем, и я знаю, что вы можете делать инъекцию метода, например, вводить запрос в метод.

Но моя «проблема», у меня есть несколько классов с тем же именем, но и для различных разделов проекта, например:

App\Models\Knowledgebase\Article 
App\Models\News\Article 
App\Models\Minisite\Resources\Article 

Как вы можете видеть, у меня есть 3 разных Article моделей. Один для статей базы знаний, один для новостных статей и один для статей статей отдела.

Однако, с привязкой к модели маршрута, кажется, я могу привязать только одну модель к ключевому слову, и поскольку мои URL-адреса имеют ключевое слово Article, это действительно не работает.

Итак, мой вопрос: возможно ли внедрить связанную модель в метод, указав его как параметр? Или мне нужно жестко закодировать его в метод, говоря:

$article = App\Models\Knowledgebase\Article::find($some_id); 

Или я могу сделать что-то вроде этого:

public function show(App\Models\Knowledgebase\Article $article) 
{ 
    // code 
} 

На данный момент, если я пытаюсь привнести статью, $article становится новый экземпляр модели статьи, а не модельный рекорд. Кажется немного странным, что структура заставит вас вручную получить модель для каждого метода.

Любая помощь приветствуется.

ответ

3

Однако, модель привязки маршрута, кажется, я могу только связать одну модель с ключевым словом, и так как мои URL-адреса каждого есть ключевое слово Article, это действительно не работает.

Ключевое слово для каждого типа может содержать другое ключевое слово.

// in the router 
$router->model('kbarticle', 'App\Models\Knowledgebase\Article'); 
$router->model('newsarticle', 'App\Models\News\Article'); 
$router->model('sitearticle', 'App\Models\Minisite\Resources\Article'); 

// in your routes file 
Route::get('knowledge/{kbarticle}', function(App\Models\Knowledgebase\Article $article) {}); 
Route::get('news/{newsarticle}', function(App\Models\News\Article $article) {}); 
Route::get('site/{sitearticle}', function(App\Models\Minisite\Resources\Article $article) {}); 
+0

Могу ли я использовать этот подход с 'Route :: resource()'? В любом случае это тоже полезно –

+0

@PhilCross Я не использую 'Route :: resource()' много, извините. Может быть? – ceejayoz

+0

Я решил заменить ресурсы маршрута на отдельные маршруты (get/post/put и т. Д.).По крайней мере, таким образом я могу управлять именами псевдонима модели «лучше в файле маршрута». –

2

Почему бы вам просто не импортировать класс и псевдоним?

<?php 
use App\Models\Knowledgebase\Article as MyArticle 

Тогда на вашей функции просто сделать это:

public function show(MyArtcile $article) 
{ 
    // code 
} 
+0

Извините, я не уверен, был ли я свободен от того, что мне было нужно! Я могу привязать модель к методу, но просто не заполнять ее автоматически из маршрута, не используя привязку модели маршрута. Я попробую обновить свой вопрос. –

+0

Это можно сделать в файле 'app/app.php' под' 'aliases '=> [...' KBArticle '=>' App \ Models \ Knowledgebase \ Article ', ...]'? Это сэкономит время, если это будет возможно. –

+0

О, я понимаю, почему бы вам не определить свою модель на конструкторе контроллера? –

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