^(.+)\.(\d+)\.(css|js)$
^
— начало строки( )
— то, что внутри скобок, отдельно попадёт в переменные $1, $2, .. $N
.
— любой символ+
— определяет количество предшесвтующего ему: «1 или несколько».+
— один или несколько любых символов\.
— буквально точка обыкновенная, point vulgaris, без спец. значения\d
— цифра. \d+
одна или несколько цифр(css|js)
– или "css" или "js"$
— конец строки/css/main.min.682375227.css
и заменит её строкой без числа: /css/main.min.css
main.min.css
, какой там у него есть. $parameters = $matcher->match($request->getPathInfo());
$invoker = new Invoker\Invoker(null, $container);
$invoker->call($parameters['_controller'], $parameters);
$parameters = $matcher->match($request->getPathInfo());
list($class, $action) = $parameters['_controller'];
unset($parameters['_controller']);
$controller = new $class;
$controller->$action($parameters);
Вопрос1 - нужно ли всё равно передавать параметр в конструктор вызываемого контроллера или можно просто вызывать без параметров?
// Получаем объект интерфейса из любой точки приложения
$container->get(MyInterface::class);
$container->register(MyInterface::class, function () {
return new MyConcreteClass('какие то параметры');
});
Вопрос2 - где вообще надо делать $container->get('что-нибудь'); ? В самом контроллере как-то неправильно, наверное - ибо тогда всё равно зависимость. Где это делать?
interface CartRepository
{
public function add(CartItem $item);
public function getAll();
}
class SessionCartRepository implements CartRepository
{
...
}
class DbCartRepository implements CartRepository
{
...
}
class Cart
{
public function __construct(CartRepository $repository)
{
...
}
public function getTotal()
{
...
}
}
// Service provider
$container->register(CartRepository::class, function ($container) {
if ($user = $container->get('auth')->getUser()) {
$repository = new DbCartRepository($container->get('db'), $user->id)
} else {
$repository = new SessionCartRepository();
}
return $repository;
});
$container->register(Cart::class, function ($container) {
return new Cart($container->get(CartRepository::class));
});
Хочу устроиться джуном в веб-студию удаленноНе уверен, что удалённо Вы чему-то научитесь особо. Удалённо обычно работают либо матёрые профи, либо те кто не понимает, чем им всё это грозит...
Сейчас лето и хотелось бы начать зарабатывать на вебе и копить на учебуС учётом вашего стажа работы, и ограничением в несколько мес. - боюсь Вас разочаровать, но заработать сколь нибудь стоящие суммы у Вас вряд ли получится.
но обрубать мосты так сразу не хочуЕГЭ можно пересдать...
но совмещать учебу и работу вряд ли смогуЯ бы не рекомендовал пытаться их совмещать, помню одно время сам так
портфолио естьКачественное? Покажите?
Не знаю что делатьВыбрать что-то одно, либо учёбу, либо работу.
вряд ли в студию возьмут на 3 месяцаВ офис скорее всего взяли бы, особенно если не говорить им, что на 3 мес. (хотя это было бы не очень честно с Вашей стороны). Но з/п там была бы скорее всего такая... что называется "на мороженое".
Может устроиться к кому-нибудь на фриланс в помошники?Когда я хотел научиться разбирать в устройстве автомобилей - я напрашивался в помощники к кому угодно, "за бесплатно", "за еду" соглашаясь практически на любые условия.
Как начать зарабатывать на фрилансе?Примерно так:
Какие предложения и советы или варианты у вас есть?Искать работу в ближайшем офисе, если Вам предложат з/п которой хватит, что бы снять комнату + купить поесть + на проезд на работу и обратно (если поблизости студий нет) - считайте, что уже неплохо. Либо заниматься учёбой и попутно саморазвитием.
Привет! Мне 17Привет! Вам точно 17? Не считая пробелов перед знаками препинания, грамотная речь, для человека в возрасте 17 лет...
$model->load()
. Поэтому со скрытым input всё работает.$model = new Direction();
$modelLang = new DirectionLang();
if ($modelLang->load(Yii::$app->request->post()) && $model->save()) {
$modelLang->lang_id = 2;
$modelLang->direction_id = $model->id;
$modelLang->save();
var_dump($model->getErrors());
var_dump($modelLang->getErrors());
return $this->redirect(['view', 'id' => $model->id]);
}
if (employee.СanProvideService(service)) ...
public $filename;
$model = new Image();
$model->filename;
'main' => [
'class' => 'app\modules\main\MainModule',
'layout' => 'main.php',
'layoutPath' => '@app/modules/main/views/layouts',
'params' => [
'test' => 'test1',
'test2' => 'test22'
]
],
// Если указали в классе модуля public $filename
$main = Yii::$app->getModule('main');
echo $main->filename;
// Если указали параметром в конфигурационном файле.
$main = Yii::$app->getModule('main');
echo $main->params['test'];
<?php
namespace App\Controller;
use App\Entity\User;
use App\Service\UserService;
use Symfony\Component\DependencyInjection\ServiceLocator;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Symfony\Component\Security\Core\Security;
use Twig\Environment;
interface AdminControllerInterface
{
public function index(): Response;
public function read(string $id): Response;
}
class UserController implements AdminControllerInterface
{
/**
* Security - объект-helper, он содержит в себе AuthorizationCheckerInterface
*
* @var Security
*/
private $security;
/**
* @var ServiceLocator
*/
private $controllerLocators;
public function __construct(Security $security, ServiceLocator $controllerLocators)
{
$this->security = $security;
$this->controllerLocators = $controllerLocators;
}
public function index(): Response
{
$role = $this->getRole();
if (!$this->controllerLocators->has($role)) {
throw new AccessDeniedException();
}
/** @var AdminControllerInterface $controller */
$controller = $this->controllerLocators->get($role);
return $controller->index();
}
public function read(string $id): Response
{
$role = $this->getRole();
if (!$this->controllerLocators->has($role)) {
throw new AccessDeniedException();
}
/** @var AdminControllerInterface $controller */
$controller = $this->controllerLocators->get($role);
return $controller->read($id);
}
private function getRole(): string
{
// Для простоты представим, что роль у пользователя одна. Иначе искать среди ролей
// ROLE_SUPER_ADMIN и ROLE_CUSTOMER_ADMIN и возвращаем с соответствующим приоритетом
return current($this->security->getToken()->getRoles());
}
}
class SuperAdminController implements AdminControllerInterface
{
private $userService;
/**
* @var Environment
*/
private $twig;
public function __construct(
UserService $userService,
Environment $twig
) {
$this->userService = $userService;
$this->twig = $twig;
}
public function index(): Response
{
$users = $this->userService->getAll();
return new Response($this->twig->render('admin/users.html.twig', [
'users' => $users
]));
}
public function read(string $id): Response
{
$user = $this->userService->getById($id);
return new Response($this->twig->render('admin/user.html.twig', [
'user' => $user
]));
}
}
class CustomerAdminController implements AdminControllerInterface
{
private $userService;
/**
* @var Security
*/
private $security;
/**
* @var Environment
*/
private $twig;
public function __construct(
UserService $userService,
Environment $twig
) {
$this->userService = $userService;
$this->twig = $twig;
}
public function index(): Response
{
/** @var User $user */
$user = $this->security->getUser();
$users = $this->userService->findByRoleAndWorkspaceId(
User::ROLE_TEAM_MEMBER,
$user->getWorkspace()->getId()
);
return new Response($this->twig->render('user/users.html.twig', [
'users' => $users
]));
}
public function read(string $id): Response
{
$user = $this->userService->getByIdAndWorkspaceId($id);
return new Response($this->twig->render('user/user.html.twig', [
'user' => $user
]));
}
}
app.admin_controller_locator:
class: Symfony\Component\DependencyInjection\ServiceLocator
arguments:
-
ROLE_SUPER_ADMIN: '@App\Controller\SuperAdminController'
ROLE_CUSTOMER_ADMIN: '@App\Controller\CustomerAdminController'
tags: ['container.service_locator']
тяжко мне дается phpСт. 12-13 От дней же Иоанна Крестителя доныне Царство Небесное силою берется, и употребляющие усилие восхищают его...
writeValue(value: any) {
this.formControlName = value;
}
form.setValue({email: "email", password: 'passworddd'})
// или
form.patchValue({email: "email"})
this.filterForm.valueChanges
.pipe(
takeUntil(this._onDestroy$)
)
.subscribe((val) => {
console.log(val);
});
initForm() {
this.SignupReactiveForm = this.fb.group({
password: ['password', [
Validators.required,
Validators.pattern(/[A-z]/)
]
],
email: ['email', [
Validators.required, Validators.email
]
],
});
}
}
class House {
string address;
int numOfRooms;
...
House(string address, int numOfRooms)
{
this.address = address;
this.numOfRooms = numOfRooms;
}
}
House h = new House("Улица Вязов дом 13", 5);
class Dog {
string name;
string breed;
Dog(string name, string breed)
{
this.name = name;
this.breed = breed;
}
}
Dog d = new Dog("Бобик", "Бульдог")