Я новичок в PHP а также Laravel. Я следую этому уроку, чтобы добавить рекапчи поддержка страницы в моем приложении Laravel:
http://tutsnare.com/how-to-use-captcha-in-laravel-5/
В любом случае, мои сомнения не в строгости, связанной с CAPTCHA, а в отношении содержания предыдущего урока:
Как вы можете видеть это добавить этот поставщик услуг:
'providers' => [
Anhskohbo\NoCaptcha\NoCaptchaServiceProvider::class,
],
Из того, что я понял, читая официальную документацию: https://laravel.com/docs/5.4/providers
Поставщик услуг это то, что регистрирует «компонент», используемый моим приложением при запуске.
Но как именно это означает?
Я пытаюсь осуществить это, изучая предыдущий NoCaptchaServiceProvider Класс и сравнение его с документацией.
Так что это его код:
<?php
namespace Anhskohbo\NoCaptcha;
use Illuminate\Support\ServiceProvider;
class NoCaptchaServiceProvider extends ServiceProvider
{
/**
* Indicates if loading of the provider is deferred.
*
* @var bool
*/
protected $defer = false;
/**
* Bootstrap the application events.
*/
public function boot()
{
$app = $this->app;
$this->bootConfig();
$app['validator']->extend('captcha', function ($attribute, $value) use ($app) {
return $app['captcha']->verifyResponse($value, $app['request']->getClientIp());
});
if ($app->bound('form')) {
$app['form']->macro('captcha', function ($attributes = []) use ($app) {
return $app['captcha']->display($attributes, $app->getLocale());
});
}
}
/**
* Booting configure.
*/
protected function bootConfig()
{
$path = __DIR__.'/config/captcha.php';
$this->mergeConfigFrom($path, 'captcha');
if (function_exists('config_path')) {
$this->publishes([$path => config_path('captcha.php')]);
}
}
/**
* Register the service provider.
*/
public function register()
{
$this->app->singleton('captcha', function ($app) {
return new NoCaptcha(
$app['config']['captcha.secret'],
$app['config']['captcha.sitekey']
);
});
}
/**
* Get the services provided by the provider.
*
* @return array
*/
public function provides()
{
return ['captcha'];
}
}
Это содержит:
1) регистр() метод, который:
public function register()
{
$this->app->singleton('captcha', function ($app) {
return new NoCaptcha(
$app['config']['captcha.secret'],
$app['config']['captcha.sitekey']
);
});
}
Он только связывает вещи в сервисный контейнер. В этом случае требуется 2 значения, которые хранятся в .окр файл. Эти значения содержат строки re-CAPTCHA.
Я сомневаюсь: при запуске приложения Laravel вызывает регистр() метод, но что именно происходит?
Что означает этот раздел регистр() метод?
$this->app->singleton('captcha', function ($app) {
return new NoCaptcha(
$app['config']['captcha.secret'],
$app['config']['captcha.sitekey']
);
});
Кто $ this-? Я думаю, что это NoCaptchaServiceProvider экземпляр (но я не совсем уверен), это или я что-то упустил?
Что значит $ This-> приложение? приложение это метод или свойство?
Что значит $ This-> app-> синглтон ( ‘CAPTCHA,’ …..}); Я думаю, что это что-то вроде фабрики, реализующей один экземпляр чего-то …. но что именно строит? Это ** NoCaptcha пример?
Я думаю, что логика предыдущего одноэлементного построения реализуется внутренней функцией:
function ($app) {
return new NoCaptcha(
$app['config']['captcha.secret'],
$app['config']['captcha.sitekey']
);
И тут у меня есть 2 сомнения:
Первый: кто проходит $ приложение к этой функции? Это что-то вроде пустой переменной \ объекта, которая будет заполнена позже? Или это вводится каким-то образом?
Эта функция кажется логикой создания синглтона. Потому что это заложено внутри:
singleton('captcha', function ($app) {
return new NoCaptcha(
$app['config']['captcha.secret'],
$app['config']['captcha.sitekey']
);
});
Так что это значит? Это означает, что когда одноплодной () метод вызывается, эта функция, которая возвращает новый NoCaptcha объект выполнен и представляет собой логику создания моего синглтона?
Так что это означает, что в некотором роде PHP реализовать парадигма функционального программирования?
$ this- ссылается на NoCaptchaServiceProvider.
NoCaptchaServiceProvider расширяет поставщика услуг. Который имеет свойство $ приложение, который является примером \ Осветить \ Контракты \ Foundation \ Application ака приложение Laravel.
Когда создается новый поставщик услуг, Laravel внедряет экземпляр приложения в конструктор поставщиков услуг:
public function __construct($app)
{
$this->app = $app;
}
Так с $this->app
вы получаете экземпляр приложения Laravel.
экземпляр приложения расширяет Контейнер класс, который затем имеет метод одноплодной (). Который просто регистрирует разделяемую привязку в контейнере.
public function singleton($abstract, $concrete = null)
{
$this->bind($abstract, $concrete, true);
}
РЕДАКТИРОВАТЬ:
Обратите внимание, что эти пространства имен относятся к контракту, а не к фактическому классу.
Контейнер службы выполняет привязку интерфейса к данной реализации. Контракт (или интерфейс) просто говорит, какие методы класс должен реализовать.
Например: у нас есть UserRepository, у которого есть UserRepositoryContract, который сообщает, что в определенной реализации должны быть функции all () и find (). Мы связываем этот Контракт с EloquentUserRepository, который является просто классом, который реализует эти методы и возвращает all () и find () с Eloquent.
Теперь единственное, что нам нужно сделать, это установить привязку и использовать UserRepositoryContract в качестве экземпляра вместо EloquentUserRepository.
Если позже мы захотим использовать Redis, нам нужно только создать класс RedisUserRepository, который реализует те же методы, изменить привязку в контейнере и вуаля. Теперь все экземпляры UserRepositoryContract будут использовать Redis вместо Eloquent.
Других решений пока нет …