Laravel có một cách để thêm giá trị vào một mảng yêu cầu


109

Tôi gặp một tình huống trong Laravel khi gọi phương thức store () hoặc update () với tham số Yêu cầu để thêm một số giá trị bổ sung vào yêu cầu trước khi gọi các hàm Eloquent. Có cách nào cho điều đó không.

function store(Request $request) 
{
  // some additional logic or checking
  User::create($request->all());
}

Bạn muốn thực hiện loại điều trị nào? Bạn có muốn thêm các giá trị khóa vào $request->all()mảng không?
Hammerbot

Có, tôi cần thêm giá trị Khóa
Vijayanand Premnath

Bạn không thể sử dụng trình array_add()trợ giúp? $array = array_add($request->all(), 'new_key', $value);: laravel.com/docs/5.2/helpers#method-array-add Nếu đây không phải là thứ bạn đang tìm kiếm, bạn có thể cung cấp thêm thông tin cho câu hỏi của mình không?
Hammerbot

$ request là đối tượng php, theo cách hiểu của tôi, nếu bạn muốn thêm một số tính năng bên trong bộ điều khiển, hãy chuyển đổi đối tượng yêu cầu thành một mảng sau đó thêm những gì bạn muốn
Chathura Hettiarachchi

Câu trả lời:


201

Thông thường, bạn không muốn thêm bất kỳ thứ gì vào đối tượng Yêu cầu, tốt hơn là sử dụng bộ sưu tập và trình put()trợ giúp:

function store(Request $request) 
{
    // some additional logic or checking
    User::create(array_merge($request->all(), ['index' => 'value']));
}

Hoặc bạn có thể kết hợp các mảng :

User::create($request->all() + ['index' => 'value']);

Tuy nhiên, nếu bạn thực sự muốn thêm thứ gì đó vào đối tượng Yêu cầu, hãy làm như sau:

$request->request->add(['variable' => 'value']); //add request

3
Có nó đang hoạt động cho tôi bây giờ tôi đã thay đổi mã dưới dạng cửa hàng hàm (Yêu cầu $ request) {// một số logic bổ sung hoặc kiểm tra $ plan = 123; // một số logic để quyết định kế hoạch của người dùng $ request-> request-> add (['plan' => $ plan]); Người dùng :: create ($ request-> all ()); }
Vijayanand Premnath

1
Điều này không hoạt động vì $ request-> all () là một mảng không phải là một tập hợp.
kjdion84

1
Tôi đoán nó phải là $ request-> request-> add (['variable' => 'value']);
Sergey Onishchenko

$ request-> request-> add ... Tôi nhận được thông báo lỗi 「Biến không xác định: request」 Nhưng tôi có 「use Illuminate \ Http \ Request;」 tại sao tôi lại nhận được thông báo lỗi?
robspin

Tôi có cần phải $ request = collect (); Đầu tiên? $ Resquest là một tập hợp hay một mảng?
robspin

56

Đề cập đến Alexey Mezenincâu trả lời:

Trong khi sử dụng câu trả lời của anh ấy, tôi phải thêm một thứ gì đó trực tiếp vào Đối tượng Yêu cầu và sử dụng:

$request->request->add(['variable', 'value']);

Sử dụng nó, nó sẽ thêm hai biến:

$request[0] = 'variable', $request[1] = 'value'

Nếu bạn là một người mới như tôi và bạn cần một mảng liên kết, cách chính xác để làm là

$request->request->add(['variable' => 'value']);

Hy vọng tôi đã tiết kiệm thời gian của bạn

PS: Cảm ơn bạn @Alexey, bạn đã thực sự giúp tôi trả lời


$ request-> request-> add ... Tôi nhận được thông báo lỗi 「Biến không xác định: request」 Nhưng tôi có 「use Illuminate \ Http \ Request;」 tại sao tôi lại nhận được thông báo lỗi?
robspin

@robspin Tôi nghĩ nó khá muộn, nhưng có lẽ bạn đã không bơm theo yêu cầu trong hàm Ví dụ: function (Request $ theo yêu cầu)
Badulla mushood

1
Đối với những người bạn đang tìm kiếm lý do tại sao giá trị của bạn không được chèn vào cơ sở dữ liệu vì tôi đã không khai báo giá trị cơ sở dữ liệu đó trong ModelLớp của mình là:protected $fillable = ['slug'];
fWd82

38

Tôi đã thử $request->merge($array)chức năng trong Laravel 5.2 và nó đang hoạt động hoàn hảo.

Thí dụ:

$request->merge(["key"=>"value"]);

2
đây là giải pháp hoàn hảo
JHOAN B. HENRICHE

16

Trong laravel 5.6, chúng ta có thể chuyển các tham số giữa các phần mềm Trung gian, ví dụ:

FirstMiddleware

public function handle($request, Closure $next, ...$params)
{
    //some code
    return $next($request->merge(['key' => 'value']));
}

SecondMiddleware

public function handle($request, Closure $next, ...$params)
{
    //some code
    dd($request->all());
}

1
$request->merge()Phương pháp đó FTW! Cảm ơn.
Martin Joiner

16

đã nói đủ về chủ đề này nhưng tôi không thể cưỡng lại để thêm câu trả lời của riêng mình. Tôi tin rằng cách tiếp cận đơn giản nhất là

request()->merge([ 'foo' => 'bar' ]);

14

Bạn cũng có thể sử dụng mã bên dưới

$request->request->set(key, value).

Phù hợp hơn với tôi.


Ít nhất với Laravel 5.6 thì đây là cách nó được thực hiện! Great câu trả lời
Rockin4Life33

4

Để thêm một tham số mới cho ví dụ: newParamvào RequestĐối tượng hiện tại , bạn có thể thực hiện:

$newParam = "paramvalue";
$request->request->add(['newParam' => $newParam]);

Sau khi thêm thông số mới, bạn sẽ có thể thấy thông số mới được thêm này vào đối tượng Yêu cầu bằng cách:

dd($request);//prints the contents of the Request object

2

Tôi đã sử dụng mã này để thêm một cái gì đó vào yêu cầu của mình.

$req->query->add(['key'=>'variable']);
$req->request->add(['key'=>'variable']);

2

Bạn có thể truy cập trực tiếp vào mảng yêu cầu với $request['key'] = 'value';


2

Dựa trên quan sát của tôi :

$request->request->add(['variable' => 'value']);(hầu hết) sẽ hoạt động trong các phương thức POST, PUT & DELETE , bởi vì có (các) giá trị được truyền, một trong những giá trị đó là _token. Như ví dụ bên dưới.

<form action="{{ route('process', $id) }}" method="POST">
    @csrf
</form>

public function process(Request $request, $id){
    $request->request->add(['id' => $id]);
}

Nhưng [mã bên dưới] sẽ không hoạt động vì không có (các) giá trị nào được chuyển, nó không thực sự thêm vào.

<a href='{{ route('process', $id) }}'>PROCESS</a>

public function process(Request $request, $id){
    $request->request->add(['id' => $id]);
}


Khi sử dụng phương thức GET, bạn có thể khai báo Yêu cầu và gán (các) giá trị trực tiếp cho nó. Như bên dưới:

public function process($id){
    $request = new Request(['id' => $id]);
}

Hoặc bạn có thể sử dụng merge. Điều này thực sự tốt hơn $request->request->add(['variable' => 'value']);vì có thể khởi tạothêm giá trị yêu cầu sẽ hoạt động cho tất cả các phương thức ( GET , POST , PUT , DELETE )

public function process(Request $request, $id){
    $request->merge(['id' => $id]);
}

Tag: laravel5.8.11


2

Cách tốt nhất mà tôi đã sử dụng và nghiên cứu về nó là $ request-> merge ([]) (Kiểm tra Đoạn mã của tôi):

    public function index(Request $request) {
        not_permissions_redirect(have_premission(2));
        $filters = (!empty($request->all())) ? true : false;
        $request->merge(['type' => 'admin']);
        $users = $this->service->getAllUsers($request->all());
        $roles = $this->roles->getAllAdminRoles();
        return view('users.list', compact(['users', 'roles', 'filters']));
    }

Kiểm tra dòng số 3 bên trong hàm chỉ mục.


0

Bạn có thể thêm các tham số vào yêu cầu từ phần mềm trung gian bằng cách thực hiện:

public function handle($request, Closure $next)
{
    $request->route()->setParameter('foo', 'bar');
    return $next($request);
}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.