У меня есть два контроллера SubmitPerformanceController
и PrintReportController
.
У PrintReportController
меня есть метод, который называется getPrintReport
.
Как получить доступ к этому методу в SubmitPerformanceController
?
Вы можете получить доступ к своему методу контроллера следующим образом:
app('App\Http\Controllers\PrintReportController')->getPrintReport();
Это будет работать, но это плохо с точки зрения организации кода (не забывайте использовать правильное пространство имен для вашего PrintReportController
)
Вы можете расширить, PrintReportController
так SubmitPerformanceController
что наследует этот метод
class SubmitPerformanceController extends PrintReportController {
// ....
}
Но это также унаследует все другие методы от PrintReportController
.
Наилучшим подходом будет создание trait
(например, в app/Traits
), реализация логики и указание контроллерам использовать ее:
trait PrintReport {
public function getPrintReport() {
// .....
}
}
Скажите вашим контроллерам использовать эту черту:
class PrintReportController extends Controller {
use PrintReport;
}
class SubmitPerformanceController extends Controller {
use PrintReport;
}
Оба решения позволяют SubmitPerformanceController
использовать getPrintReport
метод, чтобы вы могли вызывать его $this->getPrintReport();
из контроллера или напрямую как маршрут (если вы отобразили его в routes.php
)
Вы можете прочитать больше о чертах здесь .
app('App\Http\Controllers\PrintReportController')->getPrintReport();
может преобразоваться вapp(PrintReportController::class')->getPrintReport()
. Чистое решение для меня.Если вам нужен этот метод в другом контроллере, это означает, что вам нужно абстрагировать его и сделать его многоразовым. Переместите эту реализацию в класс обслуживания (ReportingService или что-то подобное) и внедрите его в свои контроллеры.
Пример:
Сделайте то же самое для других контроллеров, где вам нужна эта реализация. Достижение методов контроллера от других контроллеров - запах кода.
источник
Services
папка, если проект не большой, либо папка с функциями, которая называетсяReporting
большим проектом и используетFolders By Feature
структуру.Laravel 5 совместимый метод
Примечание. Это не приведет к обновлению URL-адреса страницы.
Лучше вместо этого вызвать Route и позволить ему вызывать контроллер.
источник
Ты не должен. Это анти-паттерн. Если у вас есть метод в одном контроллере, к которому вам нужен доступ в другом контроллере, то это признак того, что вам нужно пересмотреть фактор.
Подумайте о том, чтобы перевести метод в класс обслуживания, который затем можно создать на нескольких контроллерах. Поэтому, если вам нужно предложить отчеты для печати для нескольких моделей, вы можете сделать что-то вроде этого:
источник
источник
Прежде всего, запрос метода контроллера от другого контроллера - ЗЛО. Это вызовет много скрытых проблем в жизненном цикле Laravel.
Во всяком случае, есть много решений для этого. Вы можете выбрать один из этих различных способов.
Случай 1) Если вы хотите позвонить на основе классов
Способ 1) Простой способ
Но вы не можете добавлять параметры или аутентификацию таким способом.
Способ 2) Разделить логику контроллера на сервисы.
Вы можете добавить любые параметры и что-то с этим. Лучшее решение для вашей жизни программирования. Вы можете сделать
Repository
вместо этогоService
.Случай 2) Если вы хотите позвонить на основе маршрутов
Способ 1) Использовать
MakesHttpRequests
черту, использованную в модульном тестировании приложения.Я рекомендую это, если у вас есть особая причина для создания этого прокси, вы можете использовать любые параметры и пользовательские заголовки . Также это будет внутренний запрос в laravel. (Поддельный HTTP-запрос) Вы можете увидеть более подробную информацию о
call
методе здесь .Однако это тоже не «хорошее» решение.
Способ 2) Использование клиента guzzlehttp
Это самое ужасное решение, я думаю. Вы также можете использовать любые параметры и пользовательские заголовки . Но это будет делать внешний дополнительный http-запрос. Так что HTTP Webserver должен быть запущен.
Наконец, я использую способ 1 из случая 2. Мне нужны параметры и
источник
источник
Вы можете использовать статический метод в PrintReportController и затем вызывать его из SubmitPerformanceController следующим образом;
источник
Этот подход также работает с той же иерархией файлов контроллера:
источник
Здесь эта черта полностью эмулирует работу контроллера через маршрутизатор laravel (включая поддержку промежуточного программного обеспечения и внедрение зависимостей). Протестировано только с версией 5.4
Затем просто добавьте его в свой класс и запустите контроллер. Обратите внимание, что внедрение зависимостей будет назначено вашему текущему маршруту.
источник
app()->make(......)
равно,app(......)
поэтому оно короче.Вы можете получить доступ к контроллеру, создав его экземпляр и вызвав doAction: (поместите
use Illuminate\Support\Facades\App;
перед объявлением класса контроллера)Также обратите внимание, что, выполнив это, вы не будете выполнять какие-либо промежуточные программы, объявленные на этом контроллере.
источник
Поздний ответ, но я долго искал это. Теперь это возможно очень простым способом.
Без параметров
С параметрами
Документы: https://laravel.com/docs/5.6/responses#redirecting-controller-actions
Еще в 5.0 для этого требовался весь путь, теперь все намного проще.
источник