Saya melakukan pemeriksaan izin pada pengguna untuk menentukan apakah mereka dapat melihat halaman atau tidak. Ini melibatkan penyampaian permintaan melalui beberapa middleware terlebih dahulu.
Masalah yang saya alami adalah saya menduplikasi kueri database yang sama di middleware dan di pengontrol sebelum mengembalikan data ke tampilan itu sendiri.
Berikut adalah contoh penyiapan;
- routes.php
Route::get('pages/{id}', [
'as' => 'pages',
'middleware' => 'pageUser'
'uses' => 'PagesController@view'
]);
- PageUserMiddleware.php (kelas PageUserMiddleware)
public function handle($request, Closure $next)
{
//get the page
$pageId = $request->route('id');
//find the page with users
$page = Page::with('users')->where('id', $pageId)->first();
//check if the logged in user exists for the page
if(!$page->users()->wherePivot('user_id', Auth::user()->id)->exists()) {
//redirect them if they don't exist
return redirect()->route('redirectRoute');
}
return $next($request);
}
- PagesController.php
public function view($id)
{
$page = Page::with('users')->where('id', $id)->first();
return view('pages.view', ['page' => $page]);
}
Seperti yang Anda lihat, Page::with('users')->where('id', $id)->first()
ini diulangi di middleware dan controller. Saya harus meneruskan data dari satu ke yang lain agar tidak menduplikasi.
Jawaban:
Saya percaya cara yang benar untuk melakukan ini (di Laravel 5.x) adalah dengan menambahkan bidang khusus Anda ke properti atribut.
Dari komentar kode sumber, kita dapat melihat atribut yang digunakan untuk parameter khusus:
/** * Custom parameters. * * @var \Symfony\Component\HttpFoundation\ParameterBag * * @api */ public $attributes;
Jadi Anda akan menerapkan ini sebagai berikut;
$request->attributes->add(['myAttribute' => 'myValue']);
Anda kemudian dapat mengambil atribut tersebut dengan memanggil:
\Request::get('myAttribute');
Atau dari objek permintaan di laravel 5.5+
$request->get('myAttribute');
sumber
$request->request->add(['myAttribute' => 'myValue']);
untuk dapat menggunakan steno pengambil sihir$request->myAttribute
Sebagai ganti parameter permintaan khusus, Anda dapat mengikuti pola inversi kontrol dan menggunakan injeksi ketergantungan.
Di middleware Anda, daftarkan
Page
instance Anda :app()->instance(Page::class, $page);
Kemudian nyatakan bahwa pengontrol Anda membutuhkan sebuah
Page
instance:class PagesController { protected $page; function __construct(Page $page) { $this->page = $page; } }
Laravel akan secara otomatis menyelesaikan ketergantungan dan membuat contoh pengontrol Anda dengan
Page
instance yang Anda ikat di middleware Anda.sumber
Di laravel> = 5 Anda dapat menggunakan
$request->merge
di middleware:public function handle($request, Closure $next) { $request->merge(array("myVar" => "1234")); return $next($request); }
Dan di pengontrol:
public function index(Request $request) { $myVar = $request->instance()->query('myVar'); ... }
sumber
Request::instance()
secara statis, daripada menggunakan$request
?Laravel 5.7
// in Middleware register instance app()->instance('myObj', $myObj);
dan
// to get in controller just use the resolve helper $myObj = resolve('myObj');
sumber
Seperti yang disebutkan dalam salah satu komentar di atas untuk laravel 5.3.x
$request->attributes->add(['key => 'value'] );
Tidak berhasil. Tetapi pengaturan variabel seperti ini di middleware berfungsi
$request->attributes->set('key', 'value');
Saya dapat mengambil data menggunakan ini di pengontrol saya
$request->get('key');
sumber
Saya yakin jika mungkin untuk melewatkan data dari middleware ke controller maka itu akan ada di dokumentasi Laravel.
Coba lihat ini dan ini , mungkin bisa membantu.
Singkatnya, Anda dapat mendukung data Anda pada objek permintaan yang diteruskan ke middleware. Fasad otentikasi Laravel juga melakukannya.
Jadi, di middleware Anda, Anda dapat memiliki:
$request->myAttribute = "myValue";
sumber
Ini sangat sederhana:
Berikut adalah kode middleware:
public function handle($request, Closure $next) { $request->merge(array("customVar" => "abcde")); return $next($request); }
dan berikut adalah kode pengontrol:
$request->customVar;
sumber
Jika website Anda memiliki halaman cms yang diambil dari database dan ingin menampilkan judulnya di blok header dan footer pada semua halaman aplikasi laravel maka gunakan middleware. Tulis kode di bawah ini di middleware Anda:
namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\DB; public function handle($request, Closure $next) { $data = DB::table('pages')->select('pages.id','pages.title')->where('pages.status', '1')->get(); \Illuminate\Support\Facades\View::share('cms_pages', $data); return $next($request); }
Kemudian buka header.blade.php dan footer.blade.php Anda dan tulis kode di bawah ini untuk menambahkan tautan halaman cms:
<a href="{{ url('/') }}">Home</a> | @foreach ($cms_pages as $page) <a href="{{ url('page/show/'.$page->id) }}">{{ $page->title }}</a> | @endforeach <a href="{{ url('contactus') }}">Contact Us</a>
Terima kasih banyak untuk semua dan nikmati kodenya :)
sumber
saya tidak bisa berbahasa Inggris, jadi ... maaf atas kemungkinan kesalahan.
Anda dapat menggunakan pengikatan IoC untuk ini. Di middleware Anda, Anda dapat melakukan ini untuk mengikat $ page instance:
\App::instance('mi_page_var', $page);
Setelah itu, di pengontrol Anda, Anda memanggil instance itu:
$page = \App::make('mi_page_var');
App :: instance tidak mengembalikan instance kelas, sebagai gantinya mengembalikan instance yang mengikat sebelumnya.
sumber
Saya bisa menambahkan nilai ke objek Request dengan:
$request->attributes->set('key', 'value');
dan mendapatkannya kembali nanti dengan:
$request->attributes->get('key');
Hal ini dimungkinkan karena Permintaan laravels memperluas Permintaan symfonys yang memiliki atribut " $ atribut " jenis ParameterBag yang dimaksudkan untuk menampung parameter khusus .
Saya pikir ini harus menjadi Praktik Terbaik untuk meneruskan data ke Middleware berikutnya, Pengendali atau tempat lain di mana dimungkinkan untuk mengakses objek Permintaan.
Diuji dengan Laravel 5.6 , tetapi mungkin juga bekerja dengan versi lain.
sumber
$request
adalah array sehingga kita bisa menambahkan nilai dan kunci ke array dan mendapatkan$request
dengan kunci ini di pengontrol.$request['id'] = $id;
sumber