Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Доброго времени суток.
Для сайта необходимо реализовать отправку подтверждения на почту.
Установил стандартную форму регистрации\авторизации через php artisan make:auth.
В файле web.php соответственно появились роуты:
Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');
а где непосредственно лежит контроллер и метод роута ('register'), по которому отправляются данные формы-регистрации? что бы в нем создавать токен и отправлять вьюху с ссылкой-подтверждением на почту
Это же он вызывается методы validator() и create() контроллера RegisterController, которые проверяют и добавляют пользователя в базу?
--------------------------------
Версия Laravel в формате 5.5.14
Версия PHP в формате 7.1
Операционная система и её версия ( Windows 10 x64 )
Вендор и версия Веб-сервера в формате Apache- PHP - 7 / Nginx 1.10
---------------------------------
Существует список докторов, которых получаю из БД в переменную:
$doctors = Doctor::select('name', 'specialization')->get();
Есть список клиентов, которые записаны к этим врачам:
$clients = Doctor::select(.....)->get()
В нынешнем варианте реализации проекта для отображения расписания необходимо, что бы каждый элемент коллекции $clients (ключь - имя врача) содержал ровно 9 элементов (это временные отрезки, на которые можно записаться).
По этому, если например, у кого-то есть 8 пациентов, то 9-й отрезок забивается тестовыми данными.($doctors_time_arr2 - "служебный" массив... так пока надо, в него передаются данныне из $clients) )
foreach ($doctors as $item){
// try {
while (count($doctors_time_arr2[$item->name]) < 9) {
array_push($doctors_time_arr2[$item->name], ([ .... ]);
Если каждый из существующих врачей ($doctors) имеет хотя бы по 1 клиенту - все работает норм!, но если например врачей 6, а на сегодня записывались только к 5-ти, то цикл foreach не может заполнить 6-го врача тестовыми данными.
Выдает такую ошибку: ErrorException (E_NOTICE) Undefined index: Олег Дмитриевич.
Я хотел отловить эту ошубку через try-catch.
Так как это ErrorException, то хотелось как-то так:
foreach ($doctors as $item){
try {
while (count($doctors_time_arr2[$item->name]) < 9) {
array_push($doctors_time_arr2[$item->name], ([
'name' => 'noname',
'specialization' => 'specialization',
'doctor' => 'nodoctor',
'time' => '19:00',
'status' => '2'])
);
}
}
catch (ErrorException $e){
$doctors_time_arr2[] = $item->name;
while (count($doctors_time_arr2[$item->name]) < 9) {
array_push($doctors_time_arr2[$item->name], ([
'name' => 'noname',
'specialization' => 'specialization',
'doctor' => 'nodoctor',
'time' => '19:00',
'status' => '2'])
);
}
}
Но ошибка осталась. Как решить этот конфликт?
Silm, пасиб)...но я уже пробовал как ты советуешь (см. ответ от Proger_XP ).
var_dump($checkName);
print_r($checkName->first());
if ($checkName->first()){
dd("Есть!");
}
else{
dd("Нет!");
}
Повторюсь, результат, и когда вернулось 0 строк, и когда вернулась 1 строка одинаков(((( :
object(Illuminate\Support\Collection)#216 (1) {
["items":protected]=>
array(1) {
[0]=>
object(stdClass)#214 (1) {
["count(*)"]=>
int(0)
}
}
}
stdClass Object
(
[count(*)] => 0
)
"Есть!"
------------------
object(Illuminate\Support\Collection)#216 (1) {
["items":protected]=>
array(1) {
[0]=>
object(stdClass)#214 (1) {
["count(*)"]=>
int(1)
}
}
}
stdClass Object
(
[count(*)] => 1
)
"Есть!"
Тему пока рано закрывать((
К сожалению видно я никак не пойму каких-то азов(( :
Proger_XP, написал хорошую подсказку, но я не могу найти метод для работы с коллекциями, который просто вернет ЗНАЧЕНИЕ элемента коллекции, которое я смогу проверить в if().
Рассуждаем так:
Моя коллекция состоит из 1 элемента (всегда 0 или 1).
Тогда, например, посчитаем максимальное число из коллеции 1-го элемента (ну или среднее, или сумму):
$checkName->max(); // должно вернуться 1 или 0 ?????
Тогда код должен отработать:
if ($checkName->max()){
dd("Есть!");
}
else{
dd("Нет!");
}
А на самом деле(((
Результат:
[{"count(name)":1}]
"Есть!"
__________________
[{"count(name)":0}]
"Есть!"
и таки да, он есть, причем всегда. Поэтому для такого запроса ветка с dd("Нет!"); никогда не будет исполнена.
Proger_XP, спасибо! Написал еще в личку...
Решил обойти ошибку и подсчитывать количество возвращенных строк. Этот запрос работает:
$checkName = DB::table('clients')->select(DB::raw('count(*)'))->where([
['doctor', '=', $request->input('doctor')],
['day', '=', $request->input('day')],
['time', '=', $request->input('cron')]
])->get();
Но не могу понять, ПОЧЕМУ!?! следующая проверка всегда возвращает "Есть!", хотя видно что в одном случае в единственный элемент коллекции = 1, а в другом = 0.
var_dump($checkName);
print_r($checkName->first());
if ($checkName->first()){
dd("Есть!");
}
else{
dd("Нет!");
}
Что показывает браузер:
object(Illuminate\Support\Collection)#216 (1) {
["items":protected]=>
array(1) {
[0]=>
object(stdClass)#214 (1) {
["count(*)"]=>
int(0)
}
}
}
stdClass Object
(
[count(*)] => 0
)
"Есть!"
------------------
object(Illuminate\Support\Collection)#216 (1) {
["items":protected]=>
array(1) {
[0]=>
object(stdClass)#214 (1) {
["count(*)"]=>
int(1)
}
}
}
stdClass Object
(
[count(*)] => 1
)
"Есть!"
Хотя, может не в кавычках дело.
Заменил whereColumn на простой запрос:
$checkName = Client::select('name')->where([['doctor', '=', $request->input('doctor')]])->get();
и все отработало правильно.
Не понимаю, в документации же сказано:
"...В метод whereColumn() также можно передать массив с несколькими условиями. Эти условия будут объединены оператором AND:
PHP
$users = DB::table('users')
->whereColumn([
['first_name', '=', 'last_name'],
['updated_at', '>', 'created_at']
])->get();
"
Что не так с моим запросом?
$checkName = Client::select('name')->whereColumn([['doctor', '=', $request->input('doctor')],
['day', '=', $request->input('day')],
['time', '=', $request->input('cron')]
])->get();
Всем доброго времени суток. Продолжаю осваивать Ларавел на примере локального сайта (стоматологическая клиника).
--------------------------------
Версия Laravel в формате 5.5.14
Версия PHP в формате 7.1
Операционная система и её версия ( Windows 10 x64 )
Вендор и версия Веб-сервера в формате Apache- PHP - 7 / Nginx 1.10
----------------------------------
На сайте есть форма регистрации на прием к дантисту (ФОИ, телефон, врач, день, время, комментарий).
Реализовую невозможность записаться к конкретному врачу, если на выбранное время и в выбранный день пациент уже есть.
Для этого из таблицы в переменную $checkName хочу сохранить имя пациента (если такой есть), который записался на выбранную дату к данному врачу. Если запрос не выбрал ни одной записи - отрабатывается dd в блоке catch. Если же переменная не пустая - отрабатывается dd в блоке try.
http://ibb.co/jCN2BS
но вылетает ошибка:
http://ibb.co/i9og5n
Дело в кавычках в имени врача, который приходит с формы.
Исполнил этот же запрос в phpmyadmin: с одинарными ' ' - все работает.
http://ibb.co/gC4Sd7
а с ` ` - опять ошибка
http://ibb.co/eYgUrS
Буду благодарен за подсказку как это поправить!)
Если не решил проблему, покажи пожалуйста код, где сохраняется пароль
не , все верно. Я когда переопределил метод убрал функцию bcrypt(). Теперь все норм.
А под такой маленький вопрос все равно в новой теме расписывать все по шаблону: данные системы, версию php и т.д ?
Спасибо)
учту...
Еще вопрос. Читал документацию, но не нашел ответ:
при регистрации пользователя в базе его пароль проверяется на соответствие условию:
'password' => 'required|string|min:6|confirmed';
в этом случае можно вводить только буквы и пароль записывается в базу уже в шифрованном виде $2y$10$E5ez9aJDCUZobcSt.ndAkeR9lrXdwr25Xc4xyscqGZHcv8DOGjUYu
Но я хочу что бы можно было вводить и цифры, по этому меняем условие проверки
'password' => 'required|min:6|confirmed';
Но теперь пароль не шифруется - a1a1a1.
Как исправить?)
Сейчас создам еще одни метод form1, посмотрим... Может они оба выполнятся...
дописал в web.php строчку:
Route::post('/','MainController@form1');
в контроллер ниже функции
public function form(){
Client::where('id',1)->update([
'name' => $request->input('name'),
'phone' => $request->input('phone'),
'service' => $request->input('service'),
'doctor' => $request->input('doctor'),
'day' => $request->input('day'),
'time' => $request->input('cron'),
'comment' => $request->input('comment'),
]);
$doctors = Doctor::skip(0)->take(3)->orderBy('id', 'desc')->get();
return view('main')->with(['b_doctors'=>$doctors,]);
}
дописал
public function form1(){
die("1234567");
}
После оправки формы - данные в БД не обновились (то есть form не отработал ?!?),а на белом фоне экрана появились 1234567
Вопросы остаются - буду еще разбираться....
Почему вы не используете Request? То что вы используете не ларавел вей.
виноват, спасибо!
Я читал документацию...
Роут 'pageMain' вызывает метод контроллера main, и ни какой другой.
Почему срабатывает метод form?
Может метод отправки формы "важнее" роута, и, видя что передаем данные через пост, выбирается метод, за который отвечает пост???
Сейчас создам еще одни метод form1, посмотрим... Может они оба выполнятся...
может быть php artisan route:clear ?
Route cache cleared!, все равно работает....
Он же берёт из модельки файл и обрабатывает его через б/д. Возможно проблема там. Нужно тщательно всё перепроверить
код модели я приводил. Там больше ничего нет. Ну кроме первых строчек:
namespace App\Http\Controllers;
use App\Client;
use Illuminate\Http\Request;
use App\Doctor;
Всем доброго времени суток. Начинаю осваивать Ларавел на примере локального сайта (стоматологическая клиника).
--------------------------------
Версия Laravel в формате 5.4.
Версия PHP в формате 7.1
Операционная система и её версия ( Windows 10 x64 )
Вендор и версия Веб-сервера в формате Apache- PHP - 7 / Nginx 1.10
----------------------------------
Ошибки нет, хотя ожидал.
Догадок нет.
Итак,есть следующие файлы:
1. в web.php несколько роутов, привожу только интересующие :
// Главная страница
Route::get('/','MainController@main')->name('pageMain');
....
// Обработка формы заявки
Route::post('/','MainController@form')->name('form');
2. в main.blade.php кроме всего прочего есть код формы заявки :
<form action="{{route('pageMain')}}" method="post">
...
</form>
3. в MainController.php описаны 2 метода:
class MainController extends Controller
{
public function main() {
$doctors = Doctor::skip(0)->take(3)->orderBy('id', 'desc')->get();
return view('main')->with(['b_doctors'=>$doctors,]);
}
public function form(){
Client::where('id',1)->update([
'name' => $_POST['name'],
'phone' => $_POST['phone'],
'service' => $_POST['service'],
'doctor' => $_POST['doctor'],
'day' => $_POST['day'],
'time' => $_POST['cron'],
'comment' => $_POST['comment'],
]);
$doctors = Doctor::skip(0)->take(3)->orderBy('id', 'desc')->get();
return view('main')->with(['b_doctors'=>$doctors,]);
}
}
Вопрос: почему приведенный код осуществляет корректное обновление первой записи в БД, ведь форма НЕ обрабатывается методом form ?
Страницы 1