Как создать Подписку с Laravel 6 и Кассу 10 с Stripe? - PullRequest
0 голосов
/ 23 января 2020

Laravel Разработчики,

После отправки формы оплаты я получаю сообщение об ошибке 404. Когда я проверяю базу данных, в подписном документе нет обновлений. Какие-либо предложения? Я уже давно занимаюсь этим и чувствую, что упускаю что-то, что должно быть очевидным.

SubscriptionController. php

class SubscriptionController extends Controller
{
    public function create(Request $request, Plan $plan)
    {
        $plan = Plan::findOrFail($request->get('plan'));

        $request->user()
            ->newSubscription('main', $plan->stripe_plan)
            ->create($request->stripeToken);

        return redirect()->route('home')
            ->with('success', 'Your plan subscribed successfully');
    }
}

Вот мой маршрут

 Route::get('/plans', 'PlanController@index')->name('plans.index');
 Route::get('/plan/{plan}', 'PlanController@show')->name('plans.show');

1 Ответ

0 голосов
/ 26 января 2020

Вы используете Implicit Binding на вашем маршруте и контроллере. то есть Laravel автоматически вставит экземпляр модели с идентификатором, соответствующим соответствующему значению из URI запроса. Если соответствующий экземпляр модели не найден в базе данных, автоматически генерируется HTTP-ответ 404.

Но вы повторяете это поведение, используя findOrFail и вызываете $request->get('plan'), что null, потому что plan нет в вашем запросе на ввод, но он на вашем маршруте. Таким образом, Plan::findOrFail(null) приводит к ошибке 404.

Вы можете исправить свой код двумя способами:

  1. Удалить ненужную строку, содержащую findOrFail и разрешить Laravel обрабатывает это для вас с помощью Implicit Binding (я рекомендую этот способ):

    class SubscriptionController extends Controller
    {
        public function create(Request $request, Plan $plan)
        {
            //$plan = Plan::findOrFail($request->get('plan')); // <= unnecessary
    
            $request->user()
                ->newSubscription('main', $plan->stripe_plan)
                ->create($request->stripeToken);
    
            return redirect()->route('home')
                ->with('success', 'Your plan subscribed successfully');
        }
    }
    
  2. Измените свой маршрут и метод контроллера, чтобы использовать $id вместо Неявное связывание и использование findOrFail вручную (не рекомендуется):

    Route::get('/plan/{id}', 'PlanController@show')->name('plans.show');
    
    class SubscriptionController extends Controller
    {
        public function create(Request $request, $id)
        {
            $plan = Plan::findOrFail($id);
    
            $request->user()
                ->newSubscription('main', $plan->stripe_plan)
                ->create($request->stripeToken);
    
            return redirect()->route('home')
                ->with('success', 'Your plan subscribed successfully');
        }
    }
    
...