Форум программистов, компьютерный форум, киберфорум
PHP: Laravel
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
1 / 1 / 0
Регистрация: 24.02.2019
Сообщений: 101

Внедрение зависимости и параметры маршрута

15.12.2019, 14:42. Показов 2035. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет. Изучаю документацию. Есть раздел: Внедрение зависимости и параметры маршрута
Непонятно, как его применить к уже отправленной форме?

Вот три маршрута:
PHP Скопировано
1
2
3
Route::get('test/form', 'FormController@form');
Route::any('test/result', 'FormController@result');
Route::put('test/result/{name}', 'FormController@update');
Код контроллера:
PHP Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    namespace App\Http\Controllers;
    use App\Http\Controllers\Controller;
    use Illuminate\Http\Request;
    
    class FormController extends Controller
    {
        public function form()
        {
            // Выполнится при первом заходе:
            return view('test.form'); // представление с формой
        }
        
        public function update(Request $request, $name)
        {
            return view('test.result', ['name' => $name]);
        }
        
        public function result(Request $request)
        {
            $data = $request->all();
            return view('test.result', ['data' => $data]);
        }   
    }
Код формы:
PHP Скопировано
1
2
3
4
5
6
7
<form action="result" method="POST">
    {{ csrf_field() }}
    name:<br>     
    <input type="text" name="name"><p>
 
    <input type="submit">
</form>
Вывод в представление:
PHP Скопировано
1
2
3
4
5
6
<ul>
    @foreach($data as $key => $elem)
        @continue($key == '_token')
        <li>{{ $key }}: {{ $elem }}</li>
    @endforeach
</ul>
Работа с кодом:
1. Обращаюсь к форме в адресной строке: "test/form",
2. В форме заполняю поле "name" и отправляю ее,
3. Происходит вывод результата,
4. Пытаюсь изменить данные формы в адресной строке: "test/result/name".

Выводит ошибку:
"The GET method is not supported for this route. Supported methods: PUT."


Что посоветуете?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.12.2019, 14:42
Ответы с готовыми решениями:

Внедрение зависимости в api контроллер
Здравствуйте. Интересует такой вопрос: как правильно внедрить зависимость в api контроллер? (использую ninject, но навряд ли это критично)...

По введенному номеру маршрута вывести на печать вид транспорта, начальный и конечный пункт маршрута
Написать программу по созданию файла записей, содержащих сведения согласно условию задачи: Номер маршрута, вид транспорта, начальный...

Рассчитать параметры тела M, в зависимости от силы F и времени t
В общем задачка такая: Уравнение движения материального тела характеризуется его скоростью и ускорением s=s0+v0*t+(a*t^2)/2 ...

18
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
15.12.2019, 22:04
Указать правильный маршрут. У вас форме просто "result" написано, по идеи вообще работать не должно.
0
1 / 1 / 0
Регистрация: 24.02.2019
Сообщений: 101
17.12.2019, 19:52  [ТС]
tarasalk, здесь работа идет под опенсеервер. Путь верный.
0
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
17.12.2019, 22:10
Я работал с опенсервер и маршруты там обрабатываются точно также как и везде... конечно если вы там костыли не приписали . У вас случайно "test" это не название сайта? Если так то это супер костыль. Вместо этого используйте "/" вначале, тогда пути будут относительно корня.

Еще несколько подсказок:
1) В ошибке однозначно сказано что вы в метод PUT стучитесь через GET, так что маршруты точно неверные.
2) После отправки формы принято делать редирект, а не показывать вьюшку.
3) При PUT методе не надо передавать данные в url.
4) Документация у вас устаревшая, используйте актуальную.
5) А зависимости $request, $name должны работать.
1
1 / 1 / 0
Регистрация: 01.12.2014
Сообщений: 142
19.03.2022, 21:11
продолже тему тут, что бы не плодить новые. у меня очень похожая проблема. я пытаюсб достучаться до update
контроллер
PHP Скопировано
1
2
3
4
5
public function update(StationStoreRequest $request, Station $station)
    {
        $station->update($request->validated());
        return view('station-update', compact('station'));
    }
роут
PHP Скопировано
1
Route::put('/station-update/{id}', 'StationController@update')->name('station-update');
форма во вью
HTML5 Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<form action="{{ route('station-update')}}" method="post">
    @csrf
    @method('PUT')
    <div class="row mb-2">
        <div class="col-sm-10">
            <input type="text" name="name" value="{{$v['name']}}" required>
            <select name="company_id">
                <option value="0">--- Select company ---</option>
                <?php
                foreach($data as $key => $v) {
                    echo '<option value=" '
                        .$v['company_id']. ' ">'
                        .$v['company']['name'].
                        '</option>';
                }
                ?>
            </select></br>
            <input type="text" name="latitude" value="{{$v['latitude']}} required>
            <input type="text" name="longitude" value="{{$v['longitude']}} required></br>
            <input type="text" name="address" value="{{$v['address']}}" required>
            <input type="submit" value="Update">
        </div>
    </div>
</form>
и ошибка
PHP Скопировано
1
The GET method is not supported for this route. Supported methods: PUT.
я пробовал менять post/put и тд. на сколько я понимаю, ошибка говорит что по этому маршруту я не могу пройти через ГЕТ.. но я ведь указываю ПОСТ(ПУТ)..
0
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
19.03.2022, 21:22
html формы не поддерживают PUT запросы, только GET/POST. Поэтому либо меняете в роутере на POST, либо делаете запрос как-то по другому, например через ajax.
Ларавел правда как-то умеет костылить PUT запросы, но не рекомендую так делать, там просто эмуляция через скрытый тег.
0
1 / 1 / 0
Регистрация: 01.12.2014
Сообщений: 142
19.03.2022, 21:43
tarasalk, да я конечно пробовал менять на пост в роуте.. результат тот же
Code Скопировано
1
The GET method is not supported for this route. Supported methods: POST.
только теперь
Code Скопировано
1
Supported methods: POST.
вместо PUT но суть та же
0
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
19.03.2022, 22:18
Ну нет, так не может быть. У вас в форме POST, там GET никак не может быть. Надо дебажить.
0
1 / 1 / 0
Регистрация: 01.12.2014
Сообщений: 142
19.03.2022, 22:40
Вот сейчас у меня так
контроллер
PHP Скопировано
1
2
3
4
5
public function update(StationStoreRequest $request, Station $station)
    {
        $station->update($request->validated());
        return view('station-update', compact('station'));
    }
роут
PHP Скопировано
1
Route::post('/station-update/{id}', 'StationController@updat')->name('station-update');
блэйд
HTML5 Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<body class="container">
<p>STATION</p>
EDIT SOME ONE
 
<form action="{{ route('station-update')}}" method="post">
    @csrf
    @method('POST')
    <div class="row mb-2">
        <div class="col-sm-10">
            <input type="text" name="name" value="{{$v['name']}}" required>
            <select name="company_id">
                <option value="0">--- Select company ---</option>
                <?php
                foreach($data as $key => $v) {
                    echo '<option value=" '
                        .$v['company_id']. ' ">'
                        .$v['company']['name'].
                        '</option>';
                }
                ?>
            </select></br>
            <input type="text" name="latitude" value="{{$v['latitude']}} required>
            <input type="text" name="longitude" value="{{$v['longitude']}} required></br>
            <input type="text" name="address" value="{{$v['address']}}" required>
            <input type="submit" value="Update">
        </div>
    </div>
</form>
и ошибка
PHP Скопировано
1
2
Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException
The GET method is not supported for this route. Supported methods: POST.
Внедрение зависимости и параметры маршрута

не понимаю в чем прикол
0
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
19.03.2022, 23:50
Ну это же все тоже самое Видно что в итоге запрос GET.
Посмотрите сгенерированный код страницы, который в браузере, может там будет видно.
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
20.03.2022, 05:56
Kultanen, у вас это точно после отправки формы происходит? Может у вас предполагается отображение формы и её обработка после отправки по одному URI, но разными методами? Поэтому, когда вы пытаетесь перейти по ссылке к редактированию формы, получается такое, т.к. GET-маршрута не зарегистрировано.

Кстати, вот так в Blade не пишут:
PHP Скопировано
1
2
3
4
5
6
7
8
<?php
                foreach($data as $key => $v) {
                    echo '<option value=" '
                        .$v['company_id']. ' ">'
                        .$v['company']['name'].
                        '</option>';
                }
                ?>
Там есть свой foreach, да и конкатенация ни к чему:
PHP Скопировано
1
2
3
@foreach($data as $v)
    <option value="{{ $v['company_id'] }}">{{ $v['company']['name'] }}</option>
@endforeach
1
1 / 1 / 0
Регистрация: 01.12.2014
Сообщений: 142
20.03.2022, 16:34
Para bellum, Наверное я запутался в структуре проекта
вот как полностью выглядит роуты
PHP Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});
 
Route::apiResources([
    '/companies'=>CompanyController::class,
    '/stations'=>StationController::class,
]);
 
Route::post('/companies-new', 'CompanyController@store')->name('company-new');
Route::post('/station-new', 'StationController@store')->name('station-new');
Route::get('/station-delete/{id}', 'StationController@destroy')->name('station-delete');
//Route::get('/station-update/{id}', 'StationController@update')->name('station-update');
Route::post('/station-update/{id}', 'StationController@update')->name('station-update');
Route::get('/company-delete/{id}', 'CompaniesController@destroy')->name('company-delete');
вот какие вьюхи у меня есть
Название: 00.JPG
Просмотров: 42

Размер: 14.2 Кб
скрин со страницы stations
Внедрение зависимости и параметры маршрута

Delete работает, create new работает. edit не хочет..
по началу
PHP Скопировано
1
Route::get('/station-delete/{id}', 'StationController@destroy')->name('station-delete');
тоже не работал, выдавал ту же ошибку. я просто сменил на get, и он заработал. что тоже осталось для меня загадкой. но работает. а вот update - нет. Форму из шаблона station-edit.blade я пробовал подключать как часть {{@section('edit')}}, и пробовал просто прописывать всю форму в stations.blade.php ни один вариант не сработал.
плюс, я еще не понимаю как мне сделать в роутах, что бы не мешать обычные роуты, с Route::apiResources.. хотелось бы что бы было максимально в одном стиле. сейчас каша, но решить надо. а по времени - еще вчера , как говорится..
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
20.03.2022, 17:16
Не надо было одновременно использовать Route::apiResources и отдельные регистрации маршрутов для стандартных действий над сущностью "station".
Route::apiResources уже регистрирует маршруты для всех стандартных действий, в самодельных маршрутах нет необходимости.
С company то же самое.

https://laravel.com/docs/9.x/c... controller

Сделайте копию проекта, на всякий случай, затем полностью уберите это:
PHP Скопировано
1
2
3
4
5
6
Route::post('/companies-new', 'CompanyController@store')->name('company-new');
Route::post('/station-new', 'StationController@store')->name('station-new');
Route::get('/station-delete/{id}', 'StationController@destroy')->name('station-delete');
//Route::get('/station-update/{id}', 'StationController@update')->name('station-update');
Route::post('/station-update/{id}', 'StationController@update')->name('station-update');
Route::get('/company-delete/{id}', 'CompaniesController@destroy')->name('company-delete')
Уберите слэши в массиве, передаваемом в Route::apiResources

И везде поменяйте имена самодельных маршрутов (station-new и т.д.) на те, что указаны (Route Name) по ссылке выше.
Цитата Сообщение от Kultanen Посмотреть сообщение
тоже не работал, выдавал ту же ошибку. я просто сменил на get, и он заработал. что тоже осталось для меня загадкой
Потому что у вас в синей таблице, скрин которой вы привели, "Delete" -- ссылка, а не кнопка, отправляющая форму.
1
1 / 1 / 0
Регистрация: 01.12.2014
Сообщений: 142
20.03.2022, 18:40
Para bellum, все сделал по вашему совету

роут
PHP Скопировано
1
2
3
4
5
6
7
8
9
10
11
Route::apiResources([
    'companies'=>CompanyController::class,
    'stations'=>StationController::class,
]);
 
//Route::post('/companies-new', 'CompanyController@store')->name('company-new');
//Route::post('/station-new', 'StationController@store')->name('station-new');
//Route::get('/station-delete/{id}', 'StationController@destroy')->name('station-delete');
////Route::get('/station-update/{id}', 'StationController@update')->name('station-update');
//Route::post('/station-update/{id}', 'StationController@update')->name('station-update');
//Route::get('/company-delete/{id}', 'CompaniesController@destroy')->name('company-delete');
PHP Скопировано
1
2
3
4
5
6
7
8
9
@foreach($data as $key => $v)
            <td>{{$v['name']}}</td>
            <td>{{$v['address']}}</td>
            <td>{{$v['latitude']}}</td>
            <td>{{$v['longitude']}}</td>
            <td>{{$v['company']['name']}}</td>
            <td><a href="{{route('stations.update',$v->id)}}">Edit</a>
            <a href="{{route('stations.destroy',$v->id)}}">Delete</a></td></tr>
    @endforeach
везде поменял все но
Code Скопировано
1
Missing required parameter for [Route: stations.update] [URI: api/v1/stations/{station}] [Missing parameter: station]. (View: C:\os\OSPanel\domains\virta\resources\views\station-edit.blade.php)
в этой форме
HTML5 Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<form action="{{ route('stations.update')}}" method="post">
    @csrf
    @method('PUT')
    <div class="row mb-2">
        <div class="col-sm-10">
            <input type="text" name="name" value="{{$v['name']}}" required>
            <select name="company_id">
                <option value="0">--- Select company ---</option>
                @foreach($data as $v)
                    <option value="{{ $v['company_id'] }}">{{ $v['company']['name'] }}</option>
                @endforeach
            </select></br>
            <input type="text" name="latitude" value="{{$v['latitude']}}" required>
            <input type="text" name="longitude" value="{{$v['longitude']}}" required></br>
            <input type="text" name="address" value="{{$v['address']}}" required>
            <input type="submit" value="Update">
        </div>
    </div>
</form>
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
20.03.2022, 18:48
Вот тут неправильно роут указан:
PHP/HTML Скопировано
1
<td><a href="{{route('stations.update',$v->id)}}">Edit</a>
Укажите stations.edit

А это
PHP Скопировано
1
<form action="{{ route('stations.update')}}" method="post">
замените на
PHP Скопировано
1
<form action="{{ route('stations.update', $v['id']) }}" method="post">
0
1 / 1 / 0
Регистрация: 01.12.2014
Сообщений: 142
20.03.2022, 19:52
Цитата Сообщение от Para bellum Посмотреть сообщение
<form action="{{ route('stations.update', $v['id']) }}" method="post">
да конечно я так пробовал я перед тем как спросить что то, пробую сам
Code Скопировано
1
Undefined variable: v
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
20.03.2022, 20:36
А, ну да, она же у вас только в цикле появляется. Кстати, после цикла в $v['latitude'] и т.п. будут содержаться значения из последнего элемента, который был в $data.

К делу.
Во-первых, я почему-то упустил из виду, что маршруты генерируются для API. О каких blade-шаблонах речь, в таком случае? Если вы хотите выводить обычные HTML-страницы, то надо поменять Route::apiResources на Route::resources

Во-вторых, в методе edit контроллера передавайте модель в шаблон. Примерно так это будет выглядеть:
PHP Скопировано
1
2
3
4
public function edit(Station $station)
{
    return view('station-update', compact('station'));
}
А из метода "update" return view вообще удалите, этот метод предназначен только выполнения запроса к базе и перенаправления.

А форма будет выглядеть так:
PHP/HTML Скопировано
1
<form action="{{ route('stations.update', $station) }}" method="post">
0
1 / 1 / 0
Регистрация: 01.12.2014
Сообщений: 142
20.03.2022, 21:33
Цитата Сообщение от Para bellum Посмотреть сообщение
<form action="{{ route('stations.update', $station) }}" method="post">
station я тоже пробовал передавать. У меня нет метода edit в контроллере. это api контроллер, там только update. мне нужен именно api. в общем я запутался окончательно видимо в структуре. наверное легче начать и переписать все с нуля
но не хочется кончно
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
21.03.2022, 05:28
Цитата Сообщение от Kultanen Посмотреть сообщение
это api контроллер, там только update
Тогда возвращаемся к моему вопросу выше:
Цитата Сообщение от Para bellum Посмотреть сообщение
О каких blade-шаблонах речь, в таком случае?
API по сути своей не должен отдавать никаких HTML-представлений страниц.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.03.2022, 05:28
Помогаю со студенческими работами здесь

Передавать в макрос параметры в зависимости от выбранной ячейки
Суть такова: мне нужно привязать уже готовый макрос к нескольким ячейкам (макрос - на внешний запуск приложения) но при этом ещё...

Методом наименьших квадратов найти параметры нелинейной зависимости
Друзья, помогите пожалуйста! Задача: методом наименьших квадратов найти параметры нелинейной зависимости y=a*x/(b+x). Исходные данные: x=(2...

LM317 параметры, DS18B20 параметры, увеличение длины линии.
Добрый день, у меня образовалось 2 вопроса, на которые не могу найти конкретный ответ. Первый вопрос - Какая должна быть минимальная...

Расчитать параметры ЛРП (Первичные и вторичные параметры)
Помогите пожалуста разобратся с задачей (экзамечионный билет) Я как то - с горем пополам рассчитал Zкз и Zх.х однако я не уверен что...

Параметры-значения и параметры-переменные в функции и процедуре
Плиз помогите в этом коде поставить параметры или атрибуты, не уверен в правильном названии, для функции и процедуры, я по примерам...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Похоже LM превзошла меня в умении манипулирования аргументами, но это надо проверить. Линейное решение нелинейной задачи.
Hrethgir 10.04.2025
В продолжение Эта LM дала ответ похожий на нормальный. В комментриях мой комментарий - похоже она првзошла меня в умении манипуляций аргументами. Assistant qwen2. 5-14b-instruct . Сначала. . .
Переменные в Python
py-thonny 10.04.2025
Переменная в программировании — это символическое имя, связанное с областью памяти, в которой хранится значение. Она позволяет получать доступ к данным через понятные человеку идентификаторы, а не. . .
Многопоточность в C#: Task и асинхронные операции
UnmanagedCoder 10.04.2025
Многопоточность позволяет выполнять несколько операций одновременно, что важно для решения двух основных задач: повышения скорости выполнения вычислительно-сложных операций и сохранения отзывчивости. . .
Линейное решение не линейной задачи (емкость вычислений в сравнении с традиционными решениями пока не определена).
Hrethgir 10.04.2025
В рамках предстоящих вычислений пришлось (да, я тоже знаю про корень числа, и про степеня, и прочие теоремы, но. . . ) найти способ нахождения отношения двух углов. . . .
Запуск контейнеров Docker на ARM64
Mr. Docker 09.04.2025
Появление таких решений, как Apple M1/ M2, AWS Graviton, Ampere Altra и Raspberry Pi, сделало использование ARM-систем обыденностью для многих разработчиков и DevOps-инженеров. При этом Docker,. . .
Vue SFC компонент на PHP с Fusion
Jason-Webb 09.04.2025
PHP на сервере и JavaScript на клиенте — классическое сочетание, которое, несмотря на свою эффективность, создает определенный когнитивный диссонанс при разработке. В этом контексте появляются. . .
TypeScript vs JavaScript: Отличия и когда что использовать
Reangularity 09.04.2025
JavaScript появился в 1995 году как творение Брендана Эйха и быстро стал основой интерактивности в вебе. За свою историю он прошел путь от простого языка для манипуляций с DOM до полноценной. . .
Подключение Kafka к Elasticsearch
Codd 09.04.2025
Apache Kafka и Elasticsearch — две мощные технологии, которые при совместном использовании создают эффективную платформу для обработки и анализа данных в реальном времени. Kafka, выступая в роли. . .
Реализации таймеров в Unity
GameUnited 09.04.2025
Время — важный ресурс любой игры. Разработка качественных игровых механик невозможна без грамотного управления временем, а таймеры выступают ключевым инструментом этого управления. Представьте себе. . .
Функции высшего порядка в JavaScript
run.dev 09.04.2025
Функции высшего порядка представляют собой один из фундаментальных камней функционального программирования в JavaScript. По сути, это функции, которые либо принимают другие функции в качестве. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер