Panowie nie bardzo wiem lub nie bardzo rozumiem , zasadę tworzenia szablonów by móc skorzystać z funkcji Mail , w czystym php'ie wystarczyło dołączyć klasę phpmailer i na tym temat się kończył.
Chciałbym wykonać schemat rejestracji dwu etapowej, tzn. user się rejestruje , Ja wysyłam do niego wiadomość z kodem, w tym czasie rejestracja się przeładowuje np na strona/activate z polem do wpisania kodu oraz przyciskiem "wyślij ponownie kod" , następnie po wklepaniu poprawnego kodu wylogowuje się do panelu administracyjnego.
Mój obecny kod RegisterController.php
<?php namespace App\Http\Controllers\Auth; use DateTime; use Request; use App\{User,Role}; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Validator; use Illuminate\Foundation\Auth\RegistersUsers; use Webpatser\Uuid\Uuid; //to nam daje losowanie klucza losowego class RegisterController extends Controller { use RegistersUsers; protected $redirectTo = '/admin'; public function __construct() { $this->middleware('guest'); } protected function validator(http://www.php.net/array $data) { return Validator::make($data, [ 'user' => 'required|string|max:255', 'email' => 'required|string|email|max:255|unique:users', 'password' => 'required|string|min:6|confirmed', ]); } protected function create(http://www.php.net/array $data) { $data = http://www.php.net/array( 'name' => "Learning Laravel", ); $user = User::create([ 'id_user' => http://www.php.net/rand(100, 999999999), 'user' => $data['user'], 'email' => $data['email'], 'password' => bcrypt($data['password']), 'ip' => Request::ip(), 'key' => Uuid::generate()->string, 'date' => new DateTime(), ]); if(!Role::where('name','firm')->exists()) { Role::create(['name'=>'firm']); Role::create(['name'=>'person']); Role::create(['name'=>'moderator']); Role::create(['name'=>'admin']); } if($data['type'] 0) $user->roles()->attach( Role::where('name','firm')->first()->id ); else $user->roles()->attach( Role::where('name','person')->first()->id ); return $user; } }
php artisan make:mail Activate
public function build() { return $this->view('emails.activate'); }
http://www.php.net/mail::send('emails.activate', $data, function ($message) { $message->from('odkogo@.pl', 'Forum'); $message->to('odKogo@pl')->subject('Wiadomość lub chyba jakoś wyciągnięcie z blade ?'); });
no ale z czym masz problem ? Wkleiłeś trochę kodu - pewnie zapatrzonego z neta, podstawę jakąś masz, co chcesz zrobić też wiesz, to dlaczego nie lecisz z tematem ? pisz, testuj, czytaj dokumentacje. jak będziesz miał z czymś konkretnym problem to pisz, bo na razie to wygląda tak: "rzuciłem wam kawałek kodu, weźcie dopiszcie resztę aby działało"
wkleiłem kod by dowiedzieć się / zasięgnąć porady starszych rangą czy ów sposób jest poprawny czy można to zrobić w sposób prostszy.
Swoją drogą, czy jeśli będę chciał więcej razy korzystać z ::Mail to tyle razy mam tworzyć model blady itd?
Aktywuj, Newsletter, WyślijWiadomość itd itp ?
im dalej w las tym większe drzewa w tym Laravelu
z tego co zrozumiałem, config/mail.php wybiera ustawienia jeżeli jest konfiguracja w env
logi pokazują , że niby wiadomość wysłana ,a mimo tego brak wiadomości na mailu (tak SPAM) też sprawdziłem.
Czy da radę sprawdzić brak autoryzacji do smtp lub inne wyjątki ?
@markonix nie bardzo rozumiem, czepiania się randowania id_user oraz datetime zamiast timestampa , tym bardziej, że nie interesują mnie strefy czasowe a w sam timestamp jest nieczytelny spoglądając w phpmyadmin. Co z tego że jest timestamp rekomendowany , skoro musiałbym go "obrabiać"
Tworze tak jak w tym tutorialu , nawet skorzystałem z mailTrapa lecz nic nie otrzymuje na maila. W logach jest treść blade'a.
W RegisterController.php kod:
protected function create(http://www.php.net/array $data) { http://www.php.net/mail::to('podtenwysylam@pl')->send(new Activate); $fail = http://www.php.net/mail::failures(); if(!http://www.php.net/empty($fail)) throw new \Exception('Could not send message to '.$fail[0]);
class Activate extends Mailable { use Queueable, SerializesModels; public function __construct() { // } public function build() { return $this->from('from@example.com', 'Mailtrap') ->subject('Mailtrap Confirmation') ->view('emails.activate'); } }
id_user musi być unikalny. Używając rand, to tak jakbyś kostką rzucał. Czasem wypadnie 3 razy to samo.
w zakresie 100 - 999999999 ciężko powtórzyć te samo wylosowanie , po drugie, pole id_user jest w bazie unikatowe czyli nie zdubluje, po trzecie będzie warunek na etapie walidacji , że coś poszło nie tak.
Tak czy inaczej to zły pomysł. Oprócz wysyłki możesz też maila wyświetlić. Może w szablonie jest problem?
@viking - zatem jaki masz pomysł na generowanie losowego ID usera - nie auto
inkrementacja.
w activate.blade.php mam tylko "poszło"
zupdatowałem trochę kod i otrzymuję błąd nie wysłania "Email could not be sent.":
plik Activate.php
class Activate extends Mailable { use Queueable, SerializesModels; public function __construct() { } public function build() { return $this->view('emails.activate'); } }
protected function create(http://www.php.net/array $data) { $result = http://www.php.net/mail::send('emails.activate', $data, function($message){ $message->from('898d3be566-f775ac@inbox.mailtrap.io', 'My Website'); $message->to('dokogo@adres.pl')->subject('My Subject'); }); $fail = http://www.php.net/mail::failures(); if(!http://www.php.net/empty($fail)) throw new \Exception('Could not send message to '.$fail[0]); if(http://www.php.net/empty($result)) throw new \Exception('Email could not be sent.'); $user = User::create([ 'id_user' => http://www.php.net/rand(100, 999999999), 'user' => $data['user'], 'email' => $data['email'], 'password' => bcrypt($data['password']), 'ip' => Request::ip(), 'key' => Uuid::generate()->string, 'date' => new DateTime(), ]); if(!Role::where('name','firm')->exists()) { Role::create(['name'=>'firm']); Role::create(['name'=>'person']); Role::create(['name'=>'moderator']); Role::create(['name'=>'admin']); } if($data['type'] 0) $user->roles()->attach( Role::where('name','firm')->first()->id ); else $user->roles()->attach( Role::where('name','person')->first()->id ); return $user; }
właśnie chcę uniknąć auto inkrementacji , nie chce by ktoś skakał mi po profilach strona.pl/id/1 , strona.pl/id/2 itd
po paru godzinach walki zaczęło trybić, być może dlatego , że przepisałem dane w config/mail.php
Nie rozumiem jednego dlaczego przy poprawnym wysłaniu maila spełnia się ten warunek (kod zaczerpnięty z neta):
$result = http://www.php.net/mail::send('emails.activate', $data, function($message){ $message->from('odkogo@pl', 'My Website'); $message->to('dokogo@pl')->subject('My Subject'); }); $fail = http://www.php.net/mail::failures(); if(http://www.php.net/empty($result)) throw new \Exception('Email could not be sent.');
Ehh Przecież dostałeś odpowiedź w innym temacie a Ty nadal swoje (mówię o unikalnych wartościach)
https://github.com/webpatser/laravel-uuid/
@Pyton_000 UUID zastosowałem do wygenerowania unikalnego kodu weryfikacji, natomiast id_user i tak będę się upierać , że lepszy random z ewentualnym sprawdzaniem czy istnieje niż autoinkrementacja.
Chociaż tak sobie pomyślałem, że do id_user też można użyć wspomnianego uuid
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)