Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Какой у вас менеджер очередей в в config/queue стоит, например?
'default' => env('QUEUE_CONNECTION', 'sync'),
и в .env тоже посмотрите.
Authentication required
MAIL_USERNAME=null
MAIL_PASSWORD=null
У вас же конкретная ошибка, ошибка аутентификации. Пропишите параметры пользователя.
В настройках ЯМ все прописал, тестовое сообщение уходит на нужный адрес.
Дайте ссылку на документацию, где описывается механизма и структура пуша.
Остается вопрос с простынями роутов
Для crud Resource Controllers. Первые абзацы описание, в таблице обьяснения как сопоставляются роуты с именами методов и типами запросов.
Я не знаю как у вас реализован роут, но в middleware можно достать все что нужно через $request (Illuminate\Http\Request)
public function handle(Request $request, Closure $next) {
$journal = $request->route('journal');
}
нужно как то редиректить незалогиненных пользователей на страницу входа, желательно из роутов, мой список роутов
Почитайте документацию внимательно еще раз, главы авторизации, аутентификации и посредники(ссылку я вам давал выше), вам не нужно городить велосипед. Все уже сделано за вас, разберитесь каким образом происходит проверка пользователя и как добавить кастомные посредники. Примеров на эту тему за глаза. Все роуты закрываются за посредниками, без каких-либо велосипедов. И еще почитайте вот Для тем "как сделать" или "помогите".
Реально ли это вообще?
Реально.
Выдержка из документации.
Next, you should modify the RedirectIfAuthenticated middleware's handle method to use your new URI when redirecting the user.
public function payment(Request $request)
Вы для чего используете этот метод? Если для пуша, то я не совсем понимаю что вы делаете в вашем коде.
->where(function ($query) use ($lessonType) {
$query->where('Active', 1)
->where('ct.CriterionType', $lessonType);
})
->orWhere(function ($query) {
$query->where('Active', 1)
->where('ct.CriterionType', UserLessonRateEnum::TYPE_ALL);
})
Попробуйте так.
->get()
->toArray();
Не самая лучшая идея. Нет лимита выборки и преобразование в array. Ситуационно конечно, но лучше избегать такой последовательности.
Смотрите в сторону push-настроек на стороне платежных систем. С вашей стороны нужно подготовить урл куда будет стучаться платежка. Под каждую систему свой урл. И сразу подготовьте консольную команду для ручной проверки платежа по его идентификатору. Из опыта скажу, будете пользоваться чуть чаще чем всегда). Урлы должны быть закрыты за https.
И я бы на вашем месте посмотрел в сторону laravel-mix c версионированием
if (mix.inProduction()) {
mix.version();
}
Найдите как хешируется пароль в вордпресе и сделайте кастомный юзер провайдер в ларавеле.
Для пароля вам потребуется реализовать своей хешер. Для этого наследуйтесь от \Illuminate\Contracts\Hashing\Hasher.
Выдернул из проекта. Надеюсь разберетесь.
namespace App\Engine;
use App\Http\Engine;
use Illuminate\Support\Str;
use Illuminate\Contracts\Auth\UserProvider;
use Illuminate\Contracts\Hashing\Hasher as HasherContract;
use Illuminate\Contracts\Auth\Authenticatable as UserContract;
class SageUserProvider implements UserProvider
{
/**
* The hasher implementation.
*
* @var \Illuminate\Contracts\Hashing\Hasher
*/
protected $hasher;
/**
* The Eloquent user model.
*
* @var string
*/
protected $model;
/**
* Create a new database user provider.
*
* @param \Illuminate\Foundation\Application $app
*/
public function __construct($app)
{
$this->model = array_get($app['config'], 'auth.providers.sage.model');
$this->hasher = $app['hash'];
}
/**
* Retrieve a user by their unique identifier.
*
* @param mixed $identifier
* @return \Illuminate\Contracts\Auth\Authenticatable|null
*/
public function retrieveById($identifier)
{
//parser identifier
$parts = explode("_", $identifier);
$model = $this->createModel();
return $model->newQuery()
->where("CodigoEmpresa", $parts[0])
->where('CodigoComisionista', $parts[1])
->first();
}
/**
* Retrieve a user by their unique identifier and "remember me" token.
*
* @param mixed $identifier
* @param string $token
* @return \Illuminate\Contracts\Auth\Authenticatable|null
*/
public function retrieveByToken($identifier, $token)
{
$parts = explode("_", $identifier);
$model = $this->createModel();
return $model->newQuery()
->where("CodigoEmpresa", $parts[0])
->where('CodigoComisionista', $parts[1])
->where($model->getRememberTokenName(), $token)
->first();
}
/**
* Update the "remember me" token for the given user in storage.
*
* @param \Illuminate\Contracts\Auth\Authenticatable $user
* @param string $token
* @return void
*/
public function updateRememberToken(UserContract $user, $token)
{
\Log::info('updateRememberToken');
$user->setRememberToken($token);
$user->save();
}
/**
* Retrieve a user by the given credentials.
*
* @param array $credentials
* @return \Illuminate\Contracts\Auth\Authenticatable|null
*/
public function retrieveByCredentials(array $credentials)
{
if (empty($credentials)) {
return;
}
// First we will add each credential element to the query as a where clause.
// Then we can execute the query and, if we found a user, return it in a
// Eloquent User "model" that will be utilized by the Guard instances.
$query = $this->createModel()->newQuery();
foreach ($credentials as $key => $value) {
if (! Str::contains($key, 'password')) {
$query->where($key, $value);
}
}
//$query->where('CodigoEmpresa', Engine::$empresa);
return $query->first();
}
/**
* Validate a user against the given credentials.
*
* @param \Illuminate\Contracts\Auth\Authenticatable $user
* @param array $credentials
* @return bool
*/
public function validateCredentials(UserContract $user, array $credentials)
{
$plain = $credentials['password'];
return $this->hasher->check($plain, $user->getAuthPassword());
}
/**
* Create a new instance of the model.
*
* @return \Illuminate\Database\Eloquent\Model
*/
public function createModel()
{
$class = '\\'.ltrim($this->model, '\\');
return new $class;
}
/**
* Gets the hasher implementation.
*
* @return \Illuminate\Contracts\Hashing\Hasher
*/
public function getHasher()
{
return $this->hasher;
}
/**
* Sets the hasher implementation.
*
* @param \Illuminate\Contracts\Hashing\Hasher $hasher
* @return $this
*/
public function setHasher(HasherContract $hasher)
{
$this->hasher = $hasher;
return $this;
}
/**
* Gets the name of the Eloquent user model.
*
* @return string
*/
public function getModel()
{
return $this->model;
}
/**
* Sets the name of the Eloquent user model.
*
* @param string $model
* @return $this
*/
public function setModel($model)
{
$this->model = $model;
return $this;
}
}
namespace app\Hashing;
use Illuminate\Contracts\Hashing\Hasher as HasherContract;
class Md5CryptHasher implements HasherContract
{
/**
* Hash the given value.
*
* @param string $value
* @param array $options
* @return string
*/
public function make($value, array $options = [])
{
return $value;
}
/**
* Check the given plain value against a hash.
*
* @param string $value
* @param string $hashedValue
* @param array $options
* @return bool
*/
public function check($value, $hashedValue, array $options = [])
{
return $value == $hashedValue;
}
/**
* Check if the given hash has been hashed using the given options.
*
* @param string $hashedValue
* @param array $options
* @return bool
*/
public function needsRehash($hashedValue, array $options = [])
{
return false;
}
}
namespace App\Hashing;
use Illuminate\Support\ServiceProvider;
class Md5HashServiceProvider extends ServiceProvider
{
/**
* Indicates if loading of the provider is deferred.
*
* @var bool
*/
protected $defer = true;
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
$this->app->singleton('hash', function() {
return new Md5CryptHasher;
});
}
/**
* Get the services provided by the provider.
*
* @return array
*/
public function provides()
{
return ['hash'];
}
}
У вас же написано, что таблица 'apidev.orders' не существует. А в миграции имя таблицы 'order' без 's'. Добавьте в модель
class Order extends Model
{
protected $table = 'order';
protected $fillable = ['title'];
}
Выдержка из документации
Table Names
Note that we did not tell Eloquent which table to use for our Flight model. By convention, the "snake case", plural name of the class will be used as the table name unless another name is explicitly specified. So, in this case, Eloquent will assume the Flight model stores records in the flights table. You may specify a custom table by defining a table property on your model:
Начните с документации. У всех выше названых провайдеров информации достаточно. Самая простая схема, это заполнение формы на вашем сайте и отправка в шлюз платежной системы, оттуда редирект на платежную форму и после оплаты возврат на указанную страницу вашего сайта. Опционально есть опция пуша, для информирования о состоянии платежа.
Простите за оффтоп, но разве если у модели связи прописаны это всё равно не сработает и без указания ключей в миграции? Я думал раньше что эти связи в миграциях прописывают только для того чтобы облегчить поиск серверу
Только если в миграции вы указали "->onDelete('cascade');". Если вкратце связи нужны для обеспечения целостности самих данных, оптимизации запросов со стороны бд и тд.
Это собственно и ответ для первого поста. В миграции уведомлений делаете форейгн кей. Вот вам пример
$table->foreign('app_id')->references('id')->on('apps')->onDelete('cascade');
Профит близится к нулю. Редактировать тонну файлов для ваших данных утомительно. Продумайте структуру таблиц и храните в бд. В любом удобно для вас формате, желательно с возможностью поиска средствами sql для удобства. Дальше делайте свой провайдер (варианты реализаций десятки) на ваше усмотрение и инстаируете его в ларавел. И работаете с ним через DI. Можете сливать все из бд в некую структуру в файл и положить в кеш. Для вьюх делаете обертку в виде хелпера который так же работает с этим ди.
Перфекционизм это хорошо, но балансируйте между временем на разработку и времени на поддержку. То что вы предлагаете предполагает огромные затраты на поддержку, особенно фронтэнда. Здравый подход и оценка возможностей. Желаю удачи.