Saya memiliki dua pengendali SubmitPerformanceController
dan PrintReportController
.
Dalam PrintReportController
saya punya metode yang disebut getPrintReport
.
Bagaimana cara mengakses metode ini SubmitPerformanceController
?
Anda dapat mengakses metode pengontrol Anda seperti ini:
app('App\Http\Controllers\PrintReportController')->getPrintReport();
Ini akan berhasil, tetapi buruk dalam hal pengaturan kode (ingat untuk menggunakan namespace yang tepat untuk Anda PrintReportController
)
Anda dapat memperpanjang PrintReportController
sehingga SubmitPerformanceController
akan mewarisi metode itu
class SubmitPerformanceController extends PrintReportController {
// ....
}
Tetapi ini juga akan mewarisi semua metode lain dari PrintReportController
.
Pendekatan terbaik adalah dengan membuat trait
(misalnya dalam app/Traits
), mengimplementasikan logika di sana dan memberi tahu pengendali Anda untuk menggunakannya:
trait PrintReport {
public function getPrintReport() {
// .....
}
}
Beri tahu pengontrol Anda untuk menggunakan sifat ini:
class PrintReportController extends Controller {
use PrintReport;
}
class SubmitPerformanceController extends Controller {
use PrintReport;
}
Kedua solusi membuat SubmitPerformanceController
memiliki getPrintReport
metode sehingga Anda dapat memanggilnya $this->getPrintReport();
dari dalam controller atau langsung sebagai rute (jika Anda memetakannya dalam routes.php
)
Anda dapat membaca lebih lanjut tentang ciri-ciri di sini .
app('App\Http\Controllers\PrintReportController')->getPrintReport();
dapat ditransformasikan menjadiapp(PrintReportController::class')->getPrintReport()
. Solusi bersih untuk saya.Jika Anda memerlukan metode itu di pengontrol lain, itu artinya Anda perlu mengabstraksikannya dan membuatnya bisa digunakan kembali. Pindahkan implementasi itu ke kelas layanan (ReportingService atau yang serupa) dan suntikkan ke controller Anda.
Contoh:
Lakukan hal yang sama untuk pengontrol lain di mana Anda memerlukan implementasi itu. Mencapai metode pengontrol dari pengontrol lain adalah bau kode.
sumber
Services
folder jika proyek tidak besar atau folder fitur disebutReporting
apakah itu proyek yang lebih besar dan menggunakanFolders By Feature
struktur.Metode kompatibel Laravel 5
Catatan: ini tidak akan memperbarui URL halaman.
Lebih baik untuk memanggil Rute dan membiarkannya memanggil controller.
sumber
Anda seharusnya tidak. Ini anti-pola. Jika Anda memiliki metode dalam satu pengontrol yang perlu Anda akses di pengontrol lain, maka itu pertanda Anda perlu faktor ulang.
Pertimbangkan untuk memfaktorkan ulang metode keluar ke kelas layanan, yang kemudian dapat Anda instantiate di beberapa pengontrol. Jadi, jika Anda perlu menawarkan laporan cetak untuk banyak model, Anda dapat melakukan sesuatu seperti ini:
sumber
sumber
Pertama-tama, meminta metode pengontrol dari pengontrol lain adalah JAHAT. Ini akan menyebabkan banyak masalah tersembunyi dalam siklus hidup Laravel.
Bagaimanapun, ada banyak solusi untuk melakukan itu. Anda dapat memilih salah satu dari berbagai cara ini.
Kasus 1) Jika Anda ingin menelepon berdasarkan Kelas
Cara 1) Cara sederhana
Tetapi Anda tidak dapat menambahkan parameter atau autentikasi dengan cara ini.
Cara 2) Bagi logika pengontrol ke dalam layanan.
Anda dapat menambahkan parameter dan sesuatu dengan ini. Solusi terbaik untuk kehidupan pemrograman Anda. Anda dapat membuat
Repository
sebagai gantinyaService
.Kasus 2) Jika Anda ingin menelepon berdasarkan Rute
Cara 1) Gunakan
MakesHttpRequests
sifat yang digunakan dalam Pengujian Unit Aplikasi.Saya merekomendasikan ini jika Anda memiliki alasan khusus untuk membuat proksi ini, Anda dapat menggunakan parameter dan header khusus apa pun . Juga ini akan menjadi permintaan internal di laravel. (Permintaan HTTP Palsu) Anda dapat melihat detail lebih lanjut untuk
call
metode ini di sini .Namun ini bukan solusi yang 'baik' juga.
Cara 2) Gunakan klien guzzlehttp
Ini adalah solusi paling mengerikan yang saya pikir. Anda dapat menggunakan parameter dan tajuk khusus apa pun. Tapi ini akan membuat permintaan http eksternal tambahan. Jadi HTTP Webserver harus dijalankan.
Akhirnya saya menggunakan Way 1 dari Kasus 2. Saya perlu parameter dan
sumber
sumber
Anda dapat menggunakan metode statis di PrintReportController dan kemudian memanggilnya dari SubmitPerformanceController seperti ini;
sumber
Pendekatan ini juga berfungsi dengan hierarki file Controller yang sama:
sumber
Di sini sifat sepenuhnya mengemulasi menjalankan controller oleh router laravel (termasuk dukungan middlewares dan injeksi ketergantungan). Diuji hanya dengan versi 5.4
Kemudian tambahkan saja ke kelas Anda dan jalankan controller. Perhatikan, injeksi ketergantungan akan diberikan dengan rute Anda saat ini.
sumber
app()->make(......)
sama denganapp(......)
sehingga lebih pendek.Anda dapat mengakses controller dengan membuat instance dan memanggil doAction: (diletakkan
use Illuminate\Support\Facades\App;
sebelum deklarasi kelas controller)Perhatikan juga bahwa dengan melakukan ini, Anda tidak akan menjalankan middlewares yang dideklarasikan pada pengontrol itu.
sumber
Terlambat membalas, tetapi saya telah mencari ini untuk beberapa waktu. Ini sekarang mungkin dengan cara yang sangat sederhana.
Tanpa parameter
Dengan Parameter
Documents: https://laravel.com/docs/5.6/responses#redirecting-controller-actions
Kembali di 5.0 diperlukan seluruh path, sekarang jauh lebih sederhana.
sumber