Как я могу использовать 2 контроллера в 1 маршруте?
Цель здесь состоит в том, чтобы создать несколько страниц с 1 карьерой (например, бухгалтеров), а затем связать их со школой, предлагающей курс по бухгалтерскому учету.
Пример страницы будет состоять из:
1. Информация о карьере бухгалтера (я использую «карьерный» контроллер здесь)
2. Школы, предоставляющие курсы бухгалтерского учета (здесь я использую отдельный контроллер «школ»).
Route::get('/accountants-career', 'CareerController@accountants');
Route::get('/accountants-career', 'SchoolsController@kaplan');
Использование кода выше перезапишет 1 из контроллеров.
Есть ли решение, чтобы решить эту проблему?
Вы не можете сделать это, потому что это не очень хорошая вещь, и из-за этого Laravel не позволяет вам использовать один и тот же маршрут для выполнения двух разных действий контроллеров, если вы не используете разные методы HTTP (POST, GET …). Контроллер — это обработчик HTTP-запроса, а не класс обслуживания, поэтому вам, вероятно, придется немного изменить свой дизайн, это один из способов сделать это:
Если вы покажете все данные на одной странице, создайте один маршрутизатор:
Route::get('/career', 'CareerController@index');
Создайте тощий контроллер, только чтобы получить информацию и перейти к вашему виду:
use View;
class CareerController extends Controller {
private $repository;
public function __construct(DataRepository $repository)
{
$this->repository = $repository;
}
public function index(DataRepository $repository)
{
return View::make('career.index')->with('data', $this-repository->getData());
}
}
И создайте класс DataRepository, отвечающий за знание того, что делать в случае необходимости, такого рода данные:
class DataRepository {
public getData()
{
$data = array();
$data['accountant'] = Accountant::all();
$data['schools'] = School::all();
return $data;
}
}
Обратите внимание, что этот репозиторий автоматически внедряется в ваш контроллер, Laravel сделает это за вас.
Есть ли конкретная причина, по которой вам нужно использовать одно и то же имя маршрута?
В настоящее время вы не можете отличить маршруты от laravel, когда он их обрабатывает.
почему не что-то такое как;
Route::get('/accountants/career', 'CareerController@accountants');
Route::get('/accountants/schools', 'SchoolsController@kaplan');
Вы также можете сделать что-то подобное, если у вас есть несколько карьер, идущих к одному контроллеру и методам, основанным на их ценности.
Это позволяет вам иметь отдельный вызов, который вы можете вызывать для каждого из ваших утвержденных значений, вместо того, чтобы устанавливать отдельный маршрут и метод контроллера для каждого из них.
Route::get('/{careerName}/career', 'CareerController@all');
Route::get('/{careerName}/schools', 'SchoolsController@kaplan');