Я хочу вставить новое событие (например, вечеринку … и т. Д.), Связанное с пользователем, поэтому я делаю это в соответствии с этот руководство. Это внутри 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.'));
никогда не печатается, другие методы внутри того же класса делают.
Вот что я хотел бы сделать — и я предполагаю, что вы пытаетесь создать эти события из контроллера (поправьте меня, если я ошибаюсь):
Сначала создайте новый запрос для этого конкретного действия:
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
метод — без необходимости перезаписывать его.
Надеюсь это поможет.
в вашей модели создать загрузочный метод при создании функции statuc, которая выполняется перед вызовом метода create
public static function boot()
{
parent::boot();
static::creating(function($model)
{
dd($model);
});
}