Как переопределить метод ‘create’ при вставке в связанную модель. Laravel 5.5

Я хочу вставить новое событие (например, вечеринку … и т. Д.), Связанное с пользователем, поэтому я делаю это в соответствии с этот руководство. Это внутри EventsService.php,

public function store( StoreEventRequest $request, $dashboard = false ) {
$owner = User::find( $request->owner_id );
try {

$event = $owner->events()->create( $request->all() );

} catch ( \Exception $exception ) {
throw new Exception( $exception->getMessage() );
}
$this->interestsService->updateFromRequest( $event );

if ( $request->hasFile( 'photos' ) ) {
$event->photosFromRequest( $request );
}

if ( $request->hasFile( 'cover_photo' ) ) {
$event->coverPhotoFromRequest( $request );
}

return $event->fresh();
}

Я добавил filterByPrivacy() внутри StoreEventRequest.php как следует из ответа:

public function filterByPrivacy()
{
error_log(('Im here.'));
if ($this->privacy == "private") {
$this->request->set('access_code', $this->getAccessCodeAttribute());
}

else {

$this->request->set('access_code', null);
}


}

Проблема в том, что error_log(('Im here.')); никогда не печатается, другие методы внутри того же класса делают.

0

Решение

Вот что я хотел бы сделать — и я предполагаю, что вы пытаетесь создать эти события из контроллера (поправьте меня, если я ошибаюсь):

Сначала создайте новый запрос для этого конкретного действия:

php artisan make:request StoreEventRequest

Это добавит новый файл запроса app/Http/Requests/StoreEventRequest.php

Предлагаемая структура файла запроса (пожалуйста, замените комментарии, чтобы поставить то, что вам нужно):

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreEventRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize(): bool
{
// this should probably be handled by middleware
$user = $this->user();

return $user && ($user->isAdmin() || $user->isActive());
}

/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules(): array
{
$rules = [
'id' => 'exists:events,id',
'name' => 'required|min:5|max:255',
'description' => 'required|max:1000',
'city_id' => 'exists:cities,id',
'country_id' => 'exists:countries,id',
'location_address' => 'required|string',
'location_latitude' => 'latitude',
'location_longitude' => 'longitude',
'privacy' => 'in:public,private',
'budget' => 'numeric|min:0',
'photos.*' => 'image',
'cover_photo' => 'image',
'min_attendees' => 'integer|min:0',
'max_attendees' => 'integer|min:0',
'starts_at' => 'required|date|after:now',
'ends_at' => 'required|date|after:starts_at',
];

if ($this->user()->isAdmin()) {

//administrator special validation and overrides
$rules['description'] = 'max:5000';
$rules['location_address'] = 'string';
}

return $rules;
}

/**
* Get processed request data.
*
* @return array
*/
public function data(): array
{
$data = array_merge(
$this->only([
'id',
'name',
'description',
'city_id',
'country_id',
'location_address',
'location_latitude',
'location_longitude',
'privacy',
'budget',
'photos.*',
'cover_photo',
'min_attendees',
'max_attendees',
'starts_at',
'ends_at',
]),
[
'access_code' => null
]
);

if ($data['privacy'] === "private") {
$data['access_code'] = $this->accessCode();
}

return $data;
}

/**
* Get access code.
*
* @return int
*/
private function accessCode(): int
{
return rand(1000, 99999);
}
}

Я работаю в предположении, что owner_id присутствует в маршруте:

// routes/web.php
Route::post('event/{owner_id}/store', 'EventController@store')->name('event.store');

// app/Providers/RouteServiceProvider.php
public function boot()
{
parent::boot();

Route::model('owner_id', User::class);
}

Таким образом, метод нашего контроллера делает его доступным напрямую как зависимость (я удалил ваш try/catch поскольку он, кажется, не делает ничего, кроме повторного выброса себя):

public function store(StoreEventRequest $request, User $owner, $dashboard = false)
{
$event = $owner->events()->create($request->data());

$this->interestsService->updateFromRequest($event);

if ($request->hasFile('photos')) {
$event->photosFromRequest($request);
}

if ($request->hasFile('cover_photo')) {
$event->coverPhotoFromRequest($request);
}

return $event->fresh();
}

Я не был уверен где $dashboard Спор идет, поэтому оставь его там, но я верю, что это также будет зарегистрировано на маршруте.

Быстрый тест, который даст вам немного больше понимания того, что может быть неудачным:

php artisan make:test EventTest

и его содержание:

<?php

namespace Tests\Feature;

use App\User;
use Tests\TestCase;

use Illuminate\Foundation\Testing\RefreshDatabase;

class EventTest extends TestCase
{
use RefreshDatabase;

/**
* @test
*/
public function passes_validation()
{
$user = factory(User::class)->create();

$response = $this->post(route('event.store', $user->id), [
// ... your request data goes here
]);

// update response status to whatever you expect it to be
// I've used 201 for CREATED
$response->assertStatus(201);
}
}

Таким образом, у вас есть все данные, подготовленные так, как вам нужно для create метод — без необходимости перезаписывать его.

Надеюсь это поможет.

1

Другие решения

в вашей модели создать загрузочный метод при создании функции statuc, которая выполняется перед вызовом метода create

 public static function boot()
{
parent::boot();

static::creating(function($model)
{
dd($model);
});
}
1

По вопросам рекламы [email protected]